那么第一次的WM_PAINT可能会不正常 这个时候可以选择手动调整一下窗口的大小

时间:2022-02-21 00:34:33

学习小甲鱼的画\(sin\)函数的例子,发明最开始创建窗口时cxClient和cyClient不能很好的赋值

WM_SIZE和WM_PAINT

颠末我的实践发明:在刚刚创建窗口时WM_SIZE和WM_PAINT动静的挪用挨次是随机的,而且大部分时候先是WM_PAINT
如果cxClient和cyClient需要颠末WM_SIZE来初始化,并且WM_PAINT动静措置惩罚惩罚中需要使用这两个变量,那么第一次的WM_PAINT可能会不正常
这个时候可以选择手动调解一下窗口的巨细,破解qq空间 ,但是用户体验必定是很差的

一种解决方案

由于WM_CREATE动静必定优先于WM_PAINT措置惩罚惩罚,那么我们可以在措置惩罚惩罚WM_CREAT时初始化cxClient和cyClient
操作GetClientRect获取当前的矩形布局

case WM_CREATE: GetClientRect(hwnd, &rect); cxClient = rect.right-rect.left ; cyClient = rect.bottom- rect.top ; return 0; 画\(sin\)函数代码 /* ------------------------------------------------------------------- MyWindows.c -- 根基窗口模型 《Windows 措施设计(SDK)》视频教程 --------------------------------------------------------------------*/ #include <Windows.h> #include <tchar.h> #include <math.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("MyWindows"); 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("这个措施需要在 Windows NT 才华执行!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName,//类名 TEXT("鱼C事情室"),//标题 WS_OVERLAPPEDWINDOW,//气势派头 CW_USEDEFAULT,//初始x坐标 CW_USEDEFAULT,//初始y坐标 CW_USEDEFAULT,//初始宽度 CW_USEDEFAULT,//初始高度 NULL,//父窗口句柄 NULL,//窗口菜单句柄 hInstance,//措施实例句柄 NULL);//创建参数 ShowWindow(hwnd, iCmdShow);//显示窗口 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) { static int cxClient, cyClient; HDC hdc;//设备环境句柄 PAINTSTRUCT ps;//绘制布局 RECT rect;//矩形布局 //int stx = 0, sty =0; POINT apt[1000]; int num = 1000; switch (message) { case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); return 0; case WM_CREATE: GetClientRect(hwnd, &rect); cxClient = rect.right-rect.left ; cyClient = rect.bottom- rect.top ; return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps);//获得设备句柄 LineTo(hdc, cxClient, cyClient); for (int i = 0; i < num; i++) { apt[i].x = i * cxClient / num; apt[i].y = (long)(cyClient / 2 * sin(i * 3.1415926 * 2.0 / num)) + cyClient / 2; } Polyline(hdc, apt, num); EndPaint(hwnd, &ps);// 函数符号指定窗口的绘画过程结束 return 0; case WM_DESTROY://窗口* PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam);//交给windows去措置惩罚惩罚 }

Windos编程,获取窗口的尺寸

标签:

原文地点:https://www.cnblogs.com/carcar/p/12689000.html