Win32 Edit 打印不正确的字符
Win32 Edit printing incorrect characters
我正在使用 Win32 编辑器来显示调试信息,我已将编辑器连同我的基本 GUI 的其余部分放在 class 中。但是,当我向编辑输出任何内容时,它会显示“????????????????????????????”。我认为错误出在我的 MyGUI::append(LPCSTR)
方法上,尽管它在过去一直运行良好。任何 comments/ideas/solutions 将不胜感激。如果我需要 post 所有与我的 GUI 有关的代码 class 请告诉我。
我的 class 位于命名空间 Interface
中,连同独立的 WindowProcedure
函数,我在使用 WNDCLASSEX
对象注册应用程序时调用它。
win32 编辑未在 WindowProcedure
中的 WM_CREATE
句柄中创建(因为它可能应该是),因为我无法将函数放入我的 GUI class。
创建编辑的方法:
HWND createEdit( HINSTANCE hInst, HWND hwnd, int appBott, int appTop ){
return CreateWindowEx( WS_EX_APPWINDOW,
TEXT("EDIT"), TEXT(""),
WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | ES_MULTILINE| WS_VSCROLL | WS_HSCROLL,
10, 10, appBott-25, appTop-50,
hwnd,
(HMENU) 102,
hInst,
NULL );
}
在 'guiCreate()' 方法中使用如下:
HWND hEdit = createEdit( hInst, hWin, appWidth, appHeight );
在编辑中显示文本的方法:
void Interface::MyGUI::append( LPCSTR text ){
if( created && !stopAll ){
int TextLen = SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0);
SendMessageW(hEdit, EM_SETSEL, (WPARAM)TextLen, (LPARAM)TextLen);
SendMessageW(hEdit, EM_REPLACESEL, FALSE, (LPARAM) text);
}
}
在主程序中用作:
MyGUI form(); //initialize form
form.append( (LPCSTR)"Example text\n" );
输入文字:'Example text.\n'
显示文字:'??????????????我'
您似乎以 ANSI 为目标。在那种情况下,不要调用 SendMessageW
,调用 SendMessageA
甚至 SendMessage
并将其扩展为 SendMessageA
.
您调用 SendMessageW
但传递的是 ANSI 编码文本。当您致电 SendMessageW
时,您承诺发送 UTF-16 编码的文本。
但是,我认为您应该停止以 ANSI 为目标。而是以 Unicode 为目标。停止使用 TEXT()
宏并为字符串文字使用 L
前缀。并停止转换字符串类型。 (LPCSTR)
演员是在自找麻烦。当你这样转换时,你告诉编译器你比它更了解。通常情况并非如此。
我正在使用 Win32 编辑器来显示调试信息,我已将编辑器连同我的基本 GUI 的其余部分放在 class 中。但是,当我向编辑输出任何内容时,它会显示“????????????????????????????”。我认为错误出在我的 MyGUI::append(LPCSTR)
方法上,尽管它在过去一直运行良好。任何 comments/ideas/solutions 将不胜感激。如果我需要 post 所有与我的 GUI 有关的代码 class 请告诉我。
我的 class 位于命名空间 Interface
中,连同独立的 WindowProcedure
函数,我在使用 WNDCLASSEX
对象注册应用程序时调用它。
win32 编辑未在 WindowProcedure
中的 WM_CREATE
句柄中创建(因为它可能应该是),因为我无法将函数放入我的 GUI class。
创建编辑的方法:
HWND createEdit( HINSTANCE hInst, HWND hwnd, int appBott, int appTop ){
return CreateWindowEx( WS_EX_APPWINDOW,
TEXT("EDIT"), TEXT(""),
WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | ES_MULTILINE| WS_VSCROLL | WS_HSCROLL,
10, 10, appBott-25, appTop-50,
hwnd,
(HMENU) 102,
hInst,
NULL );
}
在 'guiCreate()' 方法中使用如下: HWND hEdit = createEdit( hInst, hWin, appWidth, appHeight );
在编辑中显示文本的方法:
void Interface::MyGUI::append( LPCSTR text ){
if( created && !stopAll ){
int TextLen = SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0);
SendMessageW(hEdit, EM_SETSEL, (WPARAM)TextLen, (LPARAM)TextLen);
SendMessageW(hEdit, EM_REPLACESEL, FALSE, (LPARAM) text);
}
}
在主程序中用作:
MyGUI form(); //initialize form
form.append( (LPCSTR)"Example text\n" );
输入文字:'Example text.\n' 显示文字:'??????????????我'
您似乎以 ANSI 为目标。在那种情况下,不要调用 SendMessageW
,调用 SendMessageA
甚至 SendMessage
并将其扩展为 SendMessageA
.
您调用 SendMessageW
但传递的是 ANSI 编码文本。当您致电 SendMessageW
时,您承诺发送 UTF-16 编码的文本。
但是,我认为您应该停止以 ANSI 为目标。而是以 Unicode 为目标。停止使用 TEXT()
宏并为字符串文字使用 L
前缀。并停止转换字符串类型。 (LPCSTR)
演员是在自找麻烦。当你这样转换时,你告诉编译器你比它更了解。通常情况并非如此。