分为四步:
一、定义窗口类
二、初始化窗口
三、创建窗口
四、处理消息
#include <windows.h>
HINSTANCE hinst;
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
//主函数里创建窗口
//定义窗口类
WNDCLASSEX wcx;//窗口类变量
HWND hwnd;//窗口句柄,创建窗口后得到
MSG msg;//消息变量
BOOL fGotMessage;//是否取到了消息
hinst=hinstance;//保存实例句柄
//初始化窗口类
wcx.lpszClassName="MainWClass";//窗口名称
wcx.cbSize=sizeof(wcx);//窗口大小
wcx.style=CS_HREDRAW|CS_VREDRAW;//是否重画
wcx.lpfnWndProc=MainWndProc;//窗口过程
wcx.cbClsExtra=0;//不适用类内存
wcx.cbWndExtra=0;//不适用窗口内存
wcx.hInstance=hinstance;//实例句柄
wcx.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口大图标
wcx.hIconSm=(HICON)LoadImage(hinstance,//窗口小图标
MAKEINTRESOURCE(5),//从5号资源取图片
IMAGE_ICON,//图片类型
GetSystemMetrics(SM_CXSMICON),//图片的宽为标准小图标的宽度
GetSystemMetrics(SM_CYSMICON),//图片的高为标准小图标的高度
LR_DEFAULTCOLOR//默认颜色
);
wcx.hCursor=LoadCursor(NULL, IDC_ARROW);//鼠标形状
wcx.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景
wcx.lpszMenuName=NULL;//窗口菜单
//注册窗口类
if(!RegisterClassEx(&wcx)){//如果注册失败则返回
return 1;
}
//创建窗口
hwnd=CreateWindow("MainWClass",
"Hello",//窗口标题
WS_OVERLAPPEDWINDOW,//窗口样式
CW_USEDEFAULT,//窗口位置 x坐标
CW_USEDEFAULT,//窗口位置 y坐标
CW_USEDEFAULT,//宽度
CW_USEDEFAULT,//高度
(HWND)NULL,//父窗口句柄
(HMENU)NULL,//窗口没有菜单,则使用窗口类的菜单,窗口类也没有菜单,所以最终没有菜单
hinstance,//实例句柄--main函数的第一个参数
(LPVOID)NULL);//创建窗口的初始数据
if(!hwnd){//如果窗口创建失败
return 1;
}
ShowWindow(hwnd,//显示窗口
nCmdShow);//显示方式-main函数的最后一个参数
UpdateWindow(hwnd);//立即显示
//消息循环,去消息队列里取消息
while(fGotMessage=GetMessage(&msg,(HWND)NULL,0,0)!=0){//取到了消息
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//转发消息--转发给窗口过程
}
return msg.wParam;//返回消息参数
}
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
//处理窗口消息
switch(uMsg){//对窗口转发过来的消息进行处理
case WM_DESTROY://关闭窗口时
PostQuitMessage(0);//退出消息循环,自动结束窗口
//ExitThread(0);//退出主线程
return 0;
default://其它消息交由windows处理,DefWindowProc是系统默认的窗口过程
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
};
|