2012-11-13 13 views
10

Tôi không thể tìm thấy đoạn mã ngắn gọn cho phép tôi thêm/hiển thị chú giải công cụ vào điều khiển CStatic (và CLed). Rõ ràng, mã tiêu chuẩn để làm như vậy không áp dụng cho loại điều khiển này. Ai đó có thể đăng đoạn mã?Thêm chú giải công cụ vào một CStatic

+1

Tôi không biết tại sao câu hỏi này lại có một nhược điểm. Các thao tác chú giải công cụ trong MFC không phải lúc nào cũng đơn giản hoặc rõ ràng, vì vậy đây là một câu hỏi rất phù hợp. –

+0

@ MarkRansom thiếu thận trọng và dốt nát tiêu cực là một khía cạnh buồn của sự tồn tại của con người - đó là lời giải thích duy nhất có thể có. –

Trả lời

9

Tôi hy vọng mã này sẽ giải quyết được vấn đề của bạn. Một điều quan trọng làm cho NOTIFY tài sản của 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); 
} 

Hãy cho tôi biết nếu có vấn đề gì.

+0

Tôi cần làm điều này * cộng * thực hiện một trình xử lý «PreTranslateMessage' như mô tả trong câu trả lời của [m_skipper] (https://stackoverflow.com/a/33772406/3549027) trước khi nó hoạt động. Cũng có thể là tốt để chỉ ra rằng 'm_ToolTip' là một' CToolTipCtrl'. – dlf

1

Tôi đã thành công với tooltips multiline sử dụng lớp đơn giản này:

Tạo một lớp cho ToolTips:

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

Tiếp theo, thực hiện một chức năng tạo tooltip:

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

Gọi nó ở đâu đó trong InitDialog của bạn:

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

Khi tôi thêm CStatic trên Dialog dựa trên ứng dụng autocreated MFC, tooltips không hiển thị cho đến khi tôi thêm RelayEvent trong thông điệp thoại pretranslate

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

Tôi không biết nếu điều này vẫn cần thiết, nhưng đây là những gì tôi đã sử dụng để giải quyết vấn đề: chỉ cần thêm SS_NOTIFY vào dwStyle khi tạo nhãn tĩnh. (hoặc đơn giản là đặt "Nofity" "True" trong thuộc tính). Điều đó làm việc tốt cho tôi.

0

Tôi đã có trên nhãn hộp thoại của mình với ID tùy chỉnh IDC_PATH được chỉ định. Tôi cần phải bật Thông báo cho cờ (SS_NOTIFY) của nhãn và tôi cần phải quá tải CWnd phương pháp OnToolHitTest và xử lý tooltip kiểm tra hit như thế này:

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

Sau đó, hộp thoại của tôi bắt đầu nhận được thông báo TTN_NEEDTEXT, mà tôi xử lý và dynamicaly đặt văn bản cho chú giải công cụ.

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