仰望—星空 2024-01-23 20:53 采纳率: 93.3%
浏览 10
已结题

win32如何避免WM_SIZING消息返回后改变窗口大小

我正在使用WIN32 API开发桌面应用程序,我建立了一个父窗口和四个子窗口,将子窗口作为父窗口的一部分而划分出工作区,四个工作区是可以拖拽调整布局的类似Blender一样,我在WM_SIZING消息中计算拖动后工作区的布局,即我使用WindowMove函数完成工作区的调整工作。
现在的问题是,每次WM_SIZING消息的LPRARAM参数中包含了调整后的矩形信息,窗口过程返回后会将LPARAM中的RECT信息设置到子窗口上,我希望仅由我自己处理工作区的调整,即在接受WM_SIZING消息时,我能通过返回什么值或者调用什么函数,使得窗口过程返回后不会用LPARAM参数设置窗口吗?
我不能将LPARAM参数设置为我计算出的工作区大小,因为当工作区调整一格时,由于小数参数的误差,算出来的工作区分布可能没有改变,如果我将LPARAM参数设置为预期的工作区大小,则LPARAM参数将永远不变,这导致我拖动子窗口边框无法调整窗口大小。

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-23 22:32
    关注

    【以下回答由 GPT 生成】

    问题的核心是如何在WM_SIZING消息返回后避免窗口大小的改变,只由自己处理工作区的调整。根据描述,你希望能够拖动子窗口边框来调整工作区的大小,同时避免窗口大小的改变。

    答案是在处理WM_SIZING消息时,可以改变窗口的客户区大小而不改变窗口的实际大小。为了实现这个目标,你需要以下步骤:

    1. 在创建主窗口时,将窗口样式设置为WS_OVERLAPPEDWINDOW,并在样式中设置WS_CLIPCHILDREN。这样可以确保子窗口的绘制区域不会超出父窗口的范围。
    // 创建主窗口时设置样式
    HWND hWnd = CreateWindowEx(
        0,
        szWindowClass,
        szTitle,
        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        nullptr,
        nullptr,
        hInstance,
        nullptr
    );
    
    1. 在处理WM_SIZING消息时,通过修改lParam中的RECT结构体,调整工作区的大小。可以通过计算来确定工作区的新大小。可以使用MoveWindow函数来调整子窗口的位置和大小。
    case WM_SIZING:
    {
        RECT* rect = (RECT*)lParam;
    
        // 计算新的工作区大小
        int newWidth = rect->right - rect->left;
        int newHeight = rect->bottom - rect->top;
    
        // 根据计算结果调整工作区的大小
        // ...
    
        // 移动子窗口到适当的位置
        MoveWindow(hwndChild1, ...);
        MoveWindow(hwndChild2, ...);
        MoveWindow(hwndChild3, ...);
        MoveWindow(hwndChild4, ...);
    
        // 返回WVR_REDRAW,指示区域已失效并需要更新
        return WVR_REDRAW;
    }
    
    1. 在处理WM_PAINT消息时,通过调用ValidateRect函数来更新工作区的显示。这样可以确保工作区的变化被正确地绘制出来。
    case WM_PAINT:
    {
        HDC hdc;
        PAINTSTRUCT ps;
    
        hdc = BeginPaint(hWnd, &ps);
    
        // 绘制工作区内容的代码
        // ...
    
        EndPaint(hWnd, &ps);
        return 0;
    }
    

    通过以上步骤,你可以在WM_SIZING消息中自定义工作区的调整,而不改变窗口的实际大小。同时,子窗口的位置和大小会根据计算结果进行调整,并且工作区的变化会正确地被显示出来。

    最后,请注意在处理WM_SIZING消息时,避免使用SetWindowPos函数或修改lParam中RECT结构体的其他成员。这样可以确保窗口的大小不会被改变,而只会改变工作区的大小。

    希望以上解决方案对你有帮助。如果你有任何进一步的问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月7日
  • 已采纳回答 1月30日
  • 创建了问题 1月23日

悬赏问题

  • ¥15 已知平面坐标系(非直角坐标系)内三个点的坐标,反求两坐标轴的夹角
  • ¥15 数据量少可以用MK趋势分析吗
  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法