asw03188 发表于 2020-3-25 21:46:31

WM_SIZE 绘图萤幕显示问题

不好意思
我是一个刚开始学习win32的小菜鸟{:5_100:}
最近在看老师的教学课程

在折线绘制这几堂课
发现我的萤幕无法像老师的这样一执行编译就会显示
还需要更动视窗大小后才会显示

不晓得可不可以请大家帮我看看哪里出现问题

使用的程式是Visual Studio 2019

程式代码

#include <windows.h>
#include <math.h>
#define      NUM                1000               
#define      TWOPI      (2 * 3.14159)      

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;
    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,               
      TEXT("The Hello Program"),
      WS_OVERLAPPEDWINDOW,      
      CW_USEDEFAULT,            
      CW_USEDEFAULT,            
      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)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static int cxClient, cyClient;
    POINT apt;      
    int i;

    switch (message)
    {
    case WM_SIZE:
      cxClient = LOWORD(lParam);
      cyClient = HIWORD(lParam);
      return 0;

    case WM_PAINT:
      hdc = BeginPaint(hwnd, &ps);

      MoveToEx(hdc, 0, cyClient / 2, NULL);
      LineTo(hdc, cxClient, cyClient / 2);
      for (i = 0; i < NUM; i++)
      {
            apt.x = i * cxClient / NUM;
            apt.y = (int)(cyClient / 2 * (1 - sin(TWOPI * i / NUM)));
      }

      PolylineTo(hdc, apt, NUM);
      EndPaint(hwnd, &ps);
      return 0;

    case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

howzyao 发表于 2020-4-5 08:48:08

第一个WM_SIZE分支里,是不是没有获得HDC和释放HDC才导致x,y二轴不能得到当前客户区的宽高?

howzyao 发表于 2020-4-5 18:07:37

我竟然记错了
cx=LOWORD(lParam); //返回的应当是int值,单位是像素,当前窗口客户区宽度

HanDes 发表于 2020-6-12 19:28:36

那个我也遇到了你这个问题,我跟了一下断点,发现我的WM_SIZE消息初始化的时候并没有进入消息队列,只有在更改长宽的时候才会运行,所以WM_PAINT里面初始化使用的cxClient和cyClient都是缺省值0.但是我发现在我的另一台电脑上,WM_SIZE消息又是触发的.两台电脑都是WIN10,用的也都是VS19,但是两台电脑的WIN10版本和VS19版本都不一样
页: [1]
查看完整版本: WM_SIZE 绘图萤幕显示问题