MFC创建窗口一般要经历以下四个操作步骤:
(1) 定义窗口类
主要指定窗口类的一些基本且必须指定的特征,窗口类的特征主要是由WNDCLASS结构体来定义的,
WNDCLASS的定义如下:
typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;
(2) 注册窗口类
窗口类经过第一步后,需要调用RegisterClass函数进行注册,注册成功后就可以创建此类型的窗口。函数原型如下:
ATOM RegisterClass(
CONST WNDCLASS *lpWndClass // address of structure with class
// data
);
(3) 创建窗口类实例
HWND CreateWindow(
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // handle to menu or child-window identifier
HANDLE hInstance, // handle to application instance
LPVOID lpParam // pointer to window-creation data
);
(4) 显示及更新窗口
当然创建窗口过后就可以调用ShowWindow()
来显示窗口了。
函数原型如下:
BOOL ShowWindow(
HWND hWnd, // handle to window
此
int nCmdShow // show state of window
);
显示窗口后紧接着要调用函数UpdateWindow()来刷新窗口,函数原型如下:
BOOL UpdateWindow(
HWND hWnd // handle of window ,此处的句柄就是CreateWindow()函数的返回值
);
到此时窗口就算创建成功了。
下面我用一个具体的程序来举个例子,方便大家理解:
#include<windows.h> //包含windows.h头文件
LRESULT CALLBACK WindowProc( HWND , UINT ,WPARAM , LPARAM ); //声明窗口函数
int APIENTRY WinMain(HINSTANCE hinstance ,HINSTANCE hPrevinstance , LPSTR lpcmdLine , int nCmdShow) //MFC下的程序入口函数WinMain(),传统的dos程序是以main()作为程序入口的,这一点不同
{
WNDCLASSwndclass; //定义窗口类结构体变量
HWNDhwnd; //定义窗口类句柄
MSGmsg; //定义消息结构体变量
wndclass.style=CS_HREDRAW|| CS_VREDRAW; //改变窗口大小则重绘
wndclass.lpfnWndProc=WindowProc; //窗口函数为WindowProc()
wndclass.cbClsExtra=0; //窗口类无扩展
wndclass.cbWndExtra=0; //窗口实例无扩展
wndclass.hInstance=hinstance; //注册窗口类实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //使用光标箭头
wndclass.hCursor=LoadCursor(NULL, IDC_HELP); //指定鼠标箭头的样式
wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); //窗口背景为黑色
wndclass.lpszMenuName=NULL; //窗口默认无菜单
wndclass.lpszClassName="Windows窗口创建"; //窗口类名为"Windows窗口创建"
if(!RegisterClass(&wndclass)) //此为注册类的函数
{
returnfalse; //注册不成功,返回false
}
//创建窗口的函数
hwnd=CreateWindow("Windows窗口创建" , //窗口类名为"Windows窗口创建"
"Windows窗口创建", //窗口的名称为“Windows窗口创建”,即窗口标题栏显示的窗口名称
WS_OVERLAPPEDWINDOW, //重叠式窗口
CW_USEDEFAULT,CW_USEDEFAULT, //窗口左上角在屏幕上的默认位置
CW_USEDEFAULT,CW_USEDEFAULT, //窗口的宽度和高度
NULL, //窗口无父类窗口
NULL, //窗口无主菜单
hinstance, //创建此窗口的实例句柄
NULL //此窗口无创建参数
);
ShowWindow(hwnd,nCmdShow); //显示窗口
UpdateWindow(hwnd); //不断的更新窗口的客户区
while(GetMessage(&msg,NULL,0,0)) //捕获消息
{
TranslateMessage(&msg); //键盘消息转换
DispatchMessage(&msg); //派送消息给窗口函数
}
returnmsg.wParam; //返回退出值
}
LRESULT CALLBACK WindowProc(HWND hwnd,UINTmessage,WPARAM wParam,LPARAM lParam) //窗口函数
{
switch(message)
{
caseWM_PAINT: //重画窗口客户区消息处理
HDChdc; //定义设备句柄
PAINTSTRUCTps; //定义绘图结构体变量
hdc=BeginPaint(hwnd,&ps); //获取要重画的窗口的设备描述表句柄
TextOut(hdc,15,20,"Windows窗口创建的过程!",22); //输出到窗口的文本
EndPaint(hwnd,&ps); //结束重画
return0;
caseWM_DESTROY: //撤销窗口消息处理
PostQuitMessage(0); //产生退出程序消息WM_QUIT
return0;
}
returnDefWindowProc(hwnd,message,wParam,lParam);
}
总结以下,MFC创建窗口的四个步骤
(1)定义窗口类
(2)注册窗口类
(3)创建窗口类的实例
(4)显示以及更新窗口
其实这四个步骤很好理解的,打个比方吧。不合适的话还请指教:
(A.)比如我们新生入学,肯定要按照学校的录取通知书要求填写档案,这就好比定义窗口类,MFC是属于微软的一个基础类,当然我们得准守微软的规则来定义窗口类,而录取通知书是学校发的,我们也得按照学校制定的格式填写录取通知书。
(B)填写录取通知书过后我们要将通知书拿到学校去注册个人信息,这就好比我们定义了窗口类,然后要在程序中去注册窗口类。
(C)在学校注册了个人档案后,我们就属于学校的学生了,就属于学校学生的类一个实例了,这就好比我们用注册的窗口类创建了一个窗口实例。
(D)在学校期间,我们的身体状况是不断变化的,所以学校会定期给学生体检,然后存入学校的档案。这就好比窗口的不断更新,我们不断的对窗口进行操作,而窗口要接收这些消息,就要不断的更新窗口。
不知道这个比方合不合适,由于本人水平所限,如有不妥还请指正,我怕误导了读者。