如何在 MFC 中动态 show/hide 工具栏(整个栏,而不是单个按钮)?

How to show/hide a Toolbar (the ENTIRE bar, not an individual button) dynamically in MFC?

我在 MFC 中创建了一个只有一个菜单和一个工具栏的 SDI 应用程序:

我应该 show/hide 工具栏动态 通过 此代码:

...
m_wndToolBar.ShowWindow(SW_HIDE);
...

它确实在视觉上隐藏了工具栏,但在阻止主视图重新定位的停靠区域中留下了空白,似乎仍在工作 space。而且,当我尝试拖动菜单时,它可以像工具栏一样停靠在顶部和底部。

我一定是漏掉了一些必要的步骤。那么我怎样才能“真正”移除工具栏并将主视图提升到菜单附近呢?

假设您使用的是(相对)最新版本的 MFC,并且您的 m_wndToolBar 成员是 CMFCToolBar(或从中派生),那么您应该使用 the ShowPane() member function,而不是更一般的 ShowWindow() 成员。使用前者允许框架对对接系统进行必要的调整。

来自链接文档:

Call this method instead of the CWnd::ShowWindow when showing or hiding dockable panes.

(注意 CMFCToolBar 是从 CPane 通过 派生的 CMFCBaseToolBar class。)

在您对 ShowPane() 的调用中,第一个参数将是 TRUE 以显示工具栏或 FALSE 以隐藏它;其他两个参数很可能是 FALSE,因为您想立即 重新调整停靠布局 并且您通常不希望 activate 工具栏。

所以:

//...
m_wndToolBar.ShowPane(FALSE, FALSE, FALSE); // Hide toolbar
//...

或:

//...
m_wndToolBar.ShowPane(TRUE, FALSE, FALSE); // Show toolbar
//...

另请注意,ShowPane()(或者更确切地说,它的一个版本)由框架的默认处理程序调用,用于具有任何工具栏 ID 的 show/hide 菜单项(切换其可见性);来自“afxframewndex.cpp”:

BOOL CFrameWndEx::OnPaneCheck(UINT nID)
{
    ASSERT_VALID(this);
    CBasePane* pBar = GetPane(nID);
    if (pBar != NULL)
    {
        ShowPane(pBar, (pBar->GetStyle() & WS_VISIBLE) == 0, FALSE, FALSE);
        return TRUE;
    }
    return FALSE;
}