MFC工具提示仅在特殊场合出现

6 c++ windows mfc tooltip

我的任务是为配置菜单中的每个项目分配工具提示.我已经完成了"添加"工具提示到页面上的每个控件,但似乎有时工具提示显示,有时它不显示,具体取决于屏幕上控件的位置.

首先工具提示 - 我的页面

EnableToolTips(TRUE);
Run Code Online (Sandbox Code Playgroud)

在每个CPropertyPage的OnInitDialog方法中.然后我添加通知地图

ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText)
Run Code Online (Sandbox Code Playgroud)

使用OnToolTipText函数看起来如此

BOOL CCfgPrefPage::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
    UINT nID = pNMHDR->idFrom;

    if (pTTT->uFlags & TTF_IDISHWND)
    {
        nID = ::GetDlgCtrlID((HWND)nID);
        if(nID)
        {
            if( nID == GetDlgItem(IDC_PICKDIST_EDIT)->GetDlgCtrlID())  
                _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE);
            else if( nID == GetDlgItem(IDC_ENDPTTOL_EDIT)->GetDlgCtrlID())  
                _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE);

            pTTT->lpszText = pTTT->szText; // Sanity Check
            pTTT->hinst = AfxGetResourceHandle(); // Don't think this is needed at all
            return TRUE;
        }
    }
    return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

对于我的一些控件来说,工具提示似乎不会显示出来.对于大多数复选框控件,工具提示会显示,但有一些他们只是不显示.没有其他控件覆盖它们,它们没有被禁用.

另一件事,如果我使用非标准光标窗口反复闪烁工具提示,那么在某些情况下它是不可读的.我怎样才能解决这个问题?这在CEdit控件上不是问题,为什么在其他地方出现问题呢?

编辑:更新,多年来一直在页面上的控件似乎显示工具提示.我现在/今天尝试添加的任何控件都不会显示工具提示.无论位置,控制类型,设置如何,我都无法在新插入的控件上显示单个工具提示.

cha*_*cha 6

如果您不想使用我建议的帮助程序类,那么请修复代码中的问题.首先,在映射偶数处理程序时使用ON_NOTIFY_EX_RANGE宏,如下所示(这将覆盖所有ID):

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
Run Code Online (Sandbox Code Playgroud)

接下来,您需要修复您的功能.我在这看到一些问题.首先,在测试TTF_IDISHWND标志时,您只需要重新初始化nID.您不需要将其应用于整个函数.其次,在所有操作之后,您的nID将是实际的对话ID.不需要GetDlgItem()函数

BOOL CCfgPrefPage::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
    UINT nID = pNMHDR->idFrom;

    if (pTTT->uFlags & TTF_IDISHWND)
    {
        nID = ::GetDlgCtrlID((HWND)nID);
    }
    if(nID)
    {
        if( nID == IDC_PICKDIST_EDIT)  
            _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE);
        else if( nID == IDC_ENDPTTOL_EDIT)  
            _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE);

        //pTTT->lpszText = pTTT->szText; // Sanity Check
        *pResult = 0;
        return TRUE;
    }
    return FALSE;
}
Run Code Online (Sandbox Code Playgroud)