は、Unicodeの例である:私は、簡潔のためにのためにWin32アプリケーションを使用することを避ける:コントロールからUnicodeテキストを正しく取得する方法は?ここ
メインで、私は、それからテキストを取得するためのbutton
をedit
コントロールを作成し、押されたときlistbox
に追加します。だから私はstruct MSG
のオブジェクトを使用し、whileループでブロックpeeking
メッセージキューからのメッセージをブロックしました。
int main(){
// An edit control where I can add any unicode text to.
HWND hEdit = CreateWindowExW(WS_EX_CLIENTEDGE,
L"Edit", L"你好! 你好吗?", WS_BORDER | WS_VISIBLE | WS_SYSMENU,
200, 100, 250, 70, 0, 0, GetModuleHandle(NULL), NULL);
// A listobx to receive the content of the edit control when pressing the button get text.
HWND hLstBx = CreateWindowExW(WS_EX_CLIENTEDGE,
L"Listbox", NULL, WS_BORDER | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
500, 100, 170, 400, 0, 0, GetModuleHandle(NULL), NULL);
// A button when pressed adds the content of the edit to the listbox.
HWND hGetText = CreateWindowExW(WS_EX_CLIENTEDGE,
L"Button", L"中文", WS_BORDER | WS_VISIBLE,
450, 300, 100, 70, 0, 0, GetModuleHandle(NULL), NULL);
// msg struct to pass to GetMessage to receive the messages from the queue.
MSG msg;
// blocking and getting messages from the queue.
while (GetMessageW(&msg, 0, 0, 0)) {
// some virtual keys translation.
TranslateMessage(&msg);
// sending the message to the specified window.
DispatchMessageW(&msg);
// Now after the messages sent to the target Window I check which control the message has been passed to, So if it is the button then:
if (msg.message == WM_LBUTTONDOWN &&
msg.hwnd == hGetText) {
std::wstring wstrBuff;
int txtLen = SendMessageW(hEdit, WM_GETTEXTLENGTH, 0, 0);
// SendMessageW(hEdit, WM_GETTEXT, txtLen + 1, (LPARAM)wstrBuff.c_str());
// MessageBoxW(0, wstrBuff.c_str(), 0, 0);
wchar_t lpTxt[MAX_PATH];
SendMessageW(hEdit, WM_GETTEXT, MAX_PATH, (LPARAM)lpTxt);
SendMessageW(hLstBx, LB_ADDSTRING, 0, (LPARAM)lpTxt);
MessageBoxW(0, lpTxt, L"你好! 你好吗?", 0);
//delete[]lpTxt;
}
}
std::wcout << std::endl << std::endl;
std::wcin.get();
return 0;
}
すべてのものは除いて正常に動作します:I上記I非コメント行は私にtxtLen
を示すアサーションメッセージとエディットコントロールのテキストの大きさに直面して実行時エラーを取得する場合。これは、いくつかの文字列が重なっているためですか?
小さなテキストを入力しても問題ありませんが、約14文字のテキストでエラーが発生します。
も正しい方法は
SendMessageW()
からstd::wstring.c_str()
がテキストを取得するために渡すということですか?最後の質問1つ:コントロールからUnicodeテキストを正確かつ効果的に取得する方法動的メモリで
LPWSTR
を使用する方法:スタックを使い果たしたくありません。NB:ソースファイルを
utf8 /BOM
として保存しましたが、読めない文字があります。それについて私を助けてくれたメンバーに感謝します。
@Ron:私はそれを試してみます。ありがとう。 – WonFeiHong
@Ron:いいえ、問題は解決しません。 – WonFeiHong
'lpTxt'配列は' new 'で動的に割り当てられていないので、削除する必要はありません。 –