开发者社区> double2li> 正文

C++ TOOLTIP使用再次介绍

简介: http://blog.sina.com.cn/s/blog_6163bdeb0100pcld.html 为窗口或其中的控件添加提示框,可以使用MFC的类CToolTipCtrl,使用方法如下 1.
+关注继续查看

http://blog.sina.com.cn/s/blog_6163bdeb0100pcld.html

为窗口或其中的控件添加提示框,可以使用MFC的类CToolTipCtrl,使用方法如下

1.在窗口的类定义中添加变量说明:
class CTooltipTestDlg : public CDialog{

public:
CToolTipCtrl m_tt;


}

2.在对话框的OnInitDialog()函数中添加如下代码

    EnableToolTips(TRUE);
    m_tt.Create(this);
    m_tt.Activate(TRUE);

    CWnd* pW=GetDlgItem(IDC_CHECK1);//得到控件的指针
    m_tt.AddTool(pW,L"Check1lakjsfasfdasfd");//为此控件添加tip

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

BOOL CTooltipTestDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class

    if (NULL != m_tt.GetSafeHwnd())
    {
        m_tt.RelayEvent(pMsg);
    }


    return CDialog::PreTranslateMessage(pMsg);
}

这样就完成了为控件添加Tip。


如果想修改已添加的tip的内容,可以使用UpdateTipText函数,如下

CWnd* pW=GetDlgItem(IDC_CHECK1);//得到已添加tip控件
m_tt.UpdateTipText(L"asdflasdf",pW);//更新tip的内容

其他控制函数具体可查MSDN的CToolTipCtrl类。


对于静态文本框,要把Notify的属性设为TRUE;而如果静态文本控件是动态创建的,必须给窗口风格添加SS_NOTIFY,如

m_StaticText.Create(_T("my static"), WS_CHILD|WS_VISIBLE|WS_BORDER|SS_NOTIFY, 
        CRect(
10,10,150,50),this);

具体可参考下面的链接。

 

参考:

CToolTipCtrl使用详细解说http://hi.baidu.com/fateyeah/blog/item/fc7c07b37ab250a7d9335aa7.html

MFC中给静态文本加上提示的做法http://www.cnblogs.com/clever101/archive/2010/05/01/1725578.html

另外,如果想得到功能更强大的tip提示框,可以使用一个白俄罗斯人写的定制的tooltiphttp://www.codeproject.com/KB/miscctrl/pptooltip.aspx

 

http://www.cnblogs.com/clever101/archive/2010/05/01/1725578.html

作者:朱金灿

来源:http://www.cnblogs.com/clever101/

 

 

还是那句老话:纸上得来终觉浅,绝知此事要躬行。前天给同事解决了一个问题,他动态创建了一个静态控件,可是这个静态控件的ToolTip总是显示不出来。我提示他在创建时要设置一下窗口风格。果然他在创建时加上SS_NOPREFIX就好了。

 

今天抽空把这个知识记录一下(这也算是我的一个习惯了,无关乎技术含量),上网搜了一下CToolTipCtrl类的用法,搜到一篇文章:

 

CToolTipCtrl 使用详细解说

 

我测试了该文的做法,发现要与该文作者商榷一下了。该文作者说:

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

 

但是我照该文的做法,移动鼠标到静态文本控件上提示并没出来。我感觉正确的做法应该是设置窗口风格。具体是,如果你是拖来控件的做法,要把Notify的属性设为TRUE,具体如下图:

 

TOOLTIP" border=0 alt="" src="http://usera.imagecave.com/clever101/Program3/static%20property%20setting.JPG" real_src="http://usera.imagecave.com/clever101/Program3/static%20property%20setting.JPG">

 

如果你是动态创建静态文本控件,必须给窗口风格添加SS_NOTIFY(其它窗口我也估计也类似),具体是:


class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// 对话框数据
    enum { IDD = IDD_ABOUTBOX };

protected:
    
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
    DECLARE_MESSAGE_MAP()
public:
    
virtual BOOL OnInitDialog();

private:

    CToolTipCtrl m_tt; 

    CStatic m_StaticText;

public:
    
virtual BOOL PreTranslateMessage(MSG* pMsg);
};

BOOL CAboutDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    
// TODO:  在此添加额外的初始化

    m_StaticText.Create(_T(
"my static"), WS_CHILD|WS_VISIBLE|WS_BORDER|SS_NOTIFY, 
        CRect(
10,10,150,50),this);

    m_tt.Create(
this); 

    m_tt.Activate(TRUE); 


    m_tt.AddTool(
&m_StaticText,_T("这是一个静态文本!"));//添加

    
return TRUE;  // return TRUE unless you set the focus to a control
    
// 异常: OCX 属性页应返回FALSE
}

BOOL CAboutDlg::PreTranslateMessage(MSG
* pMsg)
{
    
// TODO: 在此添加专用代码和/或调用基类
    if (NULL != m_tt.GetSafeHwnd())            
        m_tt.RelayEvent(pMsg);


    
return CDialog::PreTranslateMessage(pMsg);
}
 
http://hi.baidu.com/fateyeah/blog/item/fc7c07b37ab250a7d9335aa7.html
CToolTipCtrl使用详细解说
2006-08-14 8:58

by 闻怡洋 wyy_cq@188.net 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); }

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何在函数计算中使用 Node.js 处理 multipart 文件上传请求
## 前言 web 开发中我们经常会允许用户通过 HTTP POST 请求上传文档到服务器,如何使用函数计算来做文件上传服务呢?下面我们使用 nodejs 来实现一个文件上传的案例: 我们知道浏览器中上传文档通常会使用 `multipart` `form-data` 来多文件同时上传文件。 例如,我们可以使用curl来做这个测试模拟上传两个文件: `test.txt` 和 `inde
1767 0
如何在函数计算中使用 Node.js 处理 multipart 文件上传请求
web 开发中我们经常会允许用户通过 HTTP POST 请求上传文档到服务器,本文将介绍在函数计算中基于 node.js 使用 multipart form-data 来实现文件上传服务。
2758 0
MySQL · myrocks · 相关tools介绍
概述 MyRocks提供了丰富的tools,如sst_dump, mysql_ldb等,这些工具对我们的运维和分析问题非常有用。 sst_dump 可以导出sst中的数据和属性信息。 sst_dump --help sst_dump --file=<data_dir_OR_sst_file> .
3114 0
《阿里巴巴Java开发规约》插件使用介绍
一、简介     阿里巴巴于10月14日在杭州云栖大会上,正式发布了《阿里巴巴Java开发规约》扫描插件!该插件基于《阿里巴巴Java开发规约》手册内容,在扫描代码后,将不符合规约的代码按Blocker/Critical/Major三个等级显示在下方,甚至在IDEA上,还基于Inspection机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。
2394 0
Android开发学习之使用Toolbar实现不同的Fragment使用不同颜色的标题栏与状态栏
Android开发学习之使用Toolbar实现不同的Fragment使用不同颜色的标题栏与状态栏                                            先看效果图。
2409 0
Spring-Boot-Devtools使用
Spring-Boot-Devtools在IDEA下使用示例
455 0
+关注
double2li
一个在IT行业摸爬滚打的老司机
2870
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载