c++ - 在基于 ATL 的 C++ 对话框中向复选框添加工具提示

标签 c++ winapi checkbox tooltip atl

我正在尝试向继承自 CAxDialogImpl 的对话框上的一组复选框添加一组工具提示,其中 CSG32GridViewControlDlg 是我的对话框类。

Using the example code on MSDN作为基础,我添加了以下代码:

void CSG32GridViewControlDlg::AddCheckboxTooltip(const int toolId, PTSTR tooltipText)
{
    HWND hCheckbox = GetDlgItem(toolId);


    char label1[501];
    ::GetWindowText(hCheckbox, label1, 500);

    HINSTANCE hInstance = _AtlBaseModule.GetResourceInstance( ); // This bit I'm not sure about...

    // Need to create the ToolTip first
    HWND hWndToolTip = ::CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
                    WS_POPUP | TTS_ALWAYSTIP | TTS_BALLOON,
                    CW_USEDEFAULT, CW_USEDEFAULT, 
                    CW_USEDEFAULT, CW_USEDEFAULT,
                    hCheckbox, 
                    NULL,
                    hInstance, 0);

    if (!hCheckbox || !hWndToolTip)
    {
        return;
    }                              

    TOOLINFO toolInfo = { 0 };
    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.hwnd    = hCheckbox;
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    toolInfo.uId    = (UINT_PTR)hWndToolTip;
    toolInfo.lpszText = tooltipText;

    LRESULT result = ::SendMessage(hWndToolTip, TTM_ADDTOOL, 0, (LPARAM) &toolInfo);
    return hWndToolTip;
}

调试代码,我可以看到消息已发送,结果返回为“1”,这似乎表明一切正常。但是当我将鼠标悬停在有问题的复选框上时...没有工具提示。

我该怎么做才能检查工具提示是否已成功注册,以及为什么它不会出现在鼠标悬停上?或者,是否有更好的方法来解决这个问题?

最佳答案

您的代码存在一些问题。值得一提的起点显然是这样的:How to Create a Tooltip for a Control .

  1. 工具提示控件的父窗口应该是对话框,而不是复选框
  2. 带有TTF_IDISHWND标志的工具的
  3. uId成员需要是工具窗口,而不是工具提示控制窗口

这给出了代码:

HWND AddCheckboxTooltip(const int toolId, PTSTR tooltipText)
{
    HWND hCheckbox = GetDlgItem(toolId);

    // Need to create the ToolTip first
    HWND hWndToolTip = ::CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
                    WS_POPUP | TTS_ALWAYSTIP | TTS_BALLOON,
                    CW_USEDEFAULT, CW_USEDEFAULT, 
                    CW_USEDEFAULT, CW_USEDEFAULT,
                    m_hWnd, 
                    NULL,
                    _AtlBaseModule.GetModuleInstance(), 0);

    if (!hCheckbox || !hWndToolTip)
        return NULL;

    TOOLINFO toolInfo = { 0 };
    toolInfo.cbSize = sizeof(toolInfo);
    toolInfo.hwnd    = hCheckbox;
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    toolInfo.uId    = (UINT_PTR)hCheckbox;
    toolInfo.lpszText = tooltipText;

    LRESULT result = ::SendMessage(hWndToolTip, TTM_ADDTOOL, 
        0, (LPARAM) &toolInfo);
    return hWndToolTip;
}

LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL& /*bHandled*/)
{
    AddCheckboxTooltip(IDC_CHECK1, _T("Checkbox Tooltip Test"));
    //...

运行为:

enter image description here

关于c++ - 在基于 ATL 的 C++ 对话框中向复选框添加工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21699968/

相关文章:

c++ - C++ 中发送者-接收者模型中的多线程

c - 在 win32 的线程中向主窗口发送消息

php - 如何使用数据库中的名称从多个复选框更新 MySQL?

未选中/选中复选框时,javascript在div中添加/删除文本

c# - 如何在没有回发的情况下访问复选框的值?

c++ - Qt 在不相关的对象之间传递变量

c++ - 在 allocate_stack (stack=<synthetic pointer>, pdp=<synthetic pointer>

c++ - 没有 "new"C++ 的对象初始化

c - 如何设置Unicode控件的字体?

windows - VB6中如何判断菜单项的位置?