单击按钮后,工具提示永远不会再显示

时间:2014-01-20 15:56:02

标签: c++ winapi tooltip

我想创建一个简单的tooltip,当用户将鼠标悬停在button上时会弹出。

为此,我研究了this example from MSDN

当我第一次时间悬停在button上时,一切正常,但在此之后tooltip 永远再次显示( I已检查HWND的{​​{1}}和tooltip的返回值,且没有错误)。

我试图在线找到解决方案,但都失败了。我发现可能有用的唯一资源是this tutorial,但它建议继承控件以便将鼠标消息转发到SendMessage( ..., TTM_ADDTOOL, ... ) control-I 不会接受此类解决方案,因为我相信我要求的是 tooltip控件提供的基本功能。


2014年1月21日编辑:

按照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 commentdefault 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控件,或者看起来如此。

编辑结束


以下是创建说明问题的最小示例的说明:

  1. tooltip;
  2. 中创建default Win32 project
  3. 添加下面的MS Visual Studio处理程序:

    WM_CREATE
  4. 编译并运行 - 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; 应显示在第一次悬停,但永远不会

  5. 我使用tooltip处理Windows XP

    MS Visual Studio Express 2008已启用,我已关联Visual Styles并已comctl32.lib成员的INITCOMMONCONTROLSEX成员dwICC


    编辑(2014年1月31日):

    在我的笔记本电脑上测试了这个相同的代码片段后,ICC_STANDARD_CLASSES | ICC_TAB_CLASSES | ICC_BAR_CLASSES我可以确认一切正常。这是Windows 7我猜的问题......

    编辑结束:


    我的问题很简单:

    如何调整我的代码,以便Windows XP每次用户悬停在tooltip上时显示

    谢谢。

    最好的问候。

2 个答案:

答案 0 :(得分:2)

您正在追逐错误的问题,此行为是针对工具提示设计的。它所使用的确切规则没有记录在我所知道的任何地方,我从未发现任何需要对其进行逆向工程,所以我只能告诉你我所见过的。

该功能背后的更大理念是避免让用户知道他已经知道的信息。工具提示非常适合作为提示,只是一小部分信息对于程序的正常运行并不重要。它似乎是通过跟踪已经显示的工具的提示来实现的,并且如果使用该工具则再次显示它。这当然很有意义,用户在使用它之后不需要提醒工具做什么。

没有消息要重置&#34;提示已显示&#34;州。它会在显示另一个工具的提示时重置。改变尖端也会重置它。

我重申,你应该尝试解决这个问题。这种行为非常明智。如果它很重要,那么你必须自己控制并显示提示,TTM_ACTIVATE消息。

答案 1 :(得分:1)

您的代码可以在我的笔记本电脑上使用Windows 7,正如您所期望的那样。

由于这是微软的例子,我非常怀疑其中存在错误。

遵循夏洛克·福尔摩斯的建议:“一旦你消除了不可能的事物,剩下的一切,无论多么不可能,都是真理。”由于代码有效,因此它必须是Windows XP的问题,可以通过上述对您的问题的后续评论进行确认。

我会检查是否已下载所有自动更新,或者是否会重新安装并再次尝试使用您的代码。您还可以在运行Windows XP的其他计算机上测试您的代码,看看您自己的问题是否存在。

祝你好运。