CDialog我有一个支持调整大小的多用途。它可以以 3 种形式显示内容。
变化1:
变化2:
变体3:
对话控件使用资源编辑器中的动态布局设置。
变体 1 很好,无需更改。
变体 2 不显示组合和日期按钮。因此,我希望“文本将...”标签位于底部,“编辑”框更高。
变体 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());
}
Run Code Online (Sandbox Code Playgroud)
起初我以为它有效:
该注释现在位于底部。但一旦我调整窗口大小:
注释已恢复到原来的位置。
我知道我对类似问题有这个答案,但我真的需要重新构建整个布局吗?
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试上述操作时,控件宽度是原始宽度,即使对话框已恢复为更宽的对话框宽度。
CMFCDynamicLayout读取对话框资源,它存储子控件的坐标及其动态调整大小/移动属性。
这一切都是在 中完成的CDialog::OnInitDialog。例如,如果您移动子控件,m_staticInfo则不CMFCDynamicLayout知道您移动了该控件/调整了该控件的大小。因此,在下一个对话框调整大小请求时,CMFCDynamicLayout将使用旧值。
您可以为m_staticInfo除您打算手动移动的其他控件之外的所有控件添加动态调整大小/移动。m_staticInfo然后分别添加:
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
CRect rctCombo;
m_cbWeek.GetWindowRect(rctCombo);
ScreenToClient(rctCombo);
m_staticInfo.SetWindowPos(NULL, rctCombo.left, rctCombo.top, 0, 0,
SWP_NOSIZE | SWP_NOZORDER);
if(m_pDynamicLayout)
{
if(!m_pDynamicLayout->HasItem(m_staticInfo.m_hWnd))
{
m_pDynamicLayout->AddItem(m_staticInfo.m_hWnd,
CMFCDynamicLayout::MoveVertical(100), CMFCDynamicLayout::SizeNone());
}
else
{
TRACE(L"item already has dynamic move/size\n");
AfxDebugBreak(0);
}
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
在内部,MFC 调用LoadDynamicLayoutResource(m_lpszTemplateName)来初始化动态大小/移动。但文档说不要直接使用此方法。
如果您使用的对话框支持调整大小,则必须记住在将控件移动到新位置时计算新的宽度和高度。然后您将使用适当的调用之一Size。例如:
// The EDIT control height now needs increasing
iNewEditHeight = rctButton.top - iTextMarginY - rctEdit.top;
m_editText.SetWindowPos(nullptr, 0, 0, iNewWidth, iNewEditHeight, SWP_NOMOVE | SWP_NOZORDER);
Run Code Online (Sandbox Code Playgroud)
您可以自行决定如何调整控件的初始大小。
然后,OnInitDialog我调用了一个新方法:
void CEditTextDlg::SetupDynamicLayout()
{
if (m_pDynamicLayout != nullptr)
{
m_pDynamicLayout->AddItem(IDC_BUTTON_INSERT_DATE,
CMFCDynamicLayout::MoveHorizontalAndVertical(100, 100), CMFCDynamicLayout::SizeNone());
m_pDynamicLayout->AddItem(IDC_STATIC_INFO,
CMFCDynamicLayout::MoveVertical(100), CMFCDynamicLayout::SizeHorizontal(100));
m_pDynamicLayout->AddItem(IDC_EDIT_TEXT,
CMFCDynamicLayout::MoveNone(), CMFCDynamicLayout::SizeHorizontalAndVertical(100, 100));
}
}
Run Code Online (Sandbox Code Playgroud)
如果使用时没有正确设置宽度SetWindowPos而仅使用SizeNone()它将无法正确调整大小。
| 归档时间: |
|
| 查看次数: |
1576 次 |
| 最近记录: |