c00*_*0fd 4 c++ windows winapi mfc dialog
我不确定我在这里做错了什么.我正在尝试使用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);
}
Run Code Online (Sandbox Code Playgroud)
但是我得到的结果就是这个.
首先是这里的初始组框:

只有当我开始向下拖动主窗口框架的底部时才会发生这种情况.我得到这个神器:

请注意,单选按钮位置本身是正确的.如果我将鼠标移动到其中任何一个上,它会正确地重绘(就像这个"关闭"按钮):

这是对话框本身的布局:
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
Run Code Online (Sandbox Code Playgroud)
我做了一些搜索并发现了这篇文章,但不幸的是设置这些样式并没有解决这个问题.
知道如何解决这个问题吗?
PS.我正在Windows Vista,7或8上测试它,并启用了视觉主题.
移动窗口时,窗口管理器将移动窗口的当前图像.不幸的是,因为你首先移动了框架,所有这些窗口都被剪裁了.翻转它们无济于事,因为顶部会被修剪掉.
修复它的简单方法是在移动后调用每个控件上的InvalidateRect.
更好的方法是BeginDeferWindowPos在你开始移动任何东西之前打电话,然后EndDeferWindowPos当你完成所有窗户一起移动时.
PS Windows更喜欢组合框在选项卡顺序中的单选按钮之后,这可能也会有所不同.