2019独角兽企业重金招聘Python工程师标准>>>
先看一下效果图:
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 :相关的环境。