Groupbox调整大小问题,顶部有单选按钮

时间:2014-05-13 00:04:28

标签: 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);

}

但我得到的结果就是这个。

首先是这里的初始群组:

enter image description here

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

enter image description here

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

enter image description here

这是对话框本身的布局:

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上测试它。

1 个答案:

答案 0 :(得分:7)

当您移动窗口时,窗口管理器将移动窗口的当前图像。不幸的是,因为你首先移动了框架,所有这些窗口都被剪裁了。翻转它们并不会有帮助,因为那时 tops 会被修剪。

修复它的简单方法是在移动它之后在每个控件上调用InvalidateRect。

更好的方法是在开始移动任何内容之前调用BeginDeferWindowPos,然后在完成后EndDeferWindowPos调用以便所有窗口一起移动。

P.S。 Windows更喜欢组合框在选项卡顺序中的单选按钮之后来,这可能也会有所不同。