MFC怎么封装CreateWindow

2025-05-10 00:41:26
推荐回答(2个)
回答1:

创建窗口的函数CreateWindow在MFC中被封装到了CWnd中,所以凡是继承自CWnd的类都可以生成窗口。
以CFrameWnd为例说明怎么封装的(它继承自CWnd).

(1) m_pMainWnd = new CMyFrameWnd;//实例化类CMyFrameWnd,调用它的构造函数
(2) CMyFrameWnd::CMyFrameWnd(){
Create(....); //该虚函数没被重写,所以调用父类CFrameWnd的Create函数
}
(3) BOOL CFrameWnd::Create(.....){ //见MFC源码winfrm.cpp
//其他代码
CreateEx(.....); //又是虚函数没改写,于是调用父类CWnd的CreateEx函数
}
(4) BOOL CWnd:CreateEx(.....){ //见MFC源码wincore.cpp
CREATESTRUCT cs;
//对cs的一系列初始化,这里的CREATESTRUCT跟Win32中的WNDCLASSEX起类似作用,最后它的值会与WNDCLASS的类关联起来的
PreCreateWindow(cs); //该虚函数就是作注册窗口的作用.它被CFrameWnd改定了.见第(5)步
AfxHookWindowCreate(this); //钩子函数,跟窗口回调函数有关
HWND hWnd = ::AfxCtxCreateWindowEx(.....); //正式创建窗口了,跟CreateWindow的作用一样.
}

回答2:

定义一个CEdit变量,和一个ID号
#define ID_EDIT 1000
CEdit m_edit;
m_edit.Create(ID_EDIT, this); //创建控件
m_edit.ModifyStyle( /*要去掉的属性*/,/*要加入的属性*/ , UINT nFlags = 0 );