鱼C论坛

 找回密码
 立即注册
查看: 2149|回复: 3

WM_SIZE 绘图萤幕显示问题

[复制链接]
发表于 2020-3-25 21:46:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

使用的程式是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[NUM];      
    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[i].x = i * cxClient / NUM;
            apt[i].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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-5 08:48:08 From FishC Mobile | 显示全部楼层
第一个WM_SIZE分支里,是不是没有获得HDC和释放HDC才导致x,y二轴不能得到当前客户区的宽高?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-5 18:07:37 | 显示全部楼层
我竟然记错了
cx=LOWORD(lParam); //返回的应当是int值,单位是像素,当前窗口客户区宽度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-12 19:28:36 | 显示全部楼层
那个我也遇到了你这个问题,我跟了一下断点,发现我的WM_SIZE消息初始化的时候并没有进入消息队列,只有在更改长宽的时候才会运行,所以WM_PAINT里面初始化使用的cxClient和cyClient都是缺省值0.但是我发现在我的另一台电脑上,WM_SIZE消息又是触发的.两台电脑都是WIN10,用的也都是VS19,但是两台电脑的WIN10版本和VS19版本都不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 02:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表