Mfc 重新计算动态布局特性

Mfc 重新计算动态布局特性,mfc,Mfc,这是一个可调整大小的窗口: 设置动态布局属性,以便顶部的组框在宽度上调整大小,下部的组/框和树在两个维度上以及3个按钮上调整大小 对于高级复选框,我添加了隐藏额外控件和调整关联框高度的代码。看起来是这样的: 用于切换控制值的代码为: void CWishListDlg::ToggleAdvancedMode() { 纠正rtSortTalk、rtTalkSettings、rtTreeGroup、rtTree、rtTalkCombo; m_staticSortTalk.ShowWindow(m

这是一个可调整大小的窗口:

设置动态布局属性,以便顶部的组框在宽度上调整大小,下部的组/框和树在两个维度上以及3个按钮上调整大小

对于高级复选框,我添加了隐藏额外控件和调整关联框高度的代码。看起来是这样的:

用于切换控制值的代码为:

void CWishListDlg::ToggleAdvancedMode()
{
纠正rtSortTalk、rtTalkSettings、rtTreeGroup、rtTree、rtTalkCombo;
m_staticSortTalk.ShowWindow(m_bAdvancedMode?SW_SHOW:SW_HIDE);
m_cbTalkSortField.ShowWindow(m_bAdvancedMode?SW_SHOW:SW_HIDE);
m_CBtalkstorder.ShowWindow(m_bAdvancedMode?SW_SHOW:SW_HIDE);
m_staticSortSpeaker.ShowWindow(m_bAdvancedMode?SW_SHOW:SW_HIDE);
m_cbSpeakerSortField.ShowWindow(m_bAdvancedMode?SW_SHOW:SW_HIDE);
m_cbSpeakerSortOrder.ShowWindow(m_bAdvancedMode?SW_SHOW:SW_HIDE);
m_staticTalkHistory.ShowWindow(m_bAdvancedMode?SW_显示:SW_隐藏);
m_check includeTalkHistory.ShowWindow(m_bAdvancedMode?SW_显示:SW_隐藏);
m_staticStyle.ShowWindow(m_bAdvancedMode?SW_显示:SW_隐藏);
m_cbStyle.ShowWindow(m_bAdvancedMode?SW_SHOW:SW_HIDE);
m_staticSortTalk.GetWindowRect(&rtSortTalk);
m_staticSettings.GetWindowRect(&rtTalkSettings);
m_staticTreeDetails.GetWindowRect(&rtTreeGroup);
m_Tree.GetWindowRect(&rtTree);
如果(m_bAdvancedMode)
{
rtTalkSettings.bottom+=m_iOffsetY;
rtTreeGroup.top+=m_iOffsetY;
rtTree.top+=m_iOffsetY;
}
其他的
{
rtTalkSettings.bottom-=m_iOffsetY;
rtTreeGroup.top-=m_iOffsetY;
rtTree.top-=m_iOffsetY;
}
屏幕到客户端(&rtTalkSettings);
ScreenToClient(&rtTreeGroup);
ScreenToClient(&rtTree);
m_staticSettings.MoveWindow(&rtTalkSettings);
m_staticTreeDetails.MoveWindow(&rtTreeGroup);
m_Tree.MoveWindow(&rtTree);
}
它很好用。我可以切换到心满意足。在我尝试调整窗口大小之前:

我看不到任何基于活动显示重新计算动态布局属性的方法


如果勾选“Advanced”(高级),使控件可见(因此与资源编辑器匹配),则其大小调整良好。只有当它被取消勾选并且我修改了两个控件时,调整大小才不会正常工作。

我找到了这个极好的资源:

您需要做的是删除动态布局并重新创建它:

void CWishListDlg::setupdynamiclayeout()
{
//禁用动态布局(这将删除指针并将其设置为NULL)
使能输出(假);
//启用动态布局(这将创建一个没有元素的新指针)
启用动态输出(TRUE);
//重新创建动态布局内容
自动pManager=getdynamiclayeout();
if(pManager!=nullptr)
{
pManager->Create(this);//分配窗口!
auto moveNone=CMFCDynamicLayout::moveNone();
auto moveVertical100=CMFCDynamicLayeout::MoveVertical(100);
auto moveBoth100=CMFCDynamicLayeout::MoveHorizontal和Vertical(100100);
auto sizeBoth100=CMFCDynamicLayeout::SizeHorizontalAndVertical(100100);
auto sizeHorizontal100=CMFCDynamicClayout::SizeHorizontal(100);
auto sizeNone=cmfcdynamiclayeout::sizeNone();
pManager->AddItem(m_staticSettings.GetSafeHwnd(),moveNone,sizeHorizontal100);
pManager->AddItem(m_statictreedeails.GetSafeHwnd(),moveNone,sizebooth100);
pManager->AddItem(m_Tree.GetSafeHwnd(),moveNone,sizebooth100);
pManager->AddItem(IDC按钮帮助,moveVertical100,SizeOne);
pManager->AddItem(IDC按钮报告、moveBoth100、SizeOne);
pManager->AddItem(IDC\u按钮\u展开\u全部,移动100,SizeOne);
pManager->AddItem(IDC\u按钮\u折叠\u全部,移动100,SizeOne);
pManager->AddItem(IDC\u STATIC\u RESIZE,moveBoth100,sizeNone);
}
}
遗憾的是,您不能仅在布局中获取现有控件,也不能告诉它根据活动内容重新初始化。但是这种方法很好用。它现在可以正确调整大小: