1

我有一个 CDialogBar 派生类,如下所述。一位同事对我说,MFC 不提供对齐流布局控制(我在 2012 年发现了一些令人难以置信的东西!)。正如我所展示的,我必须使用 OnSize 函数来做这件事:

//declaration of member variable
class CMyDialogBar : public CDialogBar
{
private:
    int m_old_cx;
    //...    
}


//the message map
BEGIN_MESSAGE_MAP(CMyDialogBar, CDialogBar)
    //...
    ON_WM_SIZE()
END_MESSAGE_MAP()    

//the implementation
void CMyDialogBar::OnSize(UINT nType, int cx, int cy)
{
    CDialogBar::OnSize(nType, cx, cy);

    if (!::IsWindow(this->GetSafeHwnd()))
        return;

    // align right Combo1 and its label
    CRect rc;
    CWnd *pWnd= this->GetDlgItem(IDC_COMBO1);
    if(pWnd)
    {
        pWnd->GetWindowRect(&rc);
        ScreenToClient(&rc);
        pWnd->MoveWindow(rc.left + cx - m_old_cx, rc.top ,rc.Width(), rc.Height());
    }

    pWnd= this->GetDlgItem(IDC_STATIC_COMBO_LABEL);
    if(pWnd)
    {
        pWnd->GetWindowRect(&rc);
        ScreenToClient(&rc);
        pWnd->MoveWindow(rc.left + cx - m_old_cx, rc.top ,rc.Width(), rc.Height());
    }


    m_old_cx= cx;
}

即使在看到这个工作之后,我也不太相信它。所以我的问题是:有没有更好的右对齐控件方法?

提前致谢,

塞尔吉奥

4

1 回答 1

2

即使在 2013 年,您的同事也是对的 - MFC 没有控件的自动布局。

根据 CodeProject“对话框、Formviews、DialogBars 和 PropertyPages 的布局管理器”:

“如果您经常使用对话框并想要调整它们的大小,您会注意到 MFC 中没有帮助您在调整大小后自动排列对话框控件的功能。您必须手动完成。”

对于简单的对话框,我认为您的解决方案很好,并且 OnSize() 是手动进行布局的正确位置。否则,您将不得不查看其他布局类,例如上面提到的一个或“可调整大小的对话框的自动布局”,它年轻了几年。

编辑:
根据 sergiols 的评论,微软为这篇博客文章中介绍的 Visual Studio 2015开发了动态布局,似乎可以解决这个问题。

于 2013-02-13T15:30:10.553 回答