使用windows API创建窗口
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//消息处理函数 //入口函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); HWND hwnd;//要创建的窗口句柄 MSG msg;//消息结构体 /* typedef struct tagMSG { HWND hwnd;消息发送给哪个句柄 UINT message;消息类型 WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG, *PMSG, *LPMSG; */ 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("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } //创建窗口 hwnd = CreateWindow(szAppName, // window class name TEXT("The Hello Program"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT,// initial x position CW_USEDEFAULT,// initial y position CW_USEDEFAULT,// initial x size CW_USEDEFAULT,// initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL); // creation parameters //设置窗口显示模式:最大化/最小化/正常 ShowWindow(hwnd, iCmdShow); //显示 UpdateWindow(hwnd); //从消息队列里面获取消息,填充到msg中 while (GetMessage(&msg, NULL, 0, 0)){ //将消息传给windows进行一些其他处理 TranslateMessage(&msg); //windows将消息传给消息处理程序进行处理 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_CREATE: return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }当创建窗口类的时候,需要为此窗口创建消息处理函数。
windows为当前每个windows程序维护一个消息队列
GetMessage此函数从消息队列中取出消息,注意消息体的结构,包含了窗口句柄,可以知道此消息是发给哪个窗口的。
DispatchMessage此函数会使windows调用消息处理函数,并把消息体作为参数。
运行效果如下,可以拖动,可以关闭,可以最小化