錯誤信息
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 窄字符數組,**類型不匹配**,無法隱式轉換。
解決方案 (三選一)
方案一:修改項目字符集為「多字節字符集」 (最快,適合舊代碼遷移)
- 右鍵項目 → **Properties (屬性)**。
- **Configuration Properties (配置屬性)** → **General (常規)**。
- **Character Set (字符集)** → 選擇 **Use Multi-Byte Character Set (使用多字節字符集)**。
- 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` 後綴。
相關類型對照表
| 字符集設置 | TCHAR | LPCTSTR | SetWindowText | 字符串字面量 |
| Unicode (默認) | wchar_t | const wchar_t* | SetWindowTextW | L"text" 或 _T("text") |
| Multi-Byte (MBCS) | char | const char* | SetWindowTextA | "text" 或 _T("text") |