【发布时间】:2019-03-27 19:32:43
【问题描述】:
我有一个多用途的CDialog,它支持调整大小。它可以显示 3 种变化的内容。
变体 1:
变体 2:
变体 3:
对话控件使用资源编辑器中的动态布局设置。
变体 1 很好,不需要更改。
变体 2 不显示组合和日期按钮。因此,我希望“Text will ...”标签位于底部,“edit”框更高。
变体 3 有一个类似的问题,即日期按钮应该移到底部,而编辑框应该更高。
这可以通过更改代码中的动态布局来实现吗?
更新
我在OnInitDialog中试过这个:
if (!m_bShowWeekCombo)
{
CRect rctCombo;
m_cbWeek.GetWindowRect(rctCombo);
ScreenToClient(rctCombo);
CRect rctNote;
m_staticInfo.GetWindowRect(rctNote);
ScreenToClient(rctNote);
m_staticInfo.MoveWindow(rctCombo.left, rctCombo.top, rctNote.Width(), rctNote.Height());
}
起初我认为它有效:
注释现在位于底部。但只要我调整窗口大小:
笔记已恢复到原来的位置。
我知道我有这个answer 来解决类似的问题,但我真的需要重新构建整个布局吗?
更新 2
if (!m_bShowWeekCombo)
{
CRect rctEdit;
m_editText.GetWindowRect(rctEdit);
ScreenToClient(rctEdit);
CRect rctCombo;
m_cbWeek.GetWindowRect(rctCombo);
ScreenToClient(rctCombo);
CRect rctNote;
m_staticInfo.GetWindowRect(rctNote);
ScreenToClient(rctNote);
//m_staticInfo.MoveWindow(rctCombo.left, rctCombo.top, rctNote.Width(), rctNote.Height());
m_staticInfo.SetWindowPos(NULL, rctCombo.left, rctCombo.top, 0, 0,
SWP_NOSIZE | SWP_NOZORDER);
m_editText.SetWindowPos(NULL, 0, 0, rctEdit.Width(), rctEdit.Height() + (rctCombo.top - rctNote.top),
SWP_NOMOVE | SWP_NOZORDER);
if (m_pDynamicLayout)
{
if (!m_pDynamicLayout->HasItem(m_staticInfo.m_hWnd))
{
m_pDynamicLayout->AddItem(m_staticInfo.m_hWnd,
CMFCDynamicLayout::MoveVertical(100), CMFCDynamicLayout::SizeHorizontal(100));
}
else
{
TRACE(L"item already has dynamic move/size\n");
}
if (!m_pDynamicLayout->HasItem(m_editText.m_hWnd))
{
m_pDynamicLayout->AddItem(m_editText.m_hWnd,
CMFCDynamicLayout::MoveNone(), CMFCDynamicLayout::SizeHorizontalAndVertical(100, 100));
}
else
{
TRACE(L"item already has dynamic move/size\n");
}
}
}
当我尝试上述方法时,控件宽度是原始宽度,即使对话框已恢复到更宽的对话框宽度。
【问题讨论】: