点击按钮后,工具提示不再显示

3
我想创建一个简单的“工具提示”,当用户悬停在“按钮”上时会弹出。
为此,我学习了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控件。
以下是创建说明最小化的示例以说明问题的指导:

创建最小化示例的步骤:

  1. Create default Win32 project in MS Visual Studio;
  2. 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;
    
  3. Compile and run-tooltip should show on first hover, but never again.

我使用 Windows XP 操作系统,在 MS Visual Studio Express 2008 中编程。
Visual Styles 已启用,我已链接 comctl32.lib 并初始化了 INITCOMMONCONTROLSEX 结构体的 dwICC 成员,值为 ICC_STANDARD_CLASSES | ICC_TAB_CLASSES | ICC_BAR_CLASSES。

编辑(2014年1月31日):

在我的笔记本电脑上测试了这个代码片段后,它可以在Windows 7上正常运行。我想这就是我的Windows XP存在的问题...

编辑结束:


我的问题非常简单:

如何调整我的代码,使得每次用户悬停在上时都会显示tooltip

谢谢。

最好的问候。


我尝试了你的代码,它对我有效。我做了两件不同的事情。1. 我使用了VS 2005,2. 我将项目编译为C代码。 - Stuart
@Stuart:你在Windows XP上试过了吗? - AlwaysLearningNewStuff
2
是的,我正在运行Windows XP。我在调用InitCommonControlsEx时遇到了问题(调用失败)。最终,在阅读此链接末尾的评论后,我解决了该问题:http://social.msdn.microsoft.com/Forums/vstudio/en-US/757905ce-7a32-4b1a-a73b-a2992556b242/initcommoncontrolsex-returns-false - Stuart
@Stuart:好的,我已经将我的pragma comment移动到了stdafx.h中,并放置在#include<windows.h>include<commctrl.h>之下。我的下一个问题是当我点击按钮时-tooltip再也不会出现了。我希望它在用户悬停在按钮上时随时出现。你有任何想法如何实现这个吗?感谢你的帮助和部分解决我的问题。最好的问候。 - AlwaysLearningNewStuff
1
当我检查时,我意识到我有你描述的同样问题,一旦我点击,工具提示就不再出现。我尝试了几件事情,并想出了两种不同的方法来解决这个问题。当按钮被点击时,要么:1. 从工具提示中删除按钮,然后再添加它,或者2. 销毁工具提示(使用DestroyWindow),然后重新创建它。我不是很喜欢任何一种解决方案,但它们都有效。 - Stuart
2个回答

2
您正在追寻错误的问题,这是工具提示设计的行为。它使用的确切规则没有被记录在我所知道的任何地方,我个人也从未发现需要逆向工程,因此我只能告诉您我看到的内容。
该功能背后的更大想法是避免用已知信息疲劳用户。工具提示的设计初衷非常明确,只是提供一点不影响程序正常运行的信息。它似乎是通过跟踪已经显示过的工具提示并且在使用该工具时不再显示来实现的。这当然很有意义,用户在使用工具后不需要再次被提醒工具的作用。
没有重置“已显示提示”的状态的消息。当它为另一个工具显示提示时,它将被重置。更改提示也会重置它。
我要重申的是,这是您不应该尝试修复的问题。这种行为非常合理。如果它仍然很重要,则必须控制并自己显示提示,使用TTM_ACTIVATE消息。

1

你的代码在我使用Windows 7的笔记本电脑上像你期望的那样工作。

既然这是微软的示例,我非常怀疑其中有错误。

按照福尔摩斯的建议:“一旦你排除了不可能的,剩下的不管多么不可能,就是真相。”由于代码可以运行,因此问题必须出在Windows XP上,这可以通过上述跟进评论来确认。

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

祝好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接