Unicode版本Tooltip控件调用SendMessageW执行TTM_ADDTOOLW返回FALSE的问题求助
Unicode版本Tooltip控件调用SendMessageW执行TTM_ADDTOOLW返回FALSE的问题求助
大家好,我现在碰到一个Tooltip控件的棘手问题,想请各位帮忙看看。
我原本写的ANSI版本Tooltip代码是可以正常工作的,能正确显示提示框:
void Tooltip::init() { InitCommonControls(); hwnd = CreateWindowExA(WS_EX_TOPMOST, TOOLTIPS_CLASSA, nullptr, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, 0, 0, 0, 0, Game::windowHWND, nullptr, GetModuleHandleA(nullptr), nullptr); //static inline HWND hwnd; in header } TTTOOLINFOA lastTooltip = {}; void Tooltip::showText(const std::wstring &text) { auto conv = Helpers::utf8EncodeTo1251(text); if(current == conv) { //static inline std::string current; in header return; } else if(text.empty()){ SendMessageA(hwnd, TTM_DELTOOLA, 0, (LPARAM)&lastTooltip); current.clear(); return; } current = conv; SendMessageA(hwnd, TTM_DELTOOLA, 0, (LPARAM)&lastTooltip); lastTooltip = {}; lastTooltip.cbSize = sizeof(TTTOOLINFOA); lastTooltip.uFlags = TTF_SUBCLASS; lastTooltip.hwnd = Game::windowHWND; lastTooltip.lpszText = (char*) current.data(); GetClientRect(Game::windowHWND, &lastTooltip.rect); SendMessageA(hwnd, TTM_ADDTOOLA, 0, (LPARAM)&lastTooltip); //result == 1 (TRUE) }
但因为要支持西里尔文文本,如果用户没设置俄语区域,ANSI版本的文本会乱码,所以我必须改用Unicode版本的Tooltip。可是改写后的代码里,SendMessageW调用TTM_ADDTOOLW总是返回FALSE,tooltip根本不显示:
void Tooltip::init() { InitCommonControls(); hwnd = CreateWindowExW(WS_EX_TOPMOST, TOOLTIPS_CLASSW, nullptr, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, 0, 0, 0, 0, Game::windowHWND, nullptr, GetModuleHandleA(nullptr), nullptr); } TTTOOLINFOW lastTooltip = {}; void Tooltip::showText(const std::wstring &text) { if(current == text) { //current is now std::wstring return; } else if(text.empty()){ SendMessageW(hwnd, TTM_DELTOOLW, 0, (LPARAM)&lastTooltip); current.clear(); return; } current = text; SendMessageW(hwnd, TTM_DELTOOLW, 0, (LPARAM)&lastTooltip); lastTooltip = {}; lastTooltip.cbSize = sizeof(TTTOOLINFOW); lastTooltip.uFlags = TTF_SUBCLASS; lastTooltip.hwnd = Game::windowHWND; lastTooltip.lpszText = (wchar_t*) text.data(); GetClientRect(Game::windowHWND, &lastTooltip.rect); SendMessageW(hwnd, TTM_ADDTOOLW, 0, (LPARAM)&lastTooltip); //result == 0 (FALSE, no tooltip shown) }
我已经尝试过设置/D_UNICODE和/DUNICODE编译选项,但问题依然存在——ANSI版本的TTM_ADDTOOLA配合SendMessageA能正常工作,可Unicode版本就是不行。有没有大佬知道这是哪里出问题了?
内容来源于stack exchange
相关产品推荐
相关产品推荐

