VC++ 中 CToolTipCtrl 应用

CToolTipCtrl

class  CEmisDrawView  public  CScrollView
{
protected:  //  create  from  serialization  on ly
        CEmisDrawView();
        DECLARE_DYNCREATE(CEmisDrawView)
                CToolTipCtrl    m_ToolTip;
        //  。。。。
};

int  CEmisDrawView::On Create(LPCREATESTRUCT  lpCreateStruct)
{
        if  (CScrollView::On Create(lpCreateStruct)  ==  -1)
                return  -1;

        m_ToolTip.Create(this,TTS_ALWAYSTIP);
        m_ToolTip.AddTool(this,"eMis_Draw");
        EnableToolTips(TRUE);
        return  0;
}

LRESULT  CEmisDrawView::WindowProc(UINT  message,  WPARAM  wParam,  LPARAM  lParam)
{
        if(message    ==    WM_MOUSEMOVE)
        {
                MSG    msg;
                msg.hwnd        m_hWnd;
                msg.message  message;
                msg.wParam    wParam;
                msg.lParam    lParam;
                m_ToolTip.RelayEvent(&msg);
        }
        return  CScrollView::WindowProc(message,  wParam,  lParam);
}

BOOL  CEmisDrawView::PreTranslateMessage(MSG*  pMsg)
{
        m_ToolTip.RelayEvent(pMsg);
        return  CScrollView::PreTranslateMessage(pMsg);
}

在你想更改的地方加上:
m_ToolTip.UpdateTipText("new  string",this);

--------------------------------------------------------

Tooltip中由一个方法叫做SetMaxTipWidth,MSDN中的描述说是设定Tips窗口的最大宽度,然后就没了。
其实这个方法是使用SDK中的TTM_SETMAXTIPWIDTH 消息,查一下这个消息的描述,就会发现很多内容。
1. 这个方法是设定Tips窗口的最大宽度,in pixel;
2. 如果文字超过这个最大宽度,则control进行自动换行,以空格为换行标志;
3. 如果无法换行(没有空格或\r\n),则显示一行,宽度超过最大宽度。

还有很重要的一点,如果没有设定过宽度,则系统默认宽度为-1,这也是没有设定宽度就不能换行的原因。

试验结果:
1. 一旦设定宽度,\r\n和空格就会同时起作用,只是空格是在一行宽度超过设定宽度时起作用的。

--------------------------------------------------------

BOOL  CTest_CToolTipCtrlDlg::On InitDialog()
{
        CDialog::On InitDialog();

        //  Set  the  icon  for  this  dialog.    The  framework  does  this  automatically
        //    when  the  application's  main  window  is  not  dialog
        SetIcon(m_hIcon,  TRUE);                        //  Set  big  icon
        SetIcon(m_hIcon,  FALSE);                //  Set  small  icon

        RECT  rect;
        rect.left  5;
        rect.right  5;
        rect.top  5;
        rect.bottom  5;

        m_objToolTip.SetMaxTipWidth(180);
        m_objToolTip.SetTipBkColor(  RGB(165,  203,  247)  );
        m_objToolTip.SetTipTextColor(  RGB(0,  102,  153)  );
        m_objToolTip.SetMargin(  &rect  );
        m_objToolTip.AddTool(  GetDlgItem(IDOK)  "this  is  common  button\nnamed  \"ok\"\ntest  done.");
        m_objToolTip.AddTool(  GetDlgItem(IDCANCEL)  "this  is  common  button\nnamed  \"cancel\"\ntest  done.");
        //  TODO:  Add  extra  initialization  here

        return  TRUE;    //  return  TRUE    unless  you  set  the  focus  to  control
}


 


CToolTipCtrl
class  CEmisDrawView  public  CScrollView
{
protected:  //  create  from  serialization  on ly
        CEmisDrawView();
        DECLARE_DYNCREATE(CEmisDrawView)
                CToolTipCtrl    m_ToolTip;
        //  。。。。
};

int  CEmisDrawView::On Create(LPCREATESTRUCT  lpCreateStruct)
{
        if  (CScrollView::On Create(lpCreateStruct)  ==  -1)
                return  -1;

        m_ToolTip.Create(this,TTS_ALWAYSTIP);
        m_ToolTip.AddTool(this,"eMis_Draw");
        EnableToolTips(TRUE);
        return  0;
}

LRESULT  CEmisDrawView::WindowProc(UINT  message,  WPARAM  wParam,  LPARAM  lParam)
{
        if(message    ==    WM_MOUSEMOVE)
        {
                MSG    msg;
                msg.hwnd        m_hWnd;
                msg.message  message;
                msg.wParam    wParam;
                msg.lParam    lParam;
                m_ToolTip.RelayEvent(&msg);
        }
        return  CScrollView::WindowProc(message,  wParam,  lParam);
}

BOOL  CEmisDrawView::PreTranslateMessage(MSG*  pMsg)
{
        m_ToolTip.RelayEvent(pMsg);
        return  CScrollView::PreTranslateMessage(pMsg);
}

在你想更改的地方加上:
m_ToolTip.UpdateTipText("new  string",this);

--------------------------------------------------------

Tooltip中由一个方法叫做SetMaxTipWidth,MSDN中的描述说是设定Tips窗口的最大宽度,然后就没了。
其实这个方法是使用SDK中的TTM_SETMAXTIPWIDTH 消息,查一下这个消息的描述,就会发现很多内容。
1. 这个方法是设定Tips窗口的最大宽度,in pixel;
2. 如果文字超过这个最大宽度,则control进行自动换行,以空格为换行标志;
3. 如果无法换行(没有空格或\r\n),则显示一行,宽度超过最大宽度。

