winapi奇怪的字符const char *

时间:2018-05-06 19:57:37

标签: visual-studio winapi configuration character-encoding

我正在使用Visual Studio 2015上的WinAPI项目,当我初始化这个数组时:

const char* Filtros[] = {
        "Media", "Media Ponderada", "Mediana", "Gaussiano",
        "Ecualización Simple", "Ecualización Unif.", "Suavizado Conservador", "Laplasiano"
    };

并将其绑定到列表框:

CreateWindow(TEXT("COMBOBOX"), TEXT(""),
    CBS_DROPDOWNLIST | WS_VISIBLE | WS_CHILD,
    CB_x, CB_y, CB_width, CB_heigth,
    hwnd, (HMENU)CB_FILTROS, NULL, NULL);

for (int i = 0; i < nFiltros; i++) {
    SendDlgItemMessage(hwnd, CB_FILTROS, CB_ADDSTRING, 0, (LPARAM)Filtros[i]);
}
SendDlgItemMessage(hwnd, CB_FILTROS, CB_SETCURSEL, (WPARAM)3, (LPARAM)0);

我得到了这些奇怪的角色:

Strange chracters

字符集 Proyect属性 中,我选择的选项是 使用Unicode字符集

我认为这必须有一个非常简单的解决方案。我会为任何方向感到高兴。

2 个答案:

答案 0 :(得分:4)

ANSI / ASCII文本解释为Unicode / UTF-16LE tends to look like Chinese

您已在项目设置中定义了UNICODE,因此CreateWindowSendMessage将是Unicode,但您传递的是ANSI字符串。由于C强制转换,编译器无法捕获它。

使用LPCTSTR Filtros[]const wchar_t* Filtros[]以及TEXT("...")L"..."将字符串设为Unicode。

您也可以通过将(LPARAM)Filtros[i]替换为(LPARAM)const_cast<LPCTSTR>(Filtros[i])来使转换类型安全,如果您传递错误的字符串类型,编译器会抱怨......

答案 1 :(得分:0)

尝试一下,类型不是const char *,类型也是const wchar_t *:

const wchar_t* items[] = { L"First item", L"Second item", 
    L"Internet", L"Solaris", L"Arch" };

并使用自己的代码创建一个下拉按钮列表:

 HWND  hwndCombo = CreateWindowW(L"Combobox", 
                NULL, 
                WS_CHILD | WS_VISIBLE | 
                CBS_DROPDOWNLIST,
                10, 10, 120, 110, hwnd, NULL, g_hinst, NULL);   

for (int i = 0; i < 4; i++ )
 {

              SendMessageW(hwndCombo, CB_ADDSTRING, 0, (LPARAM) items[i]);
   }