我想创建一个简单的tooltip
,当用户将鼠标悬停在button
上时会弹出。
为此,我研究了this example from MSDN。
当我第一次时间悬停在button
上时,一切正常,但在此之后tooltip
永远再次显示( I已检查HWND
的{{1}}和tooltip
的返回值,且没有错误)。
我试图在线找到解决方案,但都失败了。我发现可能有用的唯一资源是this tutorial,但它建议继承控件以便将鼠标消息转发到SendMessage( ..., TTM_ADDTOOL, ... )
control-I 不会接受此类解决方案,因为我相信我要求的是 tooltip
控件提供的基本功能。
按照link member Stuart suggested*的说明,我能够部分解决问题。现在点击主窗口的客户区后显示tooltip
,然后将鼠标悬停在按钮上。
但是,点击按钮后 tooltip
再也不会出现。
通过互联网浏览,我发现this example并在添加这些指令之后:
tooltip
问题似乎消失了。现在我可以点击一个按钮,将鼠标悬停在编辑控件上,编辑控件#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")
就会出现。
然而,点击按钮,然后点击主窗口的客户区,然后再次悬停按钮,tooltip
没有显示!
然后我继续在互联网上搜索,并在 CodeProject 上找到this article,它完全符合我的需要。
所以我已经开始分析第一个例子和本文的源代码。我无法看出差异。但是,外观不同!看来文章没有使用tooltip
,并且考虑到提及的Visual Styles
成员 Stuart ,我开始怀疑这个< strong>可能是明显的问题。
所以我尝试在没有上面提交的第一个MSDN article
的情况下编译所有程序,但在我的测试应用程序(创建为pragma comment
)default Win32 project
的程序中失败,在示例程序中我收到错误InitCommonControlsEx
,文章应用程序无法创建Failed to save the updated manifest to the file ".\Debug\foosyerdoos tooltip.exe.embed.manifest". The parameter is incorrect.
控件。
创建新的空白项目后,以及在复制第一个示例中的代码后 - 仅此次没有tooltip
- pragma comment
无法同时添加SendMessage
个。
因此,如果没有首先提交tooltip
,我就无法使用pragma comment
控件,或者看起来如此。
以下是创建说明问题的最小示例的说明:
tooltip
; default Win32 project
添加下面的MS Visual Studio
处理程序:
WM_CREATE
编译并运行 - 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;
应显示在第一次悬停,但永远不会。
我使用tooltip
处理Windows XP
。
MS Visual Studio Express 2008
已启用,我已关联Visual Styles
并已comctl32.lib
成员的INITCOMMONCONTROLSEX
成员dwICC
。
在我的笔记本电脑上测试了这个相同的代码片段后,ICC_STANDARD_CLASSES | ICC_TAB_CLASSES | ICC_BAR_CLASSES
我可以确认一切正常。这是Windows 7
我猜的问题......
我的问题很简单:
如何调整我的代码,以便Windows XP
每次用户悬停在tooltip
上时显示?
谢谢。
最好的问候。
答案 0 :(得分:2)
您正在追逐错误的问题,此行为是针对工具提示设计的。它所使用的确切规则没有记录在我所知道的任何地方,我从未发现任何需要对其进行逆向工程,所以我只能告诉你我所见过的。
该功能背后的更大理念是避免让用户知道他已经知道的信息。工具提示非常适合作为提示,只是一小部分信息对于程序的正常运行并不重要。它似乎是通过跟踪已经显示的工具的提示来实现的,并且不如果使用该工具则再次显示它。这当然很有意义,用户在使用它之后不需要提醒工具做什么。
没有消息要重置&#34;提示已显示&#34;州。它会在显示另一个工具的提示时重置。改变尖端也会重置它。
我重申,你应该不尝试解决这个问题。这种行为非常明智。如果它很重要,那么你必须自己控制并显示提示,TTM_ACTIVATE消息。
答案 1 :(得分:1)
您的代码可以在我的笔记本电脑上使用Windows 7,正如您所期望的那样。
由于这是微软的例子,我非常怀疑其中存在错误。
遵循夏洛克·福尔摩斯的建议:“一旦你消除了不可能的事物,剩下的一切,无论多么不可能,都是真理。”由于代码有效,因此它必须是Windows XP的问题,可以通过上述对您的问题的后续评论进行确认。
我会检查是否已下载所有自动更新,或者是否会重新安装并再次尝试使用您的代码。您还可以在运行Windows XP的其他计算机上测试您的代码,看看您自己的问题是否存在。
祝你好运。