引言
在windows平台开发,少不了要和windows窗体打交道。
无论是opencv的窗体还是qt建立的窗体,都可以用windows的API进行控制。
这里介绍的是典型的win32窗口应用程序结构
创建窗口
需要以下7个步骤
- 程序入口点(WinMain函数)/设计窗口类
- 注册窗口类(RegisterClass/EX)
- 创建窗口类(CreateWindows)
- 显示主窗口(Show Windows)
- 更新主窗口(UpdateWindows)
- 进入消息循环GetMessage->TranslateMessage->DispatchMessage->对应的消息处理)
搭建一个Win32应用程序
首先建立一个win32的应用程序
- 一般情况下,如果是windows程序,那么WinMain是入口函数,在VS2017中新建项目为“win32项目”
- 如果是dos控制台程序,那么main是入口函数,在VS2017中新建项目为“win32控制台应用程序”
设计窗口类
//第一步、设计窗口类
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW; //设置水平竖直重绘,发送WM_PAINT消息
wndclass.lpfnWndProc = WindowProc; //指定窗口的回调函数
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0; //两个额外数据
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_CROSS);
wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "myWindowClass";
**常见句柄:**窗口句柄(HWND) 图标句柄(HICON),光标句柄(HCURSOR),画刷句柄(HBRUSH)
注册窗口类
//第二步、注册窗口类
RegisterClass(&wndclass);
创建窗口类
//第三步、创建窗口
HWND hWnd = CreateWindow(
“myWindowClass”, //窗口类的名字
“my first window”, //窗口标题
WS_OVERLAPPEDWINDOW, //样式
0, 0, 500, 500, //左上角坐标,宽高
NULL, //父窗口
NULL, //菜单
hInstance, //实例
NULL); //附加参数
显示主窗口
ShowWindow(hWnd, SW_SHOWNORMAL); //正常显示窗口
更新主窗口
UpdateWindow(hWnd); //更新窗口
进入消息循环
MSG msg;
while (GetMessageA(&msg, NULL, 0, 0))
{
TranslateMessage(&msg); //翻译消息
DispatchMessageA(&msg); //将消息传入窗口的回调函数
}