调整对话框控件的位置,使它们在调整大小时在使用MFC C++的各种操作系统中保持一致。

3

目前,我正在调整对话框控件在对话框大小调整时的位置,如下所示:

// Get the list control rect.
CRect listRect;
list->GetWindowRect(&listRect);
ScreenToClient(listRect);

// Get the dialog Rect.
CRect dialogRect;
GetWindowRect(&dialogRect);
ScreenToClient(dialogRect);

list->MoveWindow(listRect.left, listRect.top,
                 dialogRect.right - (2 * listRect.left), dialogRect.bottom - 100);

在Windows XP中,这个很好用,但是在Windows Vista中尝试时,定位偏移了。我认为这必须是由于Windows Vista对话框中较大的对话框边框和标题以及GetWindowRect在文档中具有以下条目的事实所致:
“尺寸以相对于显示屏左上角的屏幕坐标给出。如果存在标题、边框和滚动条,则包括它们的尺寸。”
那么我的问题是,在调整对话框大小时,如何重新定位对话框控件,以便它们在操作系统之间保持一致?谢谢
1个回答

2

您应该使用GetClientRect而不是先调用GetWindowRect再调用ScreenToClient -- 前者返回窗口客户区域的大小(即不包括边框),后者则返回整个窗口(包括非客户区域)在客户坐标系下的大小。

// Get the list control rect.
CRect listRect;
list->GetWindowRect(&listRect);
dlg->ScreenToClient(&listRect);

// Get the dialog Rect.
CRect dialogRect;
dlg->GetClientRect(&dialogRect);

list->MoveWindow(listRect.left, listRect.top, dialogRect.right - (2 * listRect.left), dialogRect.bottom - 100);

感谢您的回复,avakar。但是,由于GetClientRect返回客户端坐标中的位置,它无法考虑在资源文件中指定的控件的原始位置。上面的代码将控件定位,使其填充其父对话框的整个上半部分。 - dangerousdave
@Jon,你是对的,你需要在对话框的坐标中获取控件矩形。不过你确实需要使用 GetClientRect 来获取对话框的大小。请参见编辑后的代码。 - avakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接