一、流程
1定义入口函数WinMain()
2创建一个窗口:
a)设计窗口类WNDCLASS(给成员变量赋值)
b)注册窗口类
c)创建窗口类
d)显示和更新窗口
3消息循环
4窗口过程函数
二、WinMain()
//WINAPI:修饰函数,规定函数参数入栈从右往左,函数调用完毕,自动清理堆栈
int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例
HINSTANCE hPrevInstance,//上一个应用程序实例
LPSTR lpCmdLine,//long pointer string,命令行参数
int nCmdShow//窗口显示样式
)
三、设计窗口类WNDCLASS
用来对窗口进行设置,写在WinMain之中
WNDCLASS wc;
//类的附加信息
wc.cbClsExtra = 0;
//窗口的附加信息
wc.cbWndExtra = 0;
//背景色,必须写
//获取系统默认的白色画刷
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
//光标图像
//使用默认 wc.hCursor = NULL;
//使用系统默认的“帮助”光标
wc.hCursor = LoadCursor(NULL,IDC_HELP);
//使用图标
//使用默认 wc.hIcon = NULL;
//使用系统默认的“警告”图标
wc.hIcon = LoadIcon(NULL, IDI_WARNING);
wc.hInstance = hInstance;//应用程序实例传窗口
wc.lpfnWndProc = DealMessage;//消息处理函数,需要为回调类型,需自己编写
wc.lpszClassName = TEXT("abc");//类的名字
wc.lpszMenuName = NULL;//菜单名字
wc.style = nCmdShow; //显示风格
四、注册窗口类
//在窗口过程类完成后
//注册窗口类,告知系统窗口过程函数的入口地址
RegisterClass(&wc);
五、创建窗口类
//创建窗口类,参数:
//类名,窗口标题,显示风格
//x轴,y轴,宽度,高度
//父窗口(主窗口则为空),菜单,应用程序实例,附加信息
HWND hWnd = CreateWindow(TEXT("abc"), TEXT("hello,windows"),WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);//返回窗口句柄
六、显示与更新窗口
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
七、消息循环
hwnd:消息属于哪一个拆给你扣
message:哪一种消息,如敲击键盘,则为键盘敲击事件。
wParam,lParam:消息的附加信息,比如敲击键盘事件发生时,该对象记录具体敲击键位。
time:消息产生的时间。
pt:鼠标的位置。
MSG msg;
//消息的引用,属于哪一个窗口(NULL为所有的),从消息队列中接收消息的最小值,最大值
//如果接收到WM_QUIT,返回0
//出错返回-1,但不退出
while (GetMessageW(&msg, NULL, 0, 0)) {
//翻译工作
//当键盘时间操作时,虚拟按键转换标准字符WM_CHAR,然后再次传给消息队列后,继续循环
TranslateMessage(&msg);
//给操作系统分发消息
DispatchMessage(&msg);
}
消息处理函数
//大致格式
LRESULT CALLBACK DealMessage(HWND hWnd,//窗口句柄,消息所属窗口
UINT uMsg,//消息标志
WPARAM wParam,//消息附加信息
LPARAM lParam
) {
switch (uMsg) {
case WM_LBUTTONDOWN://鼠标左键按下
//消息对话框:哪一个窗口,内容,标题,按钮
MessageBox(hWnd, TEXT("ABC"), TEXT("鼠标左键按下"), MB_OK);
break;
case WM_DESTROY://关闭按钮按下
//返回WM_QUIT,并给主函数return msg.wParam
PostQuitMessage(2);
break;
case WM_PAINT: {//绘图
PAINTSTRUCT ps;//绘图结构体
//开始作画,哪一个窗口,绘图信息,
//HDC"画家"
HDC dc = BeginPaint(hWnd, &ps);
char* p = L"asfasdfasfas";//转换为宽字节,1字符2字节
//HDC对象,x,y坐标,内容,长度
TextOutW(dc, 30, 30, p, wcslen(p));
EndPaint(hWnd, &ps);
}
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
八、总结构
#include<Windows.h>
LRESULT CALLBACK DealMessage(HWND hWnd,//窗口句柄,消息所属窗口
UINT uMsg,//消息标志
WPARAM wParam,//消息附加信息
LPARAM lParam
) {
switch (uMsg) {
case WM_LBUTTONDOWN://鼠标左键按下
//消息对话框:哪一个窗口,内容,标题,按钮
MessageBox(hWnd, TEXT("ABC"), TEXT("鼠标左键按下"), MB_OK);
break;
case WM_DESTROY://关闭按钮按下
//返回WM_QUIT,并给主函数return msg.wParam
PostQuitMessage(2);
break;
case WM_PAINT: {//绘图
PAINTSTRUCT ps;//绘图结构体
//开始作画,哪一个窗口,绘图信息,
//HDC"画家"
HDC dc = BeginPaint(hWnd, &ps);
char* p = L"asfasdfasfas";//转换为宽字节,1字符2字节
//HDC对象,x,y坐标,内容,长度
TextOutW(dc, 30, 30, p, wcslen(p));
EndPaint(hWnd, &ps);
}
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return DefWindowProc(hWnd,uMsg, wParam, lParam);//采用默认处理方式
}
//WINAPI:修饰函数,规定函数参数入栈从右往左,函数调用完毕,自动清理堆栈
int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例
HINSTANCE hPrevInstance,//上一个应用程序实例
LPSTR lpCmdLine,//long pointer string,命令行参数
int nCmdShow//窗口显示样式
) {
WNDCLASS wc;
//类的附加信息
wc.cbClsExtra = 0;
//窗口的附加信息
wc.cbWndExtra = 0;
//背景色,必须写
//获取系统默认的白色画刷
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
//光标图像
//使用默认 wc.hCursor = NULL;
//使用系统默认的“帮助”光标
wc.hCursor = LoadCursor(NULL,IDC_HELP);
//使用图标
//使用默认 wc.hIcon = NULL;
//使用系统默认的“警告”图标
wc.hIcon = LoadIcon(NULL, IDI_WARNING);
wc.hInstance = hInstance;//应用程序实例传窗口
wc.lpfnWndProc = DealMessage;//消息处理函数,需要为回调类型,需自己编写
wc.lpszClassName = TEXT("abc");//类的名字
wc.lpszMenuName = NULL;//菜单名字
wc.style = nCmdShow; //显示风格
//注册窗口类,告知系统窗口过程函数的入口地址
RegisterClass(&wc);
//创建窗口类,参数:
//类名,窗口标题,显示风格
//x轴,y轴,宽度,高度
//父窗口(主窗口则为空),菜单,应用程序实例,附加信息
HWND hWnd = CreateWindow(TEXT("abc"), TEXT("hello,windows"),WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);//返回窗口句柄
//显示和更新窗口
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
MSG msg;
//消息的引用,属于哪一个窗口(NULL为所有的),从消息队列中接收消息的最小值,最大值
//如果接收到WM_QUIT,返回0
//出错返回-1,但不退出
while (GetMessageW(&msg, NULL, 0, 0)) {
//翻译工作
//当键盘时间操作时,虚拟按键转换标准字符WM_CHAR,然后再次传给消息队列
TranslateMessage(&msg);
//给操作系统分发消息
DispatchMessage(&msg);
}
return msg.wParam;
}