如何在 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;
}
我在 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;
}