窗口:
在MZFC中,窗口是所有可视化元素的载体,所有的控件和图形都在窗口中绘制。
MZFC中包含 CMzWnd 及 CMzWndEx 两个窗口类,其中 CMzWndEx 是用于派生用户界面窗口的基类, 它包含了控件管理器(WinManager),可以容纳各种MZFC控件。
MZFC中包含的窗口种类:
创建主窗口
class MyWnd : public CMzWndEx{…};
派生的用户界面主窗口类还需要重载 CMzWndEx 的虚函数OnInitDialog()来初始化窗口中的内容:
// @brief 当MZFC窗口被创建时,会调用此成员函数以初始化窗口. // @return FALSE: 初始化失败, TRUE: 初始化成功. // @see CMzWnd::Create() virtual BOOL OnInitDialog() { // 必须先调用基类的初始化 if (!CMzWndEx::OnInitDialog()) { return FALSE; } // 添加您的初始化代码... // ... return TRUE; }
注意:在重载此函数中,请先调用所继承类的此成员函数,再添加您的初始化代码。
用户界面主窗口类还可重载以下的虚函数处理窗口的消息:// @brief 当窗口收到 ::MZ_WM_COMMAND 消息,此成员函数会被调用 // 重载此函数以处理命令消息 // @see MZ_WM_COMMAND virtual void OnMzCommand(WPARAM wParam, LPARAM lParam); // MZFC 的消息处理函数 virtual LRESULT MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam);
// @brief 创建窗口 // 创建模态窗口建议使用 CreateModalDialog,创建子窗口建议使用 CreateChildWindow // @param style 0: 创建普通窗口; WS_CHILD: 创建子窗口; WS_POPUP:创建模态窗口(需要调用DoModal()以弹出的窗口) // @param xPos x 坐标 // @param yPos y 坐标 // @param width 窗口宽度 // @param height 窗口高度 // @param hwndParent 父窗口句柄 // @param uID 窗口ID // @param style 窗口的风格:Windows Styles // @param exstyle 窗口的扩展风格:Extended Windows Styles // @see CreateModalDialog, CreateChildWindow // - hwndParent, uID, style, & exstyle 与 Win32 中 CreateWindow() API 的参数含义相同. virtual BOOL Create(int xPos, int yPos, int width, int height, HWND hwndParent=NULL, int uID = NULL, DWORD style=WS_CHILD, DWORD exstyle=0);
应用程序调用 CMzWnd::Show 函数显示用户界面主窗口:
// 显示、隐藏窗口. void Show(bool bShow=true, bool bBringTop=true);
调用窗口类的Show函数,此时应用程序就会调用主窗口以及主窗口中各控件的PaintWin函数进行绘制
模态窗口、子窗口:
Win32 API中的模态窗口概念,在MZFC中仍然适用。
通过以下方法可以把窗口创建为模态窗口:
当然,Win32 API中的子窗口概念,在MZFC中也同样适用。
通过以下方法可以把窗口创建为子窗口:
窗口切换动画:
MZFC内置了多种动画类型,可以在窗口切换的时候使用,以提高用户体验。
目前包含的动画类型有:
// 动画类型: (1:当前画面; 2: 新画面) #define MZ_ANIMTYPE_NONE 0 //< 无动画 #define MZ_ANIMTYPE_SCROLL_BOTTOM_TO_TOP_2 1 //< 2从下往上滚动出现, 1静止并消失 #define MZ_ANIMTYPE_SCROLL_TOP_TO_BOTTOM_2 3 //< 2从上往下滚动出现, 1静止并消失 #define MZ_ANIMTYPE_SCROLL_LEFT_TO_RIGHT_2 5 //< 2从左往右滚动出现, 1静止并消失 #define MZ_ANIMTYPE_SCROLL_RIGHT_TO_LEFT_2 7 //< 2从右往左滚动出现, 1静止并消失 #define MZ_ANIMTYPE_SCROLL_BOTTOM_TO_TOP_1 4 //< 1往上滚动并消失, 2静止并出现 #define MZ_ANIMTYPE_SCROLL_TOP_TO_BOTTOM_1 2 //< 1往下滚动并消失, 2静止并出现 #define MZ_ANIMTYPE_SCROLL_LEFT_TO_RIGHT_1 8 //< 1往右滚动并消失, 2静止并出现 #define MZ_ANIMTYPE_SCROLL_RIGHT_TO_LEFT_1 6 //< 1往左滚动并消失, 2静止并出现 #define MZ_ANIMTYPE_SCROLL_BOTTOM_TO_TOP_PUSH 9 //< 2从下至上推着1一起滚动并出现 #define MZ_ANIMTYPE_SCROLL_TOP_TO_BOTTOM_PUSH 10 //< 2从上至下推着1一起滚动并出现 #define MZ_ANIMTYPE_SCROLL_LEFT_TO_RIGHT_PUSH 11 //< 2从左至右推着1一起滚动并出现 #define MZ_ANIMTYPE_SCROLL_RIGHT_TO_LEFT_PUSH 12 //< 2从右至左推着1一起滚动并出现 #define MZ_ANIMTYPE_ZOOM_IN 13 //< 2不断放大出现 #define MZ_ANIMTYPE_ZOOM_OUT 14 //< 1不断缩小至不见 #define MZ_ANIMTYPE_FADE 15 //< 淡出
通过 CMzWnd::AnimateWindow(UINT nAnimType, bool bShow) 即可调用窗口动画,示例伪代码:MyWnd *pWnd = new MyWnd; pWnd->Create(....); pWnd->AnimateWindow(MZ_ANIMTYPE_ZOOM_IN, true); pWnd->Show();
假如窗口是模态窗口,则使用以下方法调用动画:MyDialog *pDlg = new MyDialog; pDlg->CreateModalDialog(...); pDlg->SetAnimateType_Show(MZ_ANIMTYPE_SCROLL_RIGHT_TO_LEFT_PUSH); pDlg->SetAnimateType_Hide(MZ_ANIMTYPE_SCROLL_LEFT_TO_RIGHT_PUSH); pDlg->DoModal(); delete pDlg;
窗口矩形
使用MzGetWorkArea()函数可获取当前屏幕的工作区,矩形(left, top, right, bottom)是相对于整个屏幕而言的。// 获取当前屏幕工作区 RECT MzGetWorkArea();如图所示:
![]()
使用MzGetClientRect()函数可获取当前窗口的客户区,矩形(left, top, right, bottom)是相对于当前窗口而言的。// 获得窗口客户区矩形 RECT CMzWnd::MzGetClientRect(void);如图所示,通话记录窗口的客户区:
![]()
使用MzGetWindowRect()函数可获取当前窗口相对于整个屏幕的矩形。// 获得窗口矩形 RECT CMzWnd::MzGetWindowRect(void);如图所示,通话记录窗口的矩形:
![]()