如何画Windows窗体
初始化窗体 函数
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { }
第一个参数是 装载基地址 MZ头 第二个参数 输入命令行
接着需要注册窗口
WNDCLASSEXW wcex;
这里写一个函数来初始化他
lpfnWndProc 需要一个 函数指针 这些需要提前声明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// // 函数: MyRegisterClass() // // 目标: 注册窗口类。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;//风格 wcex.lpfnWndProc = WndProc;//函数指针 wcex.cbClsExtra = 0;//额外空间 wcex.cbWndExtra = 0;//额外空间 wcex.hInstance = hInstance;//实列句柄 wcex.hIcon =NULL;//图标 wcex.hCursor = NULL;//光标 wcex.hbrBackground = NULL;//背景 wcex.lpszMenuName = NULL;//菜单 wcex.lpszClassName = L"test";//类名 窗口类名 类名唯一 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex);//注册 }
注册完后接着要 创建窗体
HWND hWnd = CreateWindowW(L"test", //类名 L"TEST",//标题 WS_OVERLAPPEDWINDOW,//风格 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, //坐标尺寸 NULL, NULL, hInstance, NULL);//父窗口,菜单,实例句柄
// // 函数: InitInstance(HINSTANCE, int) // // 目标: 保存实例句柄并创建主窗口 // // 注释: // // 在此函数中,我们在全局变量中保存实例句柄并 // 创建和显示主程序窗口。 // BOOL InitInstance(HINSTANCE hInstance) { HWND hWnd = CreateWindowW(L"test", //类名 L"TEST",//标题 WS_OVERLAPPEDWINDOW,//风格 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, //坐标尺寸 NULL, NULL, hInstance, NULL);//父窗口,菜单,实例句柄 if (!hWnd) { return FALSE; } ShowWindow(hWnd, SW_SHOW);//显示更新窗口 UpdateWindow(hWnd); return TRUE; }
接着取消息 GetMessage 利用这个函数
GetMessageW(
_Out_ LPMSG lpMsg,
_In_opt_ HWND hWnd,
_In_ UINT wMsgFilterMin,
_In_ UINT wMsgFilterMax);
#ifdef UNICODE
lpMsg 这个属于哪个窗口 第2个 就是 拿这个窗口句柄的消息 null就是拿所有 第3个 4个 属于拿的消息范围 0默认所有消息都处理
拿到消息需要处理 并循环接收消息
整体代码就是
// WindowsProject1.cpp : 定义应用程序的入口点。 // #include "framework.h" #include "WindowsProject1.h" LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return DefWindowProc(hwnd, uMsg, wParam, lParam); } ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;//风格 wcex.lpfnWndProc = WndProc;//函数指针 wcex.cbClsExtra = 0;//额外空间 wcex.cbWndExtra = 0;//额外空间 wcex.hInstance = hInstance;//实列句柄 wcex.hIcon = NULL;//图标 wcex.hCursor = NULL;//光标 wcex.hbrBackground = NULL;//背景 wcex.lpszMenuName = NULL;//菜单 wcex.lpszClassName = L"test";//类名 窗口类名 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex);//注册 } BOOL InitInstance(HINSTANCE hInstance) { HWND hWnd = CreateWindowW(L"test", //类名 L"TEST",//标题 WS_OVERLAPPEDWINDOW,//风格 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, //坐标尺寸 NULL, NULL, hInstance, NULL);//父窗口,菜单,实例句柄 if (!hWnd) { return FALSE; } ShowWindow(hWnd, SW_SHOW);//显示更新窗口 UpdateWindow(hWnd); return TRUE; } int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { MyRegisterClass(hInstance); InitInstance(hInstance); MSG msg; // 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg);//自动区分子窗体消息 } }
可以自定义消息处理
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); // TODO: 在此处添加使用 hdc 的任何绘图代码... EndPaint(hWnd, &ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
从此山高路远,纵马扬鞭。愿往后旅途,三冬暖,春不寒,天黑有灯,下雨有伞。此生尽兴,不负勇往。