MDI UI 的轻量级基类
CMDIBase 模板为基于 WinCE WTL 的项目提供多视图 UI 支持。
引言
WTL 是一个非常有用的 Windows 编程模板库,尤其是对于 Pocket PC 和 SmartPhone(甚至不支持 MFC)。但是,当我在 SmartPhone 和 Pocket PC 上实现多视图应用程序时,遇到了一个障碍。 WTL 无法在 WinCE 中创建 MDI 项目。并且,我尝试在桌面上移植一个 MDI 项目;不幸的是,我失败了。所以,我决定自己创建一个 MDI 支持类,上帝保佑我。它并不像我最初想的那么困难。
我创建了一个名为 CMDIBase
的模板类。您可以从您的 MainFrame 类继承它,像这样
#include "MDIBase.h" class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler, public CMDIBase<CMainFrame>
然后在 CMainFrame
的消息映射中添加一个消息链
CHAIN_MSG_MAP(CMDIBase<CMainFrame>)
并使用 CMDIBase
中的函数
InitailToolBar SwitchView EnableUIItem
使用 SwithView
将当前视图更改为您想要显示的下一个视图,并更改菜单和工具栏。如果将第三个参数设置为 TRUE
,则确定按钮将显示在标题栏上,您可以处理此按钮的 IDOK
的命令 ID。
LRESULT OnView1(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { //SwitchView(m_view,IDR_VIEW1); SwitchView(m_myview,IDR_VIEW1,TRUE); return 0; }
使用 EnableUIItem
将菜单项和工具栏项设置为启用或禁用样式。像这样
LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { CAboutDlg dlg; dlg.DoModal(); EnableUIItem(IDR_MAINFRAME,ID_APP_ABOUT); return 0; }
EnableUIItem
的第一个参数是菜单栏的资源 ID,第二个参数是菜单项和工具栏项的标识 ID。
描述
这个类是一个基于 WTL 的模板类,并且只适用于 WinCE,因为如果您可以在桌面上创建一个 WTL MDI 项目,它就不是那么有用了。
注意:
CMDIBase
必须在 SDI WTL 项目中使用。
创建此类是为了为基于 WinCE WTL 的项目添加多视图 UI 支持。
它提供了一些用于更改视图以及与视图相关的菜单栏或工具栏的函数。您可以更新菜单栏或工具栏中命令项的状态。最重要的是,它提供了一种更合理的方式来处理正确位置的消息。就像在 MFC MDI 项目中一样,您可以在相关的视图类中处理菜单命令;而不像在 WTL MDI 项目中,您很难将消息链接到视图,并且所有命令消息必须由主框架处理。
//#define _WINCE_SMARTPHONE
MDIBase.h 中 _WINCE_SMARTPHONE
的定义是更改 SmartPhone 的 CMDIBase
的关键,并将删除 SmartPhone 上不支持的相同功能。
以下列表显示了 CMDIBase
中的主要函数
InitailToolBar
:它只是调用一个创建工具栏函数和一个移动窗口函数。如果不调用移动窗口,则无法正确显示主框架。SwitchView
:切换到您想要显示的视图,并加载相关的菜单和工具栏。menuID
和toolbarID
必须统一。EnableUIItem
:将菜单项和工具栏项设置为启用/禁用。
CUIUpdate
类不适用于这些,但它可以正确设置检查状态。因此,setcheckstatus
函数未添加到 CMDIBase
中。