我正在使用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);
我得到了这些奇怪的角色:
在 字符集 的 Proyect属性 中,我选择的选项是 使用Unicode字符集 。
我认为这必须有一个非常简单的解决方案。我会为任何方向感到高兴。
答案 0 :(得分:4)
ANSI / ASCII文本解释为Unicode / UTF-16LE tends to look like Chinese。
您已在项目设置中定义了UNICODE,因此CreateWindow
和SendMessage
将是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]);
}