MFC_對話框項目建立一個CWnd

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

相關文章
相關標籤/搜索