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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.68/5 (11投票s)

2002 年 5 月 29 日

3分钟阅读

viewsIcon

279564

downloadIcon

5533

CDialogEx 和 CPropertySheetEx2 类从 CDialog 和 CPropertySheetEx 派生,支持状态栏、工具栏和工具提示

CDialogEx and CPropertySheetEx2

动机

当我看到 Nish 的文章,在对话框窗口中有一个状态栏时,我最终决定发布我的 CDialogExCPropertySheetEx2 类,支持状态栏、工具栏和工具提示。 很久以前,我遇到过类似的问题,当时我需要开发一个简单的应用程序,但界面不能太丑陋。

在对话框窗口中设置一个状态栏或工具栏并不是一项复杂的工作。 当你想正确地实现它时,情况会变得有点棘手——显示工具提示,以及这些工具提示对应的状态栏消息——这就是为什么通常会有状态栏的原因,不是吗? 幸运的是,我在 MSND 中找到了一些信息,并使其工作。

有一个示例 DLGCBR32,其中描述了如何将控件栏添加到 CDialog。 我的类基于此示例,并进行了扩展,以尽可能简单地使用其功能。

解决方案说明

CDialogCPropertySheet 不包含类似于 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。 如果在 bStatusBarTRUE 时未指定 pIndicatorsnIndicators,则 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
© . All rights reserved.