CDialogEx, CPropertySheetEx2 类,带状态栏、工具栏和工具提示






4.68/5 (11投票s)
2002 年 5 月 29 日
3分钟阅读

279564

5533
CDialogEx 和 CPropertySheetEx2 类从 CDialog 和 CPropertySheetEx 派生,支持状态栏、工具栏和工具提示
动机
当我看到 Nish 的文章,在对话框窗口中有一个状态栏时,我最终决定发布我的 CDialogEx
和 CPropertySheetEx2
类,支持状态栏、工具栏和工具提示。 很久以前,我遇到过类似的问题,当时我需要开发一个简单的应用程序,但界面不能太丑陋。
在对话框窗口中设置一个状态栏或工具栏并不是一项复杂的工作。 当你想正确地实现它时,情况会变得有点棘手——显示工具提示,以及这些工具提示对应的状态栏消息——这就是为什么通常会有状态栏的原因,不是吗? 幸运的是,我在 MSND 中找到了一些信息,并使其工作。
有一个示例 DLGCBR32,其中描述了如何将控件栏添加到 CDialog
。 我的类基于此示例,并进行了扩展,以尽可能简单地使用其功能。
解决方案说明
CDialog
和 CPropertySheet
不包含类似于 CFrameWnd
的函数,CFrameWnd
在其中完成与控件栏相关的所有消息处理。 对于未从 CFrameWnd
派生的窗口,有必要复制此功能。 但是,如果要支持模式和无模式对话框窗口,则此任务会更加困难,因为并非所有消息都按您期望的方式发送。
正如您从以下消息映射中看到的那样
BEGIN_MESSAGE_MAP(CDialogEx, CDialog) //{{AFX_MSG_MAP(CDialogEx) ON_WM_ENTERIDLE() ON_MESSAGE(WM_POPMESSAGESTRING, OnPopMessageString) ON_MESSAGE(WM_SETMESSAGESTRING, OnSetMessageString) ON_WM_MENUSELECT() ON_UPDATE_COMMAND_UI(ID_INDICATOR_NUM, OnUpdateKeyIndicator) ON_UPDATE_COMMAND_UI(ID_VIEW_STATUS_BAR, OnUpdateStatusBarMenu) ON_COMMAND(ID_VIEW_STATUS_BAR, OnStatusBarCheck) ON_COMMAND(ID_VIEW_TOOLBAR, OnToolBarCheck) ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateToolBarMenu) ON_WM_MOUSEMOVE() ON_WM_INITMENUPOPUP() ON_MESSAGE(WM_KICKIDLE, OnKickIdle) ON_UPDATE_COMMAND_UI(ID_INDICATOR_CAPS, OnUpdateKeyIndicator) ON_UPDATE_COMMAND_UI(ID_INDICATOR_SCRL, OnUpdateKeyIndicator) ON_COMMAND(IDOK, OnOK) ON_COMMAND(IDCANCEL, OnCancel) //}}AFX_MSG_MAP ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText) END_MESSAGE_MAP()
有一个 WM_ENTERIDLE
消息的处理程序,其中 CFrameWnd
处理 WM_ENTERIDLE
以更新状态栏。 只有当 CDialog
是模式的并且不是主应用程序窗口时,同样的情况才适用于 CDialog
。 针对不同情况的解决方法是处理 WM_KICKIDLE
。 消息映射的其余部分用于处理工具提示的消息和更新用户界面(菜单和状态栏)。
用法
使用 CDialogEx
就像从 CDialog
派生对话框类一样简单。 您可以使用类向导从 CDialog
派生对话框,然后只需将所有对 CDialog
的引用替换为 CDialogEx
。 您必须实现 OnInitDialog()
并在其中调用函数 InitDialogEx()
。
BOOL InitDialogEx(BOOL btool tips = FALSE, BOOL bStatusBar = FALSE, UINT *pIndicators = NULL, UINT nIndicators = 0, UINT uiToolBar = 0, DWORD dwToolBarStyle = TBSTYLE_FLAT | WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
如果要使用工具提示,请将 btool tips
设置为 TRUE
。 如果要显示状态栏,请将 bStatusBar
设置为 TRUE
。 如果在 bStatusBar
为 TRUE
时未指定 pIndicators
和 nIndicators
,则 CDialogEx
将显示一个默认状态栏,其中包含 Num Lock、Caps Lock 和 Scroll Lock 的指示器。 否则,您可以在这些参数中为自己的状态栏提供定义。 参数 uiToolBar
是您的工具栏的资源 ID,其样式在 dwToolBarStyle
中指定。
最后要做的是将字符串 AFX_IDS_IDLEMESSAGE
添加到您的资源中。 它的 ID 必须为 57345。当应用程序处于空闲状态时,此字符串将显示在状态栏中,通常您可以使用类似“就绪”的字符串。
相同的设置适用于使用 CPropertySheetEx2
。 仅从 InitDialogEx()
调用的函数名称为 InitPropertySheetEx2()
,还有一个参数用于要显示的菜单的资源 ID。 当然,您必须从 CPropertyPageEx2
类派生您的页面。
演示程序
演示程序 CDialogExDemo 和 CPropertySheetEx2Demo 演示了在不同场景中使用 CDialogEx
,例如作为模式或无模式主应用程序窗口,或作为子窗口。
历史
- 2002 年 9 月 24 日 - 修复了一些错误,新的 CPropertySheetEx2 演示程序 - 感谢 Cyril Boutamine 和 Jonathan de Halleux