65.9K
CodeProject 正在变化。 阅读更多。
Home

CToolTipDialog 类:一个简单的 WTL 类,用于在对话框中启用工具提示

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (13投票s)

2003年11月10日

CPOL

4分钟阅读

viewsIcon

170928

downloadIcon

3546

将这个小类添加到您现有的对话框继承列表中,即可在控件和对话框上获得漂亮的工具提示。

Sample Image - TTDialogDemo.gif

引言

我正在开发一个有很多对话框的 WTL 应用程序,所以我搜索了一些以直接方式实现对话框工具提示的代码。我找到了很多有趣的代码,但没有一个真正符合我的需求,所以我编写了这个简单的类,它几乎能满足我的所有需求。希望它也能满足你的需求。

使用代码

首先

在使用代码之前,您必须在您的 VC 项目中包含 atlctrls.hToolTipDialog.h。将代码插入的最佳位置是您的 stdafx.h 文件的末尾,否则您必须将其添加到您(现有和未来的)每个对话框文件的头文件中。

//

// stdafx.h : include file for standard system include files,

// or project specific include files that are used frequently, but

// are changed infrequently

//

  ...
  ...
#include <atlctrls.h>

#include "ToolTipDialog.h"

顺便说一句,如果您想使用漂亮的气球样式,您必须在 stdafx.h 的开头设置正确的 _WIN32_IE 版本。WTL Appwizard 默认将其设置为 0x0400,您将在此样式下进行编译。

//

// stdafx.h : include file for standard system include files,

// or project specific include files that are used frequently, but

// are changed infrequently

//

#define _WIN32_IE 0x0500

非常简单的用法

这就是您将在示例“关于”对话框中找到的内容。

在任何 CDialogImpl 派生类中,例如 appwizard 生成的 CAboutDlg 或您现有的任何 CDialogImpl<MyDialog>,请执行以下操作:

  • CToolTipDialog<CMyDialog> 添加到继承列表中。
    //
    
    
    class CAboutDlg : public CDialogImpl<CAboutDlg>, 
        public CToolTipDialog<CAboutDlg>
        {
  • CHAIN_MSG_MAP(CToolTipDialog<CMyDialog>) **放在**您的对话框消息映射的**顶部**。
    //
    
    
        BEGIN_MSG_MAP(CAboutDlg)
            CHAIN_MSG_MAP(CToolTipDialog<CAboutDlg>)

您就快完成了。

从现在开始,在对话框初始化时,将创建一个 CToolTipCtrl,并且所有 ID 不等于 IDC_STATIC 的对话框控件都将-如果字符串表中有-获取与 ID 相同的字符串作为工具提示。如果没有这样的字符串,您将不得不使用 TTSetTxt(稍后查看)。

您的“关于”对话框中的大多数控件很可能是静态控件,并且具有 IDC_STATIC ID,因此您可能需要更改它们的 ID 并创建其工具提示字符串。

转到对话框编辑器,选择“关于”对话框,选择应用程序图标,转到属性,为图标控件指定一个特定 ID,例如 IDC_APPICON,并且不要忘记**选中“通知”属性**。对于静态文本也是如此,我们称之为 IDC_APPTEXT

转到字符串表编辑器,为控件创建初始工具提示字符串。这就是您可以在示例中找到的,并将其粘贴到您的字符串表编辑器中:

  • IDC_APPICON 这是应用程序图标
  • IDC_APPTEXT 这是应用程序版权和版本

最后,为**整个对话框**创建一个字符串表条目,使用您的对话框 IDD_xxx

  • IDD_ABOUTBOX 这个“关于”对话框正在显示关于它自己的信息提示。

您完成了。构建并享受。

使用简单

这就是您将在示例主对话框中找到的内容。

由于您的对话框继承自 CToolTipDialog,您可以:

  • 激活或停用工具提示控件:void TTActivate( BOOL bActivate )
  • 设置工具提示宽度:void TTSize( int nPixel )
  • 设置控件或整个对话框的工具提示文本:
    • 按 ID:void TTSetTxt( UINT idTool, _U_STRINGorID text )
    • HWNDvoid TTSetTxt( HWND hTool, _U_STRINGorID text )

两个 TTSetTxt 方法都接受资源 ID 或 LPTSTR 作为第二个参数。对于拥有控件成员的控件和没有 ID 的整个对话框,您应该使用 HWND

以下是示例中利用这些方法的代码:

LRESULT CMainDlg::OnBnClickedActivate(WORD /*wNotifyCode*/, 
                 WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{    
    TTActivate( IsDlgButtonChecked( wID ));
    return 0;
}

LRESULT CMainDlg::OnEnChangeEditTt(WORD /*wNotifyCode*/, 
               WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    ...  
    TTSetTxt( m_hWnd , txt );
    ...
}

LRESULT CMainDlg::OnNMReleasedcaptureSizeTt(int idCtrl, 
               LPNMHDR /*pNMHDR*/, BOOL& /*bHandled*/
{ 
    TTSize( 4 * SendDlgItemMessage(idCtrl,TBM_GETPOS,0,0)); 
    return 0; 
}

高级用法

GetTT() 成员将返回一个 CToolTipCtrl(或稍后看到的其他控件)的引用,您可以通过它执行任何操作。

例如:

//

...
CToolTipCtrl & rTT=GetTT();
rTT.SetDelayTime( TTDT_AUTOPOP, 10000 )// set the show delay to 10 seconds

... 

如果您想更改工具提示控件的初始样式:

您可以在对话框类的构造函数中更改它。使用不同的参数构造工具提示,但请记住 TTF_SUBCLASS 是使其正常工作的原因。构造函数是:

CToolTipDialog::CToolTipDialog( UINT uTTSTyle= TTS_NOPREFIX | TTS_BALLOON ,
     UINT uToolFlags = TTF_IDISHWND | TTF_SUBCLASS )

如果您动态添加控件:

您可以为它们关联一个工具提示,使用:

  • BOOL TTAdd( HWND hTool )
  • BOOL TTAdd( UINT idTool )

两者都将创建工具提示并为其分配具有相同控件 ID 的字符串(如果存在)。它们成功时返回 TRUE,失败时返回 FALSE

如果您动态删除控件:

请谨慎使用:

  • void TTRemove( HWND hTool )
  • void TTRemove( UINT idTool )

在删除之前。

对于任何带有控件或子窗口的窗口,

如果它不是对话框或属性页,您将不得不显式调用 void TTInit()。如果您想要一个默认的工具提示字符串,您的类必须有一个 IDD 成员(就像对话框类一样):只需在类声明中插入:

  • enum { IDD = IDD_MYWINDOW };

并在字符串表中放置相关字符串。

非常高级的用法

您可以使用自己的工具提示类,只需通过第二个模板参数声明它:

//


class CMyDlg : public CDialogImpl<CMyDlg>, 
    public CToolTipDialog<CMyDlg, CMyToolTip>
    {

GetTT() 成员将返回 CMyToolTip 的引用。如果您的工具提示控件成员具有相同的签名,例如 CMyToolTip 派生自 CToolTipCtrl,则您无需从 CToolTipDialog 派生。

最后

总之,在对话框中拥有工具提示非常容易,前提是您不尝试管理所有这些 TTN_xxx

© . All rights reserved.