我不确定我在这里做错了什么。我正在尝试使用MFC实现调整大小对话框窗口。代码非常简单。我覆盖了以下大小调整通知:
void CMyDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
//...
//First move the groupbox, pGroupbox is of type CWnd
pGroupbox->MoveWindow(rcGroupbox);
//And then move all radio buttons in it
//Each is moved the exact same way
//pEachRadioButton is of type CWnd
pEachRadioButton->MoveWindow(rcEachRadioButton);
}
但我得到的结果就是这个。
首先是这里的初始群组:
只有当我开始向下拖动主窗口框架的底部时才会发生这种情况。我得到了这个神器:
请注意,单选按钮位置本身是正确的。如果我将鼠标移动到它们中的任何一个上,它会正确地重绘(就像这样"关闭"按钮):
这是对话框本身的布局:
IDD_MY_DIALOG DIALOGEX 0, 0, 437, 190
STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "My dialog"
MENU IDR_MENU_MAIN
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
PUSHBUTTON "&Cancel",IDCANCEL,381,169,50,14
GROUPBOX "When Tasks Are Completed",IDC_STATIC_WHEN_COMPLETED,7,113,423,36
CONTROL "Close the pro&gram",IDC_RADIO_CLOSE_PROGRAM,"Button",BS_AUTORADIOBUTTON | WS_GROUP,26,129,73,8
CONTROL "Put computer to sleep",IDC_RADIO_SLEEP,"Button",BS_AUTORADIOBUTTON,122,129,84,10
CONTROL "Hibernate computer",IDC_RADIO_HIBERNATE,"Button",BS_AUTORADIOBUTTON,229,129,78,10
CONTROL "Shut down computer",IDC_RADIO_SHUT_DOWN,"Button",BS_AUTORADIOBUTTON,330,129,81,10
DEFPUSHBUTTON "&OK",IDC_BUTTON_SET,311,161,67,22
END
我做了一些搜索并找到this article,但遗憾的是设置这些样式并没有修复错误。
知道如何解决这个问题吗?
PS。我在启用了视觉主题的Windows Vista,7或8上测试它。
答案 0 :(得分:7)
当您移动窗口时,窗口管理器将移动窗口的当前图像。不幸的是,因为你首先移动了框架,所有这些窗口都被剪裁了。翻转它们并不会有帮助,因为那时 tops 会被修剪。
修复它的简单方法是在移动它之后在每个控件上调用InvalidateRect。
更好的方法是在开始移动任何内容之前调用BeginDeferWindowPos
,然后在完成后EndDeferWindowPos
调用以便所有窗口一起移动。
P.S。 Windows更喜欢组合框在选项卡顺序中的单选按钮之后来,这可能也会有所不同。