【问题标题】:Add tooltip to a CStatic将工具提示添加到 CStatic
【发布时间】:2012-11-02 00:28:31
【问题描述】:

我还没有找到一段简洁的代码,可以让我向 CStatic(和 CLed)控件添加/显示工具提示。显然,这样做的标准代码不适用于这种类型的控件。有人可以发布代码sn-ps吗?

【问题讨论】:

    标签: mfc static tooltip


    【解决方案1】:

    我希望这段代码能解决你的问题。重要的是让 CStatic 的 NOTIFY 属性 =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);
    }
    

    如果有任何问题,请告诉我。

    【讨论】:

    • 我需要这样做 plus 实现PreTranslateMessage 处理程序,如m_skipper's answer 中所述,然后它才能工作。还可以指出m_ToolTipCToolTipCtrl
    【解决方案2】:

    我使用这个简单的类在多行工具提示方面取得了成功:

    为 ToolTips 创建一个类:

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

    【讨论】:

      【解决方案3】:

      当我在基于对话框的自动创建 mfc 应用程序上添加 CStatic 时,工具提示不会显示,直到我在预翻译对话框消息中添加 RelayEvent

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这正是我所缺乏的……已经有了 RelayEvent 位,并且我使用控制变量创建了静态文本,因为我实时修改了它。因此,在属性中将 Notify 设置为 True 很容易解决。感谢您花时间发布答案!
        【解决方案5】:

        我的对话框标签上已分配了自定义 ID 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 通知,我处理并动态设置了工具提示的文本。

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

        【讨论】:

          猜你喜欢
          • 2021-12-13
          • 2011-08-30
          • 1970-01-01
          • 1970-01-01
          • 2011-06-06
          • 2010-11-12
          • 2015-09-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多