使用 MFC 和状态栏调整对话框大小问题

问题描述 投票:0回答:1

我的对话框的最小尺寸不考虑状态栏的尺寸。

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 中)使对话框更高以允许顶部的工具栏和状态栏,那么情况会更好。最奇怪的是。

visual-c++ mfc dialog statusbar dynamiclayout
1个回答
0
投票

@AdrianMole 在评论中的建议让我意识到问题所在。解决方法如下:

  1. 我向
    bool m_bRestoreWindowPositionImmediately
    类添加了一个新的
    CResizingDialog
    变量。
  2. 构造函数已更新以包含此变量,默认为
    true
    以实现向后兼容性。
  3. OnInitDialog
    已更新:
BOOL CResizingDialog::OnInitDialog()
{
    __super::OnInitDialog();

    // Save Initial window size to m_rcInit
    RecalculateSize();

    if (m_bRestoreWindowPositionImmediately)
    {
        RestoreWindowPosition();
    }

    return TRUE;
}
  1. 现在我修改了父

    CMeetingScheduleAssistantDlg::CMeetingScheduleAssistantDlg
    构造函数以将
    false
    传递给新变量。

  2. 最后,我修改了

    CMeetingScheduleAssistantDlg::OnInitDialog
    来做到这一点:

BOOL CMeetingScheduleAssistantDlg::OnInitDialog()
{
    // Create toolbar
    // Create status bar

    RecalculateSize(); // Resets the m_rcInit
    RestoreWindowPosition(); // Now restore
}

现在

m_rcInit
具有正确的大小,工具栏和状态栏就位。这是默认窗口大小。此时调用
RestoreWindowPosition
可以正常工作,窗口大小不再调整得太小,并且其行为完全符合预期。

© www.soinside.com 2019 - 2024. All rights reserved.