1

当用户调整主窗口的大小(拖动角落)时,我需要我的 6 个控件(主窗口的子窗口)变大。我想我可以通过使用 MoveWindow 函数来更改主窗口的 WM_SIZE 或 WM_SIZING 函数中每个子项的比例来实现这一点。这样做会使 Debug 构建变得奇怪(多个窗口、退出后窗口的图像等)。发布版本运行良好,但当我调整主窗口大小时,子窗口没有改变。

我发现http://msdn.microsoft.com/en-us/library/ms632598%28v=VS.85%29.aspx#creating_enumerating_etc使用了不同的方法:通过枚举所有子窗口和枚举回调通过分配给每个孩子的唯一 ID 处理窗口大小调整的函数。在我自己尝试后,调整主窗口大小时对控件没有任何影响。

为什么这不起作用?

在主窗口 switch 语句中:

case WM_SIZING:
        GetClientRect(hwnd, &hwndRect);
        EnumChildWindows(hwnd, EnumChildProc, (LPARAM)&hwndRect);
        break;

子枚举器回调函数:

BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
    LPRECT hwndRect = (LPRECT)lParam;
    switch(GetWindowLong(hwndChild, GWL_ID))
    {
        case ID_CHILD_LLABEL:
            MoveWindow(hwndChild, 0, 0, (hwndRect->right - hwndRect->left) - 30, 20,     false);
            break;
        case ID_CHILD_LDIR:
            MoveWindow(hwndChild, 12, 20, (hwndRect->right - hwndRect->left) - 40, 20,     false);
            break;
        case ID_CHILD_LLIST:
            MoveWindow(hwndChild, 12, 40, (hwndRect->right - hwndRect->left) - 40,         (hwndRect->bottom - hwndRect->top) - 238, false);
            break;
    }
}
4

1 回答 1

4

来自MSDN 关于 WM_SIZE 的文章:“如果由于 WM_SIZE 消息而为子窗口调用 SetScrollPos 或 MoveWindow 函数,则 bRedraw 或 bRepaint 参数应为非零以导致重新绘制窗口。” 我怀疑子控件正在移动,它们根本没有被重新粉刷。

验证您的开关盒是否确实被击中也可能是值得的。

编辑:我错过了明显的。您正在响应 WM_SIZING,这表明窗口的大小即将(但尚未)更改。WM_SIZE 表示大小发生了变化。如果要使用WM_SIZING,需要使用lParam中携带的rect,而不是GetClientRect的结果。不幸的是,WM_SIZING 矩形是窗口的矩形,而不是客户区,并且位于屏幕坐标中。除非您确实需要在用户仍在执行调整大小时显示调整大小的控件,否则只处理 WM_SIZE 消息会容易得多。

于 2011-02-21T20:06:26.703 回答