还有很重要的一点,如果没有设定过宽度,则系统默认宽度为-1,这也是没有设定宽度就不能换行的原因。

试验结果:
1. 一旦设定宽度,\r\n和空格就会同时起作用,只是空格是在一行宽度超过设定宽度时起作用的。

--------------------------------------------------------

BOOL  CTest_CToolTipCtrlDlg::On InitDialog()
{
        CDialog::On InitDialog();

        //  Set  the  icon  for  this  dialog.    The  framework  does  this  automatically
        //    when  the  application's  main  window  is  not  dialog
        SetIcon(m_hIcon,  TRUE);                        //  Set  big  icon
        SetIcon(m_hIcon,  FALSE);                //  Set  small  icon

        RECT  rect;
        rect.left  5;
        rect.right  5;
        rect.top  5;
        rect.bottom  5;

        m_objToolTip.SetMaxTipWidth(180);
        m_objToolTip.SetTipBkColor(  RGB(165,  203,  247)  );
        m_objToolTip.SetTipTextColor(  RGB(0,  102,  153)  );
        m_objToolTip.SetMargin(  &rect  );
        m_objToolTip.AddTool(  GetDlgItem(IDOK)  "this  is  common  button\nnamed  \"ok\"\ntest  done.");
        m_objToolTip.AddTool(  GetDlgItem(IDCANCEL)  "this  is  common  button\nnamed  \"cancel\"\ntest  done.");
        //  TODO:  Add  extra  initialization  here

        return  TRUE;    //  return  TRUE    unless  you  set  the  focus  to  control
}

CToolTipCtrl使用详细解说

by 闻怡洋 http://vchelp.163.net

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

一般用法步骤:

  1. 添加CToolTipCtrl成员变量 m_tt。

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

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

  4. 重载父窗口的 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. 上面所讲的1、2、4步骤。

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

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

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

BOOL CWndYour::SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult ){ TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct; UINT nID =pTTTStruct->idFrom; //得到相应窗口ID,有可能是HWND if (pTTT->uFlags & TTF_IDISHWND) //表明nID是否为HWND { nID = ::GetDlgCtrlID((HWND)nID);//从HWND得到ID值,当然你也可以通过HWND值来判断 switch(nID) case(IDC_YOUR_CONTROL1) strcpy(pTTT->lpszText,your_string1);//设置 return TRUE; break; case(IDC_YOUR_CONTROL2) //设置相应的显示字串 return TRUE; break; } return(FALSE);}

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

一般用法步骤:

  1. 添加CToolTipCtrl成员变量 m_tt。

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

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

  4. 重载父窗口的 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. 上面所讲的1、2、4步骤。

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

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

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

BOOL CWndYour::SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult ){ TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct; UINT nID =pTTTStruct->idFrom; //得到相应窗口ID,有可能是HWND if (pTTT->uFlags & TTF_IDISHWND //表明nID是否为HWND { nID = ::GetDlgCtrlID((HWND)nID);//从HWND得到ID值,当然你也可以通过HWND值来判断 switch(nID) case(IDC_YOUR_CONTROL1) strcpy(pTTT->lpszText,your_string1);//设置 return TRUE; break; case(IDC_YOUR_CONTROL2) //设置相应的显示字串 return TRUE; break; } return(FALSE);}


 ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的。一般用法步骤:

  1. 添加CToolTipCtrl成员变量 m_tt。
  2. 在父窗口中调用EnableToolTips(TRUE);
  3. 在窗口的OnCreate(或者其他适当的位置)中向ToolTip中添加需要显示Tip的子窗口,并同时指定相应的显示字串CToolTipCtrl::AddTool (pWnd,"string to display")。
  4. 重载父窗口的 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. 上面所讲的1、2、4步骤。
  2. 第3步在增加ToolTip时不指定显示的字串,而是使用LPSTR_TEXTCALLBACK。
  3. 在窗口中增加消息映射 ON_NOTIFY_EX( TTN_NEEDTEXT, 0, SetTipText )。
  4. 在窗口中增加一个函数用于动态提供显示内容,其原型为 BOOL SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult ),下面的代码可以根据传入的参数判定应该显示的内容。

BOOL CWndYour::SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult )

{

 TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;   

 UINT nID =pTTTStruct->idFrom; //得到相应窗口ID,有可能是HWND

 if (pTTT->uFlags & TTF_IDISHWND)    //表明nID是否为HWND

         nID = ::GetDlgCtrlID((HWND)nID);//从HWND得到ID值,当然你也可以通过HWND值来判断

  switch(nID)

{

  case(IDC_YOUR_CONTROL1)       

            strcpy(pTTT->lpszText,your_string1);//设置

            return TRUE;

             break;

  case(IDC_YOUR_CONTROL2)

            //设置相应的显示字串

            return TRUE;

             break;

 }

 return(FALSE);

}

 

 

另外一些小功能:

1、 使CToolTipCtrl增加换行功能,显示前增加函数调用

M_tt. SetMaxTipWidth(5);                    //使ToolTip最多可以支持5行

2、SetDelayTime函数用来设置显示时间。

3、SetMargin用来设置上下左右的空白距离。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值