我的对话框的最小尺寸不考虑状态栏的尺寸。
在
OnInitDialog
中,我创建状态栏并将其添加到动态布局中:
m_StatusBar.Create(this);
m_StatusBar.SetIndicators(&indicators_msa[0], 3);
m_StatusBar.SetPaneInfo(0, ID_INDICATOR_PROGRESS, SBPS_NORMAL, 100);
m_StatusBar.SetPaneInfo(1, ID_INDICATOR_TEXT, SBPS_STRETCH, 100);
m_StatusBar.SetPaneInfo(2, ID_INDICATOR_CONGREGATION_NAME, SBPS_NORMAL, 150);
m_StatusBar.SetPaneText(0, L"");
m_StatusBar.SetPaneText(1, L"");
m_StatusBar.SetPaneText(2, theApp.MSAToolsInterface().GetLocalCongregationName());
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
m_StatusProgressBar.Create(L"", 100, 100, true, 0, &m_StatusBar);
m_pDynamicLayout->AddItem(m_StatusBar.GetSafeHwnd(),
CMFCDynamicLayout::MoveVertical(100),
CMFCDynamicLayout::SizeHorizontal(100));
这一点确实有效。但是,当我尝试减小对话框的大小时,它会减小到原始对话框大小,而不考虑状态栏:
我不希望它隐藏状态栏:
我的
CDialog
继承自已经实现的自定义类:
void CResizingDialog::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
// Set the minimum window size to initial size.
if (!m_rcInit.IsRectEmpty()) {
lpMMI->ptMinTrackSize.x = m_rcInit.Width();
lpMMI->ptMinTrackSize.y = m_rcInit.Height();
if (m_bLimitToHorizontalResizing)
lpMMI->ptMaxTrackSize.y = m_rcInit.Height();
}
__super::OnGetMinMaxInfo(lpMMI);
}
m_rcInit
在 OnInitDialog
中定义。我意识到基类不知道状态栏。所以也许我必须在设置之前将状态栏的大小添加到默认高度ptMinTrackSize.y
?
如果我在物理上(在 IDE 中)使对话框更高以允许顶部的工具栏和状态栏,那么情况会更好。最奇怪的是。
@AdrianMole 在评论中的建议让我意识到问题所在。解决方法如下:
bool m_bRestoreWindowPositionImmediately
类添加了一个新的 CResizingDialog
变量。true
以实现向后兼容性。OnInitDialog
已更新:BOOL CResizingDialog::OnInitDialog()
{
__super::OnInitDialog();
// Save Initial window size to m_rcInit
RecalculateSize();
if (m_bRestoreWindowPositionImmediately)
{
RestoreWindowPosition();
}
return TRUE;
}
现在我修改了父
CMeetingScheduleAssistantDlg::CMeetingScheduleAssistantDlg
构造函数以将 false
传递给新变量。
最后,我修改了
CMeetingScheduleAssistantDlg::OnInitDialog
来做到这一点:
BOOL CMeetingScheduleAssistantDlg::OnInitDialog()
{
// Create toolbar
// Create status bar
RecalculateSize(); // Resets the m_rcInit
RestoreWindowPosition(); // Now restore
}
现在
m_rcInit
具有正确的大小,工具栏和状态栏就位。这是默认窗口大小。此时调用 RestoreWindowPosition
可以正常工作,窗口大小不再调整得太小,并且其行为完全符合预期。