我想创建一个简单的“工具提示”,当用户悬停在“按钮”上时会弹出。
为此,我学习了MSDN的这个示例。
当我第一次悬停在“按钮”上时,一切都正常,但之后“工具提示”再也不会出现(我已经检查了“工具提示”的HWND和SendMessage(..., TTM_ADDTOOL, ...)的返回值,没有错误)。
我试图在网上找到解决方案,但都失败了。我找到的唯一可能有用的资源是this tutorial,但它建议通过子类化控件以将鼠标消息传递到
问题似乎消失了。现在我可以点击一个按钮,悬停在编辑控件上并且编辑控件的
然而,在点击按钮,然后点击主窗口的客户区域,并再次悬停在按钮上时,它的
然后我继续在互联网上搜索,并在CodeProject上找到了this article,它正好满足我的需求。
所以我开始分析第一个示例和这篇文章的源代码。我无法看到差异。但是,外观不同!看起来这篇文章没有使用
所以我尝试编译所有程序,而不使用上面提交的第一个
在创建新的空白项目之后,并从第一个示例中复制代码 - 这次没有使用
因此,似乎如果没有上面提交的第一个
以下是创建说明最小化的示例以说明问题的指导:
Visual Styles 已启用,我已链接 comctl32.lib 并初始化了 INITCOMMONCONTROLSEX 结构体的 dwICC 成员,值为 ICC_STANDARD_CLASSES | ICC_TAB_CLASSES | ICC_BAR_CLASSES。
为此,我学习了MSDN的这个示例。
当我第一次悬停在“按钮”上时,一切都正常,但之后“工具提示”再也不会出现(我已经检查了“工具提示”的HWND和SendMessage(..., TTM_ADDTOOL, ...)的返回值,没有错误)。
我试图在网上找到解决方案,但都失败了。我找到的唯一可能有用的资源是this tutorial,但它建议通过子类化控件以将鼠标消息传递到
tooltip
控件-我不会接受这种类型的解决方案,因为我相信tooltip
控件提供了基本功能。
2014年1月21日编辑:
根据会员斯图尔特建议的指示*,我已经部分解决了问题。现在,在单击主窗口客户区域然后将鼠标悬停回按钮上后,工具提示
会显示。
但是,在我单击按钮之后,工具提示
再也不会出现。
通过浏览互联网,我找到了这个示例,并添加了以下指令:
#pragma comment( linker, "/manifestdependency:\"type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' \
language='*'\"")
#pragma comment( lib, "comctl32.lib")
问题似乎消失了。现在我可以点击一个按钮,悬停在编辑控件上并且编辑控件的
提示
会出现。然而,在点击按钮,然后点击主窗口的客户区域,并再次悬停在按钮上时,它的
提示
没有显示!然后我继续在互联网上搜索,并在CodeProject上找到了this article,它正好满足我的需求。
所以我开始分析第一个示例和这篇文章的源代码。我无法看到差异。但是,外观不同!看起来这篇文章没有使用
Visual Styles
,考虑到MSDN文章
成员Stuart提到的内容,我开始怀疑这可能是清单问题。所以我尝试编译所有程序,而不使用上面提交的第一个
pragma comment
,但在我的测试应用程序中(创建为默认Win32项目
),InitCommonControlsEx
失败了,在示例程序中,我得到了错误消息无法将更新的清单保存到文件“.\Debug\foosyerdoos tooltip.exe.embed.manifest”中。参数不正确。
,文章应用程序无法创建tooltip
控件。在创建新的空白项目之后,并从第一个示例中复制代码 - 这次没有使用
pragma comment
- SendMessage
未能添加两个tooltip
。因此,似乎如果没有上面提交的第一个
pragma comment
,我就不能使用tooltip
控件。
以下是创建说明最小化的示例以说明问题的指导:
创建最小化示例的步骤:
- Create
default Win32 project
inMS Visual Studio
; Add the bellow
WM_CREATE
handler:case WM_CREATE: { HWND hButton = CreateWindowEx( 0, L"Button", L"test me!", WS_CHILD | WS_VISIBLE | WS_BORDER | BS_PUSHBUTTON, 50, 150, 150, 25, hWnd, (HMENU)8003, hInst, 0 ); HWND hwndTip = CreateWindowEx( NULL, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, NULL, hInst, NULL ); // Associate the tooltip with the tool. TOOLINFO toolInfo = { 0 }; toolInfo.cbSize = sizeof(toolInfo); toolInfo.hwnd = hWnd; toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS; toolInfo.uId = (UINT_PTR)hButton; toolInfo.lpszText = L"test 1"; SendMessage( hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo ); } return 0L;
Compile and run-
tooltip
should show on first hover, but never again.
Visual Styles 已启用,我已链接 comctl32.lib 并初始化了 INITCOMMONCONTROLSEX 结构体的 dwICC 成员,值为 ICC_STANDARD_CLASSES | ICC_TAB_CLASSES | ICC_BAR_CLASSES。
编辑(2014年1月31日):
在我的笔记本电脑上测试了这个代码片段后,它可以在Windows 7
上正常运行。我想这就是我的Windows XP
存在的问题...
编辑结束:
我的问题非常简单:
如何调整我的代码,使得每次用户悬停在上时都会显示tooltip
?
谢谢。
最好的问候。
Windows XP
上试过了吗? - AlwaysLearningNewStuffpragma comment
移动到了stdafx.h
中,并放置在#include<windows.h>
和include<commctrl.h>
之下。我的下一个问题是当我点击按钮时-tooltip
再也不会出现了。我希望它在用户悬停在按钮上时随时出现。你有任何想法如何实现这个吗?感谢你的帮助和部分解决我的问题。最好的问候。 - AlwaysLearningNewStuff