gpt4 book ai didi

c++ - 如何使用动态 unicode 文本设置 Win32 工具提示控件?

转载 作者:太空宇宙 更新时间:2023-11-04 15:28:51 25 4
gpt4 key购买 nike

我在使用 unicode 格式的动态文本提供 Win32 工具提示控件时遇到了一些问题。我使用以下代码来设置控件:

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 中提供工具提示文本,它就可以正常工作。但是,我希望文本是动态的,所以我将 ti.lpszText 设置为 LPSTR_TEXTCALLBACKW 并在我的 WindowProc() 中处理回调,如下所示:

...
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(至少现在还没有)。由于 _UNICODE 定义用于选择各种函数和数据结构的 *W 版本,我希望我可以通过在我的代码中显式使用这些来实现相同的结果,如上所示。

最佳答案

您收到 TTN_GETDISPINFO 通知代码而不是 TTN_GETDISPINFOW 的事实表明您的项目设置为“使用多字节字符集”。

检查项目属性页:“配置属性”->“常规”->“字符集”
此属性应设置为“使用 Unicode 字符集”。

关于c++ - 如何使用动态 unicode 文本设置 Win32 工具提示控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/992919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com