2012-11-13 101 views
10

我一直无法找到简明的代码块,它允许我向CStatic(和CLed)控件添加/显示工具提示。显然,这样做的标准代码不适用于这种类型的控制。有人可以发布代码片段吗?将工具提示添加到CStatic中

+1

我不知道为什么这个问题得到了downvote。 MFC中的工具提示操作并不总是简单或明显的,所以这是一个非常相关的问题。 –

+0

@MarkRansom鲁莽和无知的消极是人类生存的一个令人伤心的方面 - 这是唯一可以解释的。 –

回答

9

我希望这段代码能解决你的问题。重要的是使NOTIFY属性为CStatic = TRUE。

if(!m_ToolTip.Create(this)) 
{ 
    TRACE0("Unable to create the ToolTip!"); 
} 
else 
{ 
    CWnd* pWnd = GetDlgItem(IDC_STATIC_MASTER_PWD); 
    m_ToolTip.AddTool(pWnd,"Ok"); 
    m_ToolTip.Activate(TRUE); 
} 

让我知道是否有问题。

+0

我需要执行此操作* plus *在[m_skipper的答案](https://stackoverflow.com/a/33772406/3549027)中实现一个'PreTranslateMessage'处理程序,然后才能正常工作。也可以指出'm_ToolTip'是一个'CToolTipCtrl'。 – dlf

1

我已经使用这个简单的类多提示成功:

工具提示创建一个类:

class ToolTip 
{ 
public: 
    static HWND CreateToolTip(int toolID, HWND hDlg, UINT id); 
}; 

下,实现提示创建功能:

HWND ToolTip::CreateToolTip(int toolID, HWND hDlg, UINT id) 
{ 
    if (!toolID || !hDlg || !id) 
    { 
     return FALSE; 
    } 

    CString strTTText; 
    strTTText.LoadString(id); 

    // Get the window handle of the control to attach the TT to. 
    HWND hwndTool = ::GetDlgItem(hDlg, toolID); 

    // Create the tooltip window 
    HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL, 
           WS_POPUP |TTS_ALWAYSTIP,// | TTS_BALLOON, 
           CW_USEDEFAULT, CW_USEDEFAULT, 
           CW_USEDEFAULT, CW_USEDEFAULT, 
           hDlg, NULL, 
           AfxGetInstanceHandle() , NULL); 

    if (!hwndTool || !hwndTip) 
    { 
     return (HWND)NULL; 
    }        

    // Associate the tooltip with the tool. 
    TOOLINFO toolInfo = { 0 }; 
    toolInfo.cbSize = sizeof(toolInfo); 
    toolInfo.hwnd = hDlg; 
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS; 
    toolInfo.uId = (UINT_PTR)hwndTool; 
    toolInfo.lpszText = (char*)(LPCTSTR)strTTText; 
    ::SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo); 
    ::SendMessageA(hwndTip, TTM_SETMAXTIPWIDTH, 0, 40); // force multi-line 

    return hwndTip; 
} 

呼叫它在InitDialog的某处:

CMyDialog::InitDialog() 
{ 
    ToolTip::CreateToolTip(PickAUniqueNumber, m_hWnd, IDS_MY_RESOURCE_STRING); 
} 
2

当我在基于对话框自动创建MFC应用程序中添加静态控件,工具提示不显示,直到我在预翻译对话消息添加RelayEvent

BOOL CTooltipStaticDlg::PreTranslateMessage(MSG* pMsg) 
{ 
    m_ToolTip.RelayEvent(pMsg); 
    return CDialog::PreTranslateMessage(pMsg); 
} 
0

我不知道这是否仍然需要,但在这里我用什么解决问题: 只是在创建静态标签时将SS_NOTIFY添加到dwStyle。 (或者只需在属性中设置“Nofity”“True”)。这对我来说很好。

0

我已经在我的对话框标签上分配了自定义标识IDC_PATH。我需要打开通知标签的标志(SS_NOTIFY),我需要重载CWnd的方法OnToolHitTest和处理这样的提示点击测试:

INT_PTR CPath::OnToolHitTest(CPoint point, TOOLINFO* pTI) const 
{ 
    INT_PTR r = CWnd::OnToolHitTest(point,pTI); 

    this->ClientToScreen(&point); 
    CRect rcLbl; 
    GetDlgItem(IDC_PATH)->GetWindowRect(&rcLbl); 
    if(rcLbl.PtInRect(point)) 
    { 
     pTI->uFlags |= TTF_IDISHWND; 
     pTI->uFlags &= ~TTF_NOTBUTTON; 
     pTI->uId = (UINT_PTR)GetDlgItem(IDC_PATH)->m_hWnd; 
     return IDC_PATH; 
    } 

    return r; 
} 

然后我的对话开始接受TTN_NEEDTEXT通知,这是我处理和dynamicaly为工具提示设置文本。

BOOL CPath::OnTtnNeedText(UINT id, NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    UNREFERENCED_PARAMETER(id); 

    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; 
    UINT_PTR nID = pNMHDR->idFrom; 
    BOOL bRet = FALSE; 

    if (pTTT->uFlags & TTF_IDISHWND) 
    { 
     // idFrom is actually the HWND of the tool 
     nID = ::GetDlgCtrlID((HWND)nID); 
     if(nID == IDC_PATH) 
     { 
     pTTT->lpszText = (LPSTR)(LPCTSTR)m_FullDestPath; 
     bRet = TRUE; 
     } 
    } 

    *pResult = 0; 

    return bRet; 
} 
相关问题