MFC右对齐CDialogBar上的控件

时间:2012-02-21 16:07:18

标签: mfc controls right-align

我有一个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;
}

即使看到这个工作,我也不太相信。所以我的问题是:是否有更好的正确控制方法?

提前致谢,

塞尔吉奥

1 个答案:

答案 0 :(得分:2)

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

根据CodeProject“Layout Manager for Dialogs, Formviews, DialogBars and PropertyPages”:

  

“如果您经常使用Dialogs并希望调整它们的大小,您会注意到MFC中没有任何功能可以帮助您在调整大小后自动安排对话框控件。您必须手动完成。”
< / p>

对于简单的对话框,我认为您的解决方案很好,OnSize()是手动进行布局的正确位置。 否则,您将不得不查看其他布局类,例如上面提到的布局类或“Automatic Layout of Resizable Dialogs”,这些布局类年轻几年。

修改
根据sergiols的评论,微软为Dynamic Layout中引入的Visual Studio 2015开发了Blog post,似乎可以解决这个问题。