2012-11-13 12 views
10

Nie mogłem znaleźć zwięzłego fragmentu kodu, który pozwala mi dodawać/wyświetlać podpowiedzi do kontrolki CStatic (i CLed). Oczywiście standardowy kod, aby to zrobić, nie dotyczy tego rodzaju kontroli. Czy ktoś może publikować fragmenty kodu?Dodaj etykietę narzędzia do CStatic

+1

Nie wiem, dlaczego to pytanie zostało przyjęte. Operacje na etykietach w MFC nie zawsze są proste lub oczywiste, więc jest to bardzo istotne pytanie. –

+0

@MarkRansom lekkomyślność i ignorancja jest tak smutnym aspektem ludzkiej egzystencji - to jedyne wytłumaczenie. –

Odpowiedz

9

Mam nadzieję, że ten kod rozwiąże Twój problem. Jedną z ważnych rzeczy jest właściwość NOTIFY o 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); 
} 

Daj mi znać, jeśli jakiś problem.

+0

Musiałem to zrobić * plus * zaimplementowałem program obsługi "PreTranslateMessage" zgodnie z opisem w [odpowiedź m_skipper] (https://stackoverflow.com/a/33772406/3549027), zanim to zadziała. Warto również zauważyć, że 'm_ToolTip' jest' CToolTipCtrl'. – dlf

1

miałem sukces multilinii podpowiedzi wykorzystujących tę prostą klasę:

utworzyć klasę dla podpowiedzi:

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

Następnie zaimplementować funkcję tworzenia podpowiedzi:

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

połączenia to gdzieś w swoim InitDialog:

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

Kiedy dodać CStatic na Dialog oparte aplikacji autocreated MFC, podpowiedzi nie wykazują aż dodam RelayEvent w pretranslate wiadomości dialogowym

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

Nie wiem, czy to jest nadal potrzebna, ale tutaj jest to, co kiedyś aby rozwiązać problem: po prostu dodaj SS_NOTIFY do dwStyle podczas tworzenia statycznej etykiety. (lub po prostu ustaw "Nofity" "Prawda" we właściwościach). To mi pasowało.

0

Posiadałem etykietę okna dialogowego z przypisanym niestandardowym ID IDC_PATH. Musiałem włączyć Informuj flagę (SS_NOTIFY) etykiety i musiałem przeciążać metody cwnd OnToolHitTest i obsługiwać testu trafień podpowiedzi tak:

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

Wtedy mój dialog zaczął otrzymywać powiadomienia TTN_NEEDTEXT, które obsługiwane i dynamicznie ustaw tekst dla podpowiedzi.

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; 
} 
Powiązane problemy