我的Windows上的代码页设置为ANSI(Latin1,Windows-1252) 我用CreateFont创建一个字体,并在fdwCharSet
中传递RUSSIAN_CHARSET这就是我的体验:
为什么呢?何时考虑字体的charset参数以及何时忽略它?我可以强制Windows控件使用字体的字符集吗?
答案 0 :(得分:1)
您必须将文本转换为unicode并调用SetWindowTextW()而不是SetWindowTextA()。
确保窗口的类已注册RegisterClassW()而不是RegisterClassA()。这是真正决定窗口是否为unicode的原因。您可以使用IsWindowUnicode()来验证窗口实际上是unicode。
确保将未处理的邮件传递给DefWindowProcW()而不是DefWindowProcA()。
或者,如果窗口是对话框,只需确保使用CreateDialogW()或DialogBoxParamW()创建它。
答案 1 :(得分:0)
>我可以强制Windows控件使用字体的字符集吗?
AFAIK不,你不能。
SetWindowTextA只是将参数转换为Unicode,然后调用SetWindowTextW:windows kernel,shell和GDI都是unicode。
要将参数转换为Unicode,SetWindowTextA使用Window的区域选项(“非Unicode程序的语言”)中的设置。
答案 2 :(得分:0)
以下是发生的事情:
"\xC4\xEE\xE1\xF0\xEE\xE5 xF3\xF2\xF0\xEE"
。我尝试用最小的方法来做你需要的,但我失败了。我的第一个想法是自己进行转换并直接调用SetWindowTextW:
void SetWindowTextRussian(HWND hwnd, char *pszCyrillic) {
const int cchCyrillic = ::lstrlen(pszCyrillic);
const int cchUnicode = 4 * cchCyrillic; // worst case
WCHAR *pszUnicode = new WCHAR[cchUnicode];
// See: http://msdn.microsoft.com/en-us/library/dd317756(v=vs.85).aspx
const UINT CP_CYRILLIC = 1251;
if (::MultiByteToWideChar(CP_CYRILLIC, 0, pszCyrillic, -1,
pszUnicode, cchUnicode) > 0) {
::SetWindowTextW(hwnd, pszUnicode);
}
delete [] pszUnicode;
}
但这不起作用。我怀疑,由于窗口是作为ANSI窗口创建的,Unicode字符串将转换回ANSI(再次假设错误的代码页),然后您得到问号而不是拉丁文废话。
我认为你将不得不转换为Unicode应用程序,或者仅在默认代码页设置为1251的情况下运行。
更新:如果您控制窗口的创建(例如,您直接调用CreateWindow而不是让对话框实例化控件),那么您可以通过直接调用CreateWindowW来完成上述工作并为重要的控件创建一个Unicode窗口。
答案 3 :(得分:0)
考虑挂接gdi32full.dll GetCodePage以选择所需的代码页。例如CP_UTF8。它具有单个指针参数,返回单个DWORD(代码页)和stdcall调用约定。