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






4.83/5 (13投票s)
将这个小类添加到您现有的对话框继承列表中,即可在控件和对话框上获得漂亮的工具提示。
引言
我正在开发一个有很多对话框的 WTL 应用程序,所以我搜索了一些以直接方式实现对话框工具提示的代码。我找到了很多有趣的代码,但没有一个真正符合我的需求,所以我编写了这个简单的类,它几乎能满足我的所有需求。希望它也能满足你的需求。
使用代码
首先
在使用代码之前,您必须在您的 VC 项目中包含 atlctrls.h 和 ToolTipDialog.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 )
- 按
HWND
:void TTSetTxt( HWND hTool, _U_STRINGorID text )
- 按 ID:
两个 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
。