gpt4 book ai didi

c++ - 将子窗口停靠到父窗口

转载 作者:行者123 更新时间:2023-11-30 02:09:50 28 4
gpt4 key购买 nike

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

我找到了 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;
}
}

最佳答案

来自 MSDN's article on WM_SIZE :“如果由于 WM_SIZE 消息而为子窗口调用 SetScrollPos 或 MoveWindow 函数,则 bRedraw 或 bRepaint 参数应为非零值以导致重新绘制窗口。”我怀疑子控件正在移动,它们只是没有被重新绘制。

验证您的 switch case 是否真的被击中也可能是值得的。

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

关于c++ - 将子窗口停靠到父窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5068833/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com