C++ TOOLTIP使用再次介绍

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

MFC中给静态文本加上提示的做法

作者:朱金灿

来源: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(其它窗口我也估计也类似),具体是:

TOOLTIP" alt=复制代码 src="https://yqfile.alicdn.com/img_51e409b11aa51c150090697429a953ed.gif" real_src="https://yqfile.alicdn.com/img_51e409b11aa51c150090697429a953ed.gif">

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

时间: 2024-11-02 16:32:20

C++ TOOLTIP使用再次介绍的相关文章

基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解_jquery

表单校验是页面开发中非常常见的一类需求,相信每个前端开发人员都有这方面的经验.网上有很多成熟的表单校验框架,虽然按照它们默认的设计,用起来没有多大的问题,但是在实际工作中,表单校验有可能有比较复杂的个性化的需求,使得我们用这些插件的默认机制并不能完成这些功能,所以要根据自己的需要去改造它们(毕竟自己还不到那个写一个完美的校验框架的层次).我用过formValidation这个校验框架,虽然它跟bootstrap配合地很好,但是校验风格太死板,不太满足个性化的场景:后来我找到了jquery.val

《循序渐进学Docker》——3.4 再次体验Docker

本节书摘来自华章出版社<循序渐进学Docker>一书中的第3章,第3.4节,作者李金榜 尹烨 刘天斯 陈纯,更多章节内容可以访问"华章计算机"公众号查看. 3.4 再次体验Docker 我们介绍了如何在Ubuntu系统下安装Docker,并且指出Ubuntu是对Docker支持最好的系统.这一节我们就再次介绍几个例子,让大家更深入地体验Docker. 3.4.1 再看个人博客WordPress的搭建 还记得第2章在Windows环境下通过两条Docker指令搭建WordPr

浅谈如何写好网站的介绍

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 刚才和一个网友聊天,说到网站介绍怎么写,平时随笔写写其它东西还好,可是要写自己的网站介绍的时候却不知道如何写!看了几个好友的网站发现几乎都没怎么写网站介绍,有的就干脆把网站描述写上去,问问他们,他们说不知道怎么写好网站介绍,看来很多站长都不敢写网站介绍!认真研究了一下四大门户网站和A5,看看它们是这样介绍网站的,我做了个小结与大家一起学习:

Java Map 集合类简介

集合 java.util 中的集合类包含 Java 中某些最常用的类. 最常用的集合类是 List 和 Map. List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建.存储和操作任何类型对象的元素列表. List 适用于按数值索引访问元素的情形. Map 提供了一个更通用的元素存储方法. Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值. 从概念上而言,您可以将 List 看作是具有数值键的 M

在 ASP.NET 2.0 中上载文件

asp.net 简介自引入 Microsoft ASP.NET 版本 1.0 之日起,就存在生成 Web 应用程序的内置方法,这些方法能够将文件上载到宿主服务器.这是通过使用 File Field HTML 服务器控件实现的.我以前写过一篇关于如何在 ASP.NET 应用程序中有效使用该控件的 MSDN 文章.本文将再次介绍文件上载过程,但不是使用 File Field 控件,我将向您介绍如何有效使用 ASP.NET 2.0 提供的新 FileUpload 服务器控件. 虽然本文向您介绍新增的

怎样在TMG下为SSTP_VPN申请通用多主机头名证书

其实在谈到如何在TMG下为SSTP_VPN申请证书,很多情况下我们都是进入证书申请页面,申请与您对外发布的VPN公网域名相同的证书,这类的文章网上有很多在这里我就不再次介绍了,在这里我主要想和大家谈的是如果在公司内有多台对外发布的VPN服务器的话,我们如果对每台都做一次申请,就有些繁琐了,我们可不可以像在Exchange 上那样申请一个通用的多主机头证书呢?这样我就可以只保存一个证书就好,让一个证书中就包含所有VPN服务器对外发布的域名,这样不仅简化了操作而且最终我们只需要维护保存好一份证书就可

Windows 8可降至Windows 7或Windows Vista

Windows 8 EULA用户许可协议中显示,购买预装Windows 8专业版PC的消费者有权降级至Windows 7专业版或是Vista商业版.如今Windows 8已经正式上市,在升级至Windows 8之前想必有不少用户关心能否降级的问题.今天,我们就来为大家再次介绍一下Windows 8降级权. 降级权利是微软提供给Windows用户的一项免费服务,并且已经在Windows软件许可条款中进行了罗列.降级权利提供了一种实用的解决方案: 1.购买预装Windows 8专业版的PC 2.可降

在ASP.NET 2.0中实现文件上载

自引入 Microsoft ASP.NET 版本 1.0 之日起,就存在生成 Web 应用程序的 内置方法,这些方法能够将文件上载到宿主服务器.这是通过使用 File Field HTML 服务器控件实现的.我以前写过一篇关于如何在 ASP.NET 应用程序中有效 使用该控件的 MSDN 文章.本文将再次介绍文件上载过程,但不是使用 File Field 控件,我将向您介绍如何有效使用 ASP.NET 2.0 提供的新 FileUpload 服务器控件. 虽然本文向您介绍新增的 FileUplo

谈谈Windows 8降级那些事儿

Windows 8 EULA用户许可协议中显示,购买预装Windows 8专业版PC的消费者有权降级至Windows 7专业版或是Vista商业版.如今Windows 8已经正式上市,在升级至Windows 8之前想必有不少用户关心能否降级的问题.今天,我们就来为大家再次介绍一下Windows 8降级权. 降级权利是微软提供给Windows用户的一项免费服务,并且已经在Windows软件许可条款中进行了罗列.降级权利提供了一种实用的解决方案: 1.购买预装Windows 8专业版的PC 2.可降