先看一下效果图:windows
1.首先建立一个继承于CWnd的类框架
mdWnd.h函数
#pragma once class CMDWnd : public CWnd { public: CMDWnd(); DECLARE_DYNCREATE(CMDWnd) virtual ~CMDWnd(); public: CMdWnd* GetMdWnd(); void CreateMdWnd(HWND hWnd); protected: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual BOOL PreTranslateMessage(MSG* pMsg); virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); protected: afx_msg int OnCreate(LPCREATESTRUCT lpcs); afx_msg void OnPaint(); afx_msg BOOL OnEraseBkgnd(CDC* pDC); DECLARE_MESSAGE_MAP() protected: CMdWnd* m_pMdWnd; };
mdWnd.cpp动画
#include "stdafx.h" #include "mdWnd.h" CMDWnd::CMDWnd() { m_pMdWnd = NULL; } CMDWnd::~CMDWnd() { if (m_pMdWnd) { ::mdDestroyWnd(m_pMdWnd); m_pMdWnd = NULL; } } // CMDWnd IMPLEMENT_DYNCREATE(CMDWnd, CWnd) BEGIN_MESSAGE_MAP(CMDWnd, CWnd) ON_WM_CREATE() ON_WM_PAINT() ON_WM_ERASEBKGND() END_MESSAGE_MAP() BOOL CMDWnd::PreCreateWindow(CREATESTRUCT& cs) { // CREATESTRUCT cs 来修改窗口类或样式 return CWnd::PreCreateWindow(cs); } int CMDWnd::OnCreate(LPCREATESTRUCT lpcs) { HWND hWnd = 0; CWnd* pWnd = FromHandle(hWnd); int rt = CWnd::OnCreate(lpcs); CreateMdWnd(GetSafeHwnd()); return rt; } LRESULT CMDWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if (m_pMdWnd) { MdResult rt = m_pMdWnd->windowProc(message, wParam, lParam); if (md_OK != rt) { return 1L; } } return __super::WindowProc(message, wParam, lParam); } void CMDWnd::OnPaint() { CPaintDC dc(this); // device context for painting // 不为绘图消息调用 __super::OnPaint() } BOOL CMDWnd::OnEraseBkgnd(CDC* pDC) { if (m_pMdWnd) { return TRUE;//__super::OnEraseBkgnd(pDC); } return __super::OnEraseBkgnd(pDC); } CMdWnd* CMDWnd::GetMdWnd() { return m_pMdWnd; } void CMDWnd::CreateMdWnd(HWND hWnd) { m_pMdWnd = ::mdCreateWnd(hWnd); //m_pMdWnd->addReactor(new CMdWndReactorTest(m_pMdWnd)); if (m_pMdWnd) { m_pMdWnd->loadDefaultTemplate(); } } BOOL CMDWnd::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_CHAR) { return false; } return CWnd::PreTranslateMessage(pMsg); }
2.添加并显示到对话框中this
在对话框的.h中code
protected: CMDWnd m_mdwnd;
cppblog
BOOL XXXDlg::OnInitDialog() { ShowWindow(SW_MAXIMIZE);//对话框默认最大化弹出 CRect rect; GetClientRect(rect); rect.InflateRect(-2,-2,-2,-2); m_mdwnd.Create(NULL, NULL, WS_CHILD | WS_VISIBLE, rect, this, 1); } void XXXDlg::OnSize(UINT nType, int cx, int cy) { __super::OnSize(nType, cx, cy); if (m_mdwnd.GetSafeHwnd()) { m_mdwnd.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_SHOWWINDOW); } }
CWnd::Create的定义形式为:继承
virtual BOOL Create(LPCTSTR lpszClassName,LPCTSTR lpszWindowName, DWORD dwStyle,const RECT& rect,CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
第一个参数:lpszClassName:指定WNDCLASS窗口类,设为NULL是代表以MFC内建的窗口类产生一个标准的外框窗口。事件
第二个参数:lpszWindowName:指定窗口的标题。it
第三个参数:dwStyle:指定窗口风格。
(1)默认值:WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME |WS_MINIMIZEBOX | WS_MAXIMIZEBOX
(2)WS_CHILD :指定子窗口。不能与WS_POPUP样式一块儿使用。在建立窗口后不该更改此设置.
(3)WS_CLIPCHILDREN :在父窗口中绘制时,排除子窗口占用的区域。在建立父窗口时使用。Windows CE-windows老是具备WS_CLIPCHILDREN样式。
(4)WS_CLIPSIBLINGS :排除窗口上方的兄弟窗口占用的区域。相对剪辑子窗口;当一个特定的子窗口接收到绘画消息时,WS_CLIPSIBLINGS 样式将全部其余重叠的子窗口剪辑到要更新的子窗口的区域以外。(若是没有给出WS_CLIPSIBLINGS 且子窗口重叠,则在子窗口的客户端区域内绘制时,能够在相邻的子窗口的客户端区域内绘制)。仅用于WS_CHILD样式。
(5)WS_DISABLED :指定最初禁用的窗口。禁用的窗口没法接收用户的输入。
(6)WS_EX_NOACTIVATE :指定没法激活窗口。若是子窗口具备此样式,则轻击它不会致使其顶级父窗口被激活。仍将接收手写笔事件,但它及其子窗口都没法得到焦点。
(7)WS_EX_NOANIMATION :防止窗口显示动画爆炸和内爆矩形,并在任务栏上有一个按钮。
(8)WS_EX_NODRAG :指定不能被其标题栏拖动的静止窗口。
(9)WS_EX_TOPMOST :该窗口将被放置并保持在全部非顶部窗口之上。要添加或删除此样式,请使用SetWindowPos函数。
(10)WS_GROUP :指定一组控件的第一个控件。用户能够在其中使用箭头键从一个控件移动到下一个控件。这种样式主要用于建立对话框。组由第一个控件和在它以后定义的全部控件组成,在第一个控件以后使用WS_GROUP样式FALSE定义的全部控件都属于同一组。每一个组中的第一个控件一般具备WS_TABSTOP样式。
(11)WS_POPUP :指定弹出窗口。不能与WS_CHILD样式一块儿使用。在建立窗口以后,不该更改此样式。
(12)WS_TABSTOP :指定当用户按TAB键时能够接收键盘焦点的控件。此样式主要用于在对话框中建立控件时。按TAB键将键盘焦点更改成下一个具备WS_TABSTOP样式的控件。
(13)WS_VISIBLE:指定最初可见的窗口。能够打开和关闭此样式以更改窗口可见性。
(14)WS_BORDER :指定具备细线边框的窗口。
(15)WS_CAPTION :指定带有标题栏和边框(默认WS_BORDER边框)的窗口。不能与WS_DLGFRAME样式一块儿使用。
(16)WS_DLGFRAME :指定具备对话框边框样式的窗口。具备这种风格的窗口不能有标题栏。
(17)WS_EX_CAPTIONOKBTN :在标题栏中包含OK按钮。
(18)WS_EX_CLIENTEDGE :指定具备下陷边缘的边框的窗口。
(19)WS_EX_CONTEXTHELP :在窗口的标题栏中包含一个Help按钮(?)。
(20)WS_EX_DLGMODALFRAME :指定具备双边框的窗口。
(21)WS_EX_OVERLAPPEDWINDOW :组合WS_EX_CLIENTEDGE和WS_EX_WINDOWEDGE样式。
(22)WS_EX_STATICEDGE :指定具备三维边框样式的窗口。此样式应用于不接受用户输入的项。
(23)WS_EX_WINDOWEDGE :指定带凸边的窗口边框。
(24)WS_HSCROLL :指定具备水平滚动条的窗口。
(25)WS_OVERLAPPED :建立一个重叠窗口。重叠窗口一般有标题和边框。指定具备WS_BORDER和WS_CAPTION 样式的窗口。
(26)WS_SYSMENU :指定标题栏上带有窗口菜单的窗口。与WS_CAPTION 样式一块儿使用。Windows CE没有系统菜单,可是可使用WS_SYSMENU样式将标准的Close (X)按钮添加到窗口标题栏。
(27)WS_VSCROLL :指定具备垂直滚动条的窗口。
(28)WS_MAXIMIZE :建立最大大小的窗口。
(29)WS_MAXIMIZEBOX :建立一个带有最大化按钮的窗口。
(30)WS_MINIMIZE :建立最初最小化的窗口。仅用于WS_OVERLAPPED 样式。
(31)WS_MINIMIZEBOX :建立带有最小化按钮的窗口。
(32)WS_POPUPWINDOW :建立一个带有WS_BORDER、WS_POPUP和WS_SYSMENU样式的弹出窗口。必须将WS_CAPTION 样式与WS_POPUPWINDOW样式组合在一块儿才能使控件菜单可见。
(33)WS_THICKFRAME :建立具备可用于调整窗口大小的厚框架的窗口。
第四个参数:rect:指定窗口的大小。
第五个参数:pParentWnd:指定父窗口。
第六个参数:nID:子窗口的id。
第七个参数:pContext :相关的环境。