zoukankan      html  css  js  c++  java
  • VC/MFC 当鼠标移到控件上时显示提示信息

    VC/MFC 当鼠标移到控件上时显示提示信息

    ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法。 

    一般用法步骤:  

    添加CToolTipCtrl成员变量 m_tt。  

    在父窗口中调用EnableToolTips(TRUE);  

    在窗口的OnCreate(或者其他适当的位置)中向ToolTip中添加需要显示Tip的子窗口,并同时指定相应的显示字串CToolTipCtrl::AddTool(pWnd, "string to display ")。 

    重载父窗口的 BOOL PreTranslateMessage(MSG* pMsg) ,在函数中调用 m_tt.RelayEvent(pMsg)。  

    下面假设在窗口CWndYour中使用CToolTipCtrl  

    在类定义中添加变量说明:  
    class CWndYour:xxx  
    {  
    CToolTipCtrl m_tt;  
    }  
    在OnCreate中添加需要显示Tip的子窗口  
    CWndYour::OnCreate(....)  
    {  
    EnableToolTips(TRUE);  
    m_tt.Create(this);  
    m_tt.Activate(TRUE);  

    CWnd* pW=GetDlgItem(IDC_CHECK1);//得到窗口指针  
    m_tooltip.AddTool(pW, "Check1 ");//添加  
    ........  
    }  
    在BOOL PreTranslateMessage(MSG* pMsg)中添加代码  
    BOOL CWndYour::PreTranslateMessage(MSG* pMsg)  
    {  
    {  
    m_tt.RelayEvent(pMsg);  
    }  
    return CParentClass::PreTranslateMessage(pMsg);  
    }  

    这样当鼠标移动到相应的子窗口上时会显示出相应的ToolTip。  

    动态改变ToolTip的显示内容的方法及步骤:  

    上面所讲的1、2、4步骤。  

    在增加ToolTip时不指定显示的字串,而是使用LPSTR_TEXTCALLBACK。  

    在窗口中增加消息映射 ON_NOTIFY_EX( TTN_NEEDTEXT, 0, SetTipText )。  

    在窗口中增加一个函数用于动态提供显示内容,其原型为 BOOL SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult ),下面的代码可以根据传入的参数判定应该显示的内容。 

    [cpp] view plaincopy
     
    1. BOOL CWndYour::SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult )    
    2. {    
    3. TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;     
    4. UINT nID =pTTTStruct-> idFrom; //得到相应窗口ID,有可能是HWND    
    5. if (pTTT-> uFlags & TTF_IDISHWND) //表明nID是否为HWND    
    6. {    
    7.   nID = ::GetDlgCtrlID((HWND)nID);//从HWND得到ID值,当然你也可以通过HWND值来判断    
    8. switch(nID)    
    9. case(IDC_YOUR_CONTROL1)     
    10. strcpy(pTTT-> lpszText,your_string1);//设置    
    11. return TRUE;    
    12. break;    
    13. case(IDC_YOUR_CONTROL2)    
    14. //设置相应的显示字串    
    15. return TRUE;    
    16. break;    
    17. }    
    18. return(FALSE);    
    19. }   


    另外的就是在相应函数中区分UNICODE编码

    [cpp] view plaincopy
     
      1. BOOL CPreParent::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)  
      2. {  
      3.     ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);  
      4.       
      5.     // UNICODE消息  
      6.     TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;  
      7.     TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;  
      8.     //TCHAR szFullText[512];  
      9.     CString strTipText;  
      10.     UINT nID = pNMHDR->idFrom;  
      11.       
      12.     if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||  
      13.         pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))  
      14.     {  
      15.         // idFrom为工具条的HWND   
      16.         nID = ::GetDlgCtrlID((HWND)nID);  
      17.     }  
      18.       
      19.     if (nID != 0) //不为分隔符  
      20.     {  
      21.         strTipText.LoadString(nID);  
      22.         strTipText = strTipText.Mid(strTipText.Find(' ',0)+1);  
      23.         //strTipText = _T("notify string");  
      24.           
      25. #ifndef _UNICODE  
      26.         if (pNMHDR->code == TTN_NEEDTEXTA)  
      27.         {  
      28.             lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));  
      29.         }  
      30.         else  
      31.         {  
      32.             _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));  
      33.         }  
      34. #else  
      35.         if (pNMHDR->code == TTN_NEEDTEXTA)  
      36.         {  
      37.             _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));  
      38.         }  
      39.         else  
      40.         {  
      41.             lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));  
      42.         }  
      43. #endif  
      44.           
      45.         *pResult = 0;  
      46.           
      47.         //使工具条提示窗口在最上面  
      48.         ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,  
      49.             SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);   
      50.         return TRUE;  
      51.     }  
      52.     return TRUE;  
      53. }  
  • 相关阅读:
    DeWeb 与 Unigui的区别
    DeWeb 电脑和手机动态适配
    DeWeb --- Hello,World!
    DeWeb 简介
    Android ---------- 汉字空格
    Android ---------- List 数组转成 json格式的字符串
    Android ---------- TabLayout 实战 (一)
    Thinkphp5.0中input函数用法
    jQuery在页面加载的时候自动调用某个函数的方法(转载)
    关于wampserver的一点知识
  • 原文地址:https://www.cnblogs.com/lidabo/p/3701836.html
Copyright © 2011-2022 走看看