学习小甲鱼的画\(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