2012-11-13 14 views
10

Ich konnte keinen prägnanten Codeabschnitt finden, mit dem ich QuickInfos zu einem CStatic (und CLed) -Steuerelement hinzufügen/anzeigen kann. Offensichtlich gilt der Standardcode für diese Art von Kontrolle nicht. Kann jemand Code-Snippets posten?Tooltip zu einem Cstatic hinzufügen

+1

Ich weiß nicht, warum diese Frage einen Downvote bekam. Tooltip-Vorgänge in MFC sind nicht immer einfach oder offensichtlich, daher ist dies eine sehr wichtige Frage. –

+0

@MarkRansom rücksichtslose und ignorante Negativität ist solch ein trauriger Aspekt der menschlichen Existenz - es ist die einzige Erklärung, die es geben kann. –

Antwort

9

Ich hoffe, dass dieser Code Ihr Problem lösen wird. Eine wichtige Sache machen NOTIFY Eigenschaft von 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); 
} 

Lassen Sie mich wissen, wenn irgendein Problem.

+0

Ich musste dies * plus * einen 'PreTranslateMessage'-Handler implementieren, wie in [m_skippers Antwort] beschrieben (https://stackoverflow.com/a/33772406/3549027), bevor es funktionieren würde. Es kann auch gut sein, darauf hinzuweisen, dass 'm_ToolTip' ein' CToolTipCtrl' ist. – dlf

1

Ich hatte Erfolg mit mehrzeilige Tooltips diese einfache Klasse mit:

Erstellen Sie eine Klasse für Quick-Infos:

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

Als nächstes implementieren ein Tooltip Erstellungsfunktion:

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; 
} 

Anruf es irgendwo in Ihrem InitDialog:

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

Wenn ich CStatic auf Dialog basiert automatisch erstellt mfc Anwendung hinzufügen, Tooltips zeigen nicht, bis ich Relay in vorübersetzt Dialognachricht

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

Ich weiß nicht hinzufügen, wenn dies noch erforderlich ist, aber hier ist das, was ich gebraucht um das Problem zu lösen: fügen Sie einfach SS_NOTIFY zu dwStyle hinzu, wenn Sie das statische Label erstellen. (oder einfach "Nofity" "True" in den Eigenschaften). Das hat gut für mich funktioniert.

0

Ich hatte auf meinem Dialogfeld Etikett mit zugewiesenen benutzerdefinierten ID IDC_PATH. Ich brauchte aktivieren Benachrichtigen Flag (SS_NOTIFY) des Etiketts und ich brauchte CWnd Methode OnToolHitTest zu überlasten und Tooltip Treffertest wie folgt behandeln:

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; 
} 

Dann ist mein Dialog gestartet TTN_NEEDTEXT eine Benachrichtigung zu erhalten, die ich behandelt und dynamicaly Setze Text für Tooltip.

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; 
} 
Verwandte Themen