Мне не удалось найти краткий фрагмент кода, который позволяет добавлять/отображать подсказки в элемент управления CStatic (и CLed). Очевидно, что стандартный код для этого не применяется для этого типа управления. Может ли кто-нибудь опубликовать фрагменты кода?
Добавить подсказку в CStatic
Ответ 1
Я надеюсь, что этот код решит вашу проблему. Одна важная вещь делает свойство 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);
}
Сообщите мне, если возникли проблемы.
Ответ 2
Когда я добавляю CStatic на основе автоматически созданного приложения mfc на основе диалога, всплывающие подсказки не отображаются до тех пор, пока я не добавлю RelayEvent в сообщение с предварительным переводом сообщения
BOOL CTooltipStaticDlg::PreTranslateMessage(MSG* pMsg)
{
    m_ToolTip.RelayEvent(pMsg); 
    return CDialog::PreTranslateMessage(pMsg);
}
		Ответ 3
У меня был успех с многострочными всплывающими подсказками, используя этот простой класс:
Создайте класс для всплывающих подсказок:
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 );
}
		Ответ 4
Я не знаю, нужно ли это по-прежнему, но вот что я использовал для решения проблемы: просто добавьте SS_NOTIFY в dwStyle при создании статической метки. (или просто установите "Nofity" "True" в свойствах). Это сработало для меня.
Ответ 5
У меня на моем ярлыке диалога назначенный пользовательский идентификатор IDC_PATH. Мне нужно было включить флаг Notify (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, которое я обработал и динамически установил текст для всплывающей подсказки.
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;
}