我有一个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;
}
即使看到这个工作,我也不太相信。所以我的问题是:是否有更好的正确控制方法?
提前致谢,
塞尔吉奥
答案 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,似乎可以解决这个问题。