windows应用程序组成结构如下:
- WinMain函数(入口函数)
- WndProc函数(窗口处理函数)
WinMain函数主要是为了:
- 注册窗口类,建立窗口及其他初始化工作
- 进入消息循环,从消息队列接受消息,调用相应的处理过程
- 消息循环解锁到WM_QUIT停止
WndProc主要是对接受到的不同消息来完成具体的操作。
WinMain要做的五件事:
- 窗口类定义
- 注册窗口类
- 创建窗口
- 显示窗口
- 消息循环
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//第一大部分 WinMain函数,程序入口
//?前两个参数分别代表当前实例句柄,其他实例句柄,第三个是指向程序命令行参数的指针,第四个是应用程序开始执行时窗口显示方式的整数值标识。?
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow){
HWND hwnd;
MSG Msg;
WNDCLASS wndclass;
char lpszClassName[]="窗口"; //窗口类名
char lpszTitle[]="My_Windows"; //窗口标题名
//窗口类的定义
wndclass.style=0;//窗口类型为默认
wndclass.lpfnWndProc=WndProc;//设置窗口的处理函数
wndclass.cbClsExtra=0;//窗口类无扩展 ?
wndclass.cbWndExtra=0;//窗口实例无扩展 ?
wndclass.hInstance=hInstance; //当前实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标采用默认
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//箭头光标
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//获取系统提供的背景刷
wndclass.lpszMenuName=NULL;//窗口中无菜单
wndclass.lpszClassName=lpszClassName;//窗口类名为lpszClassName
//窗口类的注册
if(!RegisterClass(&wndclass)){
MessageBeep(0);
return FALSE;
}
//创建窗口
hwnd=CreateWindow(
lpszClassName,//窗口类名
lpszTitle,//窗口实例标题名
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);
}
return Msg.wParam;
}
//WndProc的实现
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
switch(message){
case WM_DESTROY:
PostQuitMessage(0);//发出WM_QUIT消息
default:
return DefWindowProc(hwnd,message,wParam,lParam);//默认的消息处理函数(在消息没有被直接处理时,都被该函数处理)
}
return 0;
}