Windows.h提供了CreateWindow系列的函数,自己注册一个class,然后就能创建窗口,创建之后需要在WndProc中处理Message
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:{
PrintLogEx(L"windows create\n");
}
break;
case WM_CLOSE: {
ExitProcess(0);
}
break;
case WM_DESTROY:{
PostQuitMessage(0);//可以使GetMessage返回0??
}
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
// 注册窗口类, 注册之后才能CreateWindow
BOOL RegisterWndClass(LPTSTR lpClassName, WNDPROC wndProc)
{
WNDCLASSEX wce = { 0 };
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = GetModuleHandleW(NULL);
wce.lpfnWndProc = wndProc;
wce.lpszClassName = lpClassName;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW | CS_VREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if (nAtom == 0)
return FALSE;
return TRUE;
}
// 创建主窗口,要注册窗口类之后才能创建对应的classname
HWND CreateMain(LPTSTR lpClassName, LPTSTR lpWndName)
{
HWND hWnd = CreateWindowExW(0, lpClassName, lpWndName,
WS_POPUP, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, GetModuleHandleW(NULL), NULL);
PrintLogEx(L"CreateWindowExW return %p\n", hWnd);
return hWnd;
}
//显示窗口
void DisplayWindow(HWND hWnd)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
//消息循环
void HandleMessage(HWND hWnd)
{
MSG nMsg = { 0 };
while (GetMessageW(&nMsg, hWnd, 0, 0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}
int main() {
HWND hWnd = NULL;
TCHAR className[20], windowName[20];
PrintLogEx(L"create window\n");
_tcscpy_s(className, sizeof(className) / sizeof(className[0]), L"MyClassWnd");
_tcscpy_s(windowName, sizeof(windowName) / sizeof(windowName[0]), L"hello world");
PrintLogEx(L"create window %s-%s\n", className, windowName);
if (RegisterWndClass(className, WndProc)) {
hWnd = CreateMain(className, windowName);
DisplayWindow(hWnd);
HandleMessage(hWnd);
}
else {
PrintLogEx(L"Register failed\n");
}
return 0;
}