Win32ツールチップコントロールにUnicode形式の動的テキストを提供するのに問題があります。次のコードを使用してコントロールを設定します。
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(INITCOMMONCONTROLSEX);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);
HWND hwnd_tip = CreateWindowExW(0, TOOLTIPS_CLASSW, NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hinst, NULL
);
SetWindowPos(hwnd_tip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
TOOLINFOW ti;
memset(&ti, 0, sizeof(TOOLINFOW));
ti.cbSize = sizeof(TOOLINFOW);
ti.hwnd = hwnd_main;
ti.uId = (UINT) hwnd_control;
ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
ti.lpszText = L"This tip is shown correctly, including unicode characters.";
SendMessageW(hwnd_tip, TTM_ADDTOOLW, 0, (LPARAM) &ti);
でツールチップテキストを提供する限り、これは正常に機能しますti.lpszText
。ただし、テキストを動的にしたいので、代わりに次のようにWindowProc()でコールバックを設定ti.lpszText
しLPSTR_TEXTCALLBACKW
て処理します。
...
case WM_NOTIFY:
{
NMHDR *nm = (NMHDR *) lParam;
switch (nm->code)
{
case TTN_GETDISPINFOW:
{
static std::wstring tip_string = L"Some random unicode string.";
NMTTDISPINFOW *nmtdi = (NMTTDISPINFOW *) lParam;
nmtdi->lpszText = (LPWSTR) tip_string.c_str();
}
break;
}
}
break;
...
TTN_GETDISPINOW
私はメッセージを受け取らないので、これは機能しません。(注:TTN_GETDISPINFO
代わりに処理NMTTDISPINFO
してchar配列を提供するために使用すると機能しますが、Unicodeサポートはありません...)
ここでのセットアップやメッセージ処理で何か問題が発生していると思いますか?それを適切に行う方法について何か提案はありますか?
更新
また、私のプロジェクトはunicoeモードでコンパイルされていないことに注意してください(つまり、_UNICODEが定義されておらず、プロジェクトはマルチバイト文字セットを使用するように設定されています)。これは意図的なものであり、アプリケーション全体をユニコード対応に書き直す必要はありません(少なくともまだ)。_UNICODE定義は、さまざまな関数とデータ構造の* Wバージョンを選択するために使用されるため、上記のように、コードでこれらを明示的に使用することで同じ結果が得られることを期待していました。