先看一下效果圖: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 :相關的環境。