使用SDK来创建一个非模态的窗口,不涉及资源,只用注册一个窗口类,创建窗口,显示窗口,然后建立一个消息循环就够了。
首先我们使用SDK创建窗口或者是控件都需要用到类,其他的控件都有系统注册好的类,直接拿来用就可以,窗口的类我们可以自己定义然后注册就可以用了。
第一步:注册一个窗口类
我们看到,窗口程序用的是WinMain而不是控制台程序的main,把代码贴出来看一下
//1.注册窗口类
WNDCLASS wcs = {};
wcs.lpszClassName = L"窗口类名"; //创建的窗口的类名
wcs.style = CS_HREDRAW | CS_VREDRAW; //窗口的风格
wcs.lpfnWndProc = WindowProc; //窗口的回调函数
wcs.hbrBackground = HBRUSH(COLOR_BACKGROUND + 1); //窗口的背景颜色,每次刷新之后填充的颜色就是这个
RegisterClass(&wcs); //注册我们定义好的窗口类
第二步:创建窗口
//2.创建窗口
HWND hWnd = CreateWindow(L"窗口类名",//要用哪个类来创建窗口
L"My fiast Window",//创建的窗口的窗口名
WS_OVERLAPPEDWINDOW,//窗口的风格,WS_OVERLAPPEDWINDOW风格是创建一个顶层窗口
100,
100,
500,
500,//这四个参数表示窗口的坐标和宽高
NULL,//父窗口的句柄
NULL,//菜单
hInstance,//实例句柄
NULL//WM_CREATE消息的附加消息
);
第三步:显示窗口
第四步:创建消息循环机制
//4.创建消息循环机制
MSG msg = {};
while (GetMessage(&msg,//一个MSG结构体,包含许多消息信息
NULL,//获取那个窗口的消息,如果写NULL则表示获取当前线程的所有消息
NULL,//设置获取消息范围的最小值
NULL//设置获取消息范围的最小值
))
{
DispatchMessage(&msg); //消息分发函数,把消息分发给对应的处理函数
}
GetMessage()可以从消息队列中获取一个消息,DispatchMessage()就会把消息分发给对应的窗口回调
然后我们还需要一个窗口回调函数
在窗口回调函数中可以响应各种消息,然后做出消息处理,不能处理的消息全都通过DefWindowProc()函数再返还给系统去处理,窗口回调函数的原型可以通过MSDN去查找
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
{
MessageBox(hwnd, L"hahahah", L"创建了一个对话框", MB_OK);
}
break;
case WM_CLOSE:
{
PostQuitMessage(WM_QUIT);
}
break;
default:
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}