MFC_对话框项目创建一个CWnd

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

先看一下效果图:

MFC_对话框项目创建一个CWnd_第1张图片

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.添加并显示到对话框中

在对话框的.h中

protected:
    CMDWnd m_mdwnd;

cpp

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:指定窗口的标题。

第三个参数: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 :相关的环境。

转载于:https://my.oschina.net/u/2930533/blog/3009548

你可能感兴趣的:(python)