首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Visual Studio 2008 字符集設置導致 SetWindowText 編譯錯誤的解決

     編輯:程式設計綜合問答

錯誤信息

error C2664: “CWnd::SetWindowTextW”: 不能將參數 1 從“char [20]”轉換為“LPCTSTR”

根本原因

VS2008 默認項目字符集為 **Unicode** (`_UNICODE` 和 `UNICODE` 宏定義)。在此模式下:

  • `TCHAR` 映射為 `wchar_t`。
  • `LPCTSTR` 映射為 `const wchar_t*`。
  • `SetWindowText` 宏展開為 `SetWindowTextW` (寬字符版)。
  • 代碼中 `char cc[20]` 是 ANSI 窄字符數組,**類型不匹配**,無法隱式轉換。

解決方案 (三選一)

方案一:修改項目字符集為「多字節字符集」 (最快,適合舊代碼遷移)

  1. 右鍵項目 → **Properties (屬性)**。
  2. **Configuration Properties (配置屬性)** → **General (常規)**。
  3. **Character Set (字符集)** → 選擇 **Use Multi-Byte Character Set (使用多字節字符集)**。
  4. Apply / OK,重新編譯。

此時 `TCHAR` = `char`,`SetWindowText` = `SetWindowTextA`,`char[]` 完美匹配。

方案二:代碼適配 Unicode (推薦,現代標準)

  • 使用 `TCHAR` / `_T()` 宏定義字符串:
    `TCHAR cc[20]; _stprintf_s(cc, _T("%.0f"), aa);`
  • 或顯式調用寬字符版:
    `WCHAR cc[20]; swprintf_s(cc, L"%.0f", aa);`
    `GetDlgItem(IDC_STATIC_BANG)->SetWindowTextW(cc);`
  • 所有字符串字面量加 `L` 前綴或 `_T()` 包裹。

方案三:顯式調用 ANSI 版 API (不推薦,僅作臨時過渡)

char cc[20];
sprintf(cc, "%.0f", aa);
GetDlgItem(IDC_STATIC_BANG)->SetWindowTextA(cc); // 強制調用 ANSI 版

遷移建議

  • 新項目:強制使用 **Unicode** (方案二),國際化、性能、系統 API 一致性最佳。
  • 維護老代碼:若代碼量大、無國際化需求、第三方庫僅支持 ANSI,暫用 **方案一** 降低改造成本,但需規劃逐步遷移至 Unicode。
  • 混合調用:代碼中統一用 `TCHAR`/`_T()`,具體調用 `SetWindowText` (宏),由字符集設置決定調用 A/W 版,避免顯式 `A`/`W` 後綴。

相關類型對照表

字符集設置TCHARLPCTSTRSetWindowText字符串字面量
Unicode (默認)wchar_tconst wchar_t*SetWindowTextWL"text" 或 _T("text")
Multi-Byte (MBCS)charconst char*SetWindowTextA"text" 或 _T("text")
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved