创建窗口
首先得确认Vs的项目属性-链接器-系统-子系统参数是窗口
窗口的创建非常容易,只需要调用CreateWindow函数即可。
-
要创建一个窗口,首先要注册一个窗口类。
static TCHAR* szAppName = TEXT("HelloWin"); HWND hWnd; MSG msg; WNDCLASS wndclass; //创建窗口类 wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; //注册窗口类 if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("窗口类注册失败"), szAppName, MB_ICONERROR); return 0; } -
然后调用CreateWindow函数创建窗口
hWnd = CreateWindow(szAppName,//窗口类名 TEXT("The Hello Program"),//窗口标题 WS_OVERLAPPEDWINDOW, //窗口样式 CW_USEDEFAULT,//窗口x位置 CW_USEDEFAULT,//窗口y位置 CW_USEDEFAULT,//窗口宽度 CW_USEDEFAULT,//窗口高度 NULL,//父窗口的句柄 NULL,//窗口菜单句柄 hInstance, NULL); -
然后使用ShowWindow和UpdateWindow函数显示和更新窗口
ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); -
然后就是消息循环
while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; -
消息处理的回调函数如下
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch (message) { case WM_PAINT: //在窗口中心显示文字 hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); DrawText(hdc, TEXT("Hello,Windows 10"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: //处理窗口退出消息 PostQuitMessage(0); return 0; default: //其他情况调用默认函数处理 return DefWindowProc(hwnd, message, wParam, lParam); } } -
程序完整代码如下
#include <Windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR* szAppName = TEXT("HelloWin"); HWND hWnd; MSG msg; WNDCLASS wndclass; //创建窗口类 wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; //注册窗口类 if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("窗口类注册失败"), szAppName, MB_ICONERROR); return 0; } hWnd = CreateWindow(szAppName,//窗口类名 TEXT("The Hello Program"),//窗口标题 WS_OVERLAPPEDWINDOW, //窗口样式 CW_USEDEFAULT,//窗口x位置 CW_USEDEFAULT,//窗口y位置 CW_USEDEFAULT,//窗口宽度 CW_USEDEFAULT,//窗口高度 NULL,//父窗口的句柄 NULL,//窗口菜单句柄 hInstance, NULL); ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch (message) { case WM_PAINT: //在窗口中心显示文字 hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); DrawText(hdc, TEXT("Hello,Windows 10"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: //处理窗口退出消息 PostQuitMessage(0); return 0; default: //其他情况调用默认函数处理 return DefWindowProc(hwnd, message, wParam, lParam); } }程序运行成功后如图所示: