Windosプログラミング、ウィンドウのサイズを取得

序文

小さなカメのペインティング\(sin \)関数の例を学ぶと、ウィンドウが最初に作成されたときにcxClientとcyClientをうまく割り当てることができないことがわかりました

WM_SIZE和WM_PAINT

私の練習の後、ウィンドウが作成されたばかりのとき、WM_SIZEおよびWM_PAINTメッセージの呼び出しシーケンスはランダムであり、ほとんどの
場合、最初はWM_PAINT でした。cxClientおよびcyClientをWM_SIZEで初期化する必要があり、これら2つの変数がWM_PAINTメッセージ処理に必要な場合次に、最初のWM_PAINTが異常である可能性があります。現時点
では、ウィンドウのサイズを手動で調整することを選択できますが、ユーザーエクスペリエンスは確実に低下します。

解決策

WM_CREATEメッセージはWM_PAINT処理よりも優先される必要があるため、GetClientRect
を使用してWM_CREATを処理し、現在の長方形構造を取得しながら、cxClientとcyClientを初期化できます。

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去处理
}

おすすめ

転載: www.cnblogs.com/carcar/p/12689000.html