MFC MDI CtabView 隐藏/移除不使用的导航控件
MFC MDI CtabView hidden / remove navigation controls that are not used
我有 4 个按钮没有直接应用到我的程序。我想隐藏或删除它们。我搜索过它们的名称...它们看起来像导航、left/right 箭头、next/previous。我好像找不到他们叫什么。我查看了 Microsoft 网站并查看 CTabView
成员似乎并没有跳出来说“嘿,这就是你要找的东西”......
我希望这是一个相对容易的任务。有人知道如何“关闭它们”吗?
谢谢。
更新:
我能够通过将新功能移动到 OutputWnd.h
中现有功能之前解决提到的 C4430,并且解决了输出窗格区域中箭头现在消失的问题。我忘了提到的是,我有另一种机制 AddView
,它正在创建 2 个运行时 类 并将它们放入选项卡式文档视图中。这一次,我一直在使用 GetTabControl()
让它变得漂亮,但这也遇到了同样的问题,现在出现了滚动箭头。
这就是创建 2 个新标签的代码:
Above this code is the constructor/destructor/headers, nothing else.
IMPLEMENT_DYNCREATE(CTrackView, CTabView)
void CTrackView::OnInitialUpdate()
{
// add document views
AddView(RUNTIME_CLASS(CTrainView), AfxStringID(IDS_TRAIN));
AddView(RUNTIME_CLASS(CStationView), AfxStringID(IDS_STATION));
GetTabControl().EnableTabSwap(TRUE);
GetTabControl().SetLocation(CMFCBaseTabCtrl::Location::LOCATION_BOTTOM);
GetTabControl().ModifyTabStyle(CMFCTabCtrl::STYLE_3D);
GetTabControl().SetActiveTabBoldFont(TRUE);
CTabView::OnInitialUpdate();
}
我试图注释掉 CTabView::OnInitialUpdate();
但我知道它不会也不会影响箭头。我在控件上做了一些搜索,但没有看到任何删除箭头的示例,我假设另一个覆盖是有序的。我将按照另一个示例中显示的方法进行操作,我正在寻找是否可以像显示的那样修复它。
它们共享相同的 CMFCTabCtrl
机制还是有所不同?
更新 2:
MFC 向导创建的 OutputWnd.cpp 有同样的问题,现在我已经修改了选项卡控件,我找不到正确的指针来修复 &tabCtrl()
是一个问题未知标识符。编辑:这就是问题所在,我找到了解决方法,请参阅更新 3 以查看解决方案。
int COutputWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rectDummy;
rectDummy.SetRectEmpty();
// Create User Define tab style:
int UserTabStyle = AfxGetApp()->GetProfileInt(_T("Settings"), _T("UserTabStyle"), 0); //Get value from registry
// If the key doesn't exist, UserTableStyle will be 0 or FALSE;
if (UserTabStyle != FALSE && UserTabStyle <= 8) { // User selected tab style type
int EnumUserTabStyle = UserTabStyle - 1; // Fix enum if key doesn't exist.
if (!m_wndTabs.Create(static_cast<CMFCTabCtrl::Style>(EnumUserTabStyle), rectDummy, this, 1))
{
TRACE0("Failed to create output tab window\n");
return -1; // fail to create
}
}
else { // Default tabs style if Reg key does not exist i.e. new install/program reset
if (!m_wndTabs.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, 1))
{
TRACE0("Failed to create output tab window\n");
return -1; // fail to create
}
}
// Nicely hack to access protected member
class CMFCTabCtrlEx : public CMFCTabCtrl
{
public:
void SetDisableScroll() { m_bScroll = FALSE; }
};
// One-Liner to Disable navigation control
((CMFCTabCtrlEx*)&tabCtrl())->SetDisableScroll();
// Create output panes:
const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER;
if (!m_wndOutputBuild.Create(dwStyle, rectDummy, &m_wndTabs, 2) ||
!m_wndOutputDebug.Create(dwStyle, rectDummy, &m_wndTabs, 3))
{
TRACE0("Failed to create output windows\n");
return -1; // fail to create
}
UpdateFonts();
CString strTabName;
BOOL bNameValid;
//Attach list windows to tab:
bNameValid = strTabName.LoadString(IDS_STATUS_TAB);
ASSERT(bNameValid);
m_wndTabs.AddTab(&m_wndOutputBuild, strTabName, (UINT)0);
bNameValid = strTabName.LoadString(IDS_DEBUG_TAB);
ASSERT(bNameValid);
m_wndTabs.AddTab(&m_wndOutputDebug, strTabName, (UINT)1);
int EnableDebugTab = AfxGetApp()->GetProfileInt(_T("Settings"), _T("EnableDebugTab"), 0); //Get value from registry
if (EnableDebugTab == FALSE)
{
OnOutputtabsDebug(); //Check to see if it should be enabled
}
return 0;
}
更新 3:
我找到了我的未知标识符的答案,我试图调用一个不存在的函数。如此改革并按预期工作:
// Nicely hack to access protected member
class CMFCTabCtrlEx : public CMFCTabCtrl
{
public:
void SetDisableScroll() { m_bScroll = FALSE; }
};
// One-Liner to Disable navigation control
((CMFCTabCtrlEx*)&m_wndTabs)->SetDisableScroll();
没有 public,记录了 API 来隐藏那些导航按钮。但是,深入研究 MFC 源代码发现:
箭头是 CMFCTabButton m_btnScrollLeft, m_btnScrollRight, m_btnScrollFirst, m_btnScrollLast;
in CMFCTabCtrl
;
只要 CMFCTabCtrl::m_bScroll
为 TRUE
,它们就会在 CMFCTabCtrl::OnCreate
中创建;
CMFCTabCtrl::m_bScroll
在 CMFCTabCtrl::Create
中设置为 TRUE
如果任何样式 STYLE_FLAT
、STYLE_FLAT_SHARED_HORZ_SCROLL
、STYLE_3D_SCROLLED
、STYLE_3D_ONENOTE
、STYLE_3D_VS2005
或 STYLE_3D_ROUNDED_SCROLL
。
有了这种洞察力,可以通过多种方式关闭导航按钮。
照章办事:创建 CMFCTabCtrl
时不使用任何启用这些按钮的样式,只留下 STYLE_3D
可用。这确实丢失了导航按钮,但选项卡控件的样式也变得不同,选项卡本身显示为小矩形而不是梯形。
未记录:在创建选项卡 window 之前覆盖 CMFCTabCtrl::m_bScroll
并将其设置为 FALSE
。比如导出一个classCMyTabCtrl
来清除m_bScroll
.
class CMyTabCtrl : public CMFCTabCtrl
{
protected:
BOOL PreCreateWindow(CREATESTRUCT &cs) override
{
m_bScroll = FALSE;
return CMFCTabCtrl::PreCreateWindow(cs);
}
};
然后将控件实例化为 CMyTabCtrl m_wndTabs;
而不是 CMFCTabCtrl m_wndTabs;
。
我记得我以前用 One-liner 解决过这个问题。
这里有一个直接访问 CTrackView::::OnCreate() 函数中的 m_bScroll 变量的解决方案(hack)。正如 dxiv 解释的那样,OnInitialUpdate() 来得太晚了。
int void CTrackView::::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTabView::OnCreate(lpCreateStruct) == -1)
return -1;
// add document views
AddView(RUNTIME_CLASS(CTrainView), AfxStringID(IDS_TRAIN));
AddView(RUNTIME_CLASS(CStationView), AfxStringID(IDS_STATION));
:
:
// Nicely hack to access protected member
class CMFCTabCtrlEx : public CMFCTabCtrl
{
public:
void SetDisableScroll() { m_bScroll = FALSE; }
};
// One-Liner to Disable navigation control
((CMFCTabCtrlEx*)&GetTabControl())->SetDisableScroll();
}
我有 4 个按钮没有直接应用到我的程序。我想隐藏或删除它们。我搜索过它们的名称...它们看起来像导航、left/right 箭头、next/previous。我好像找不到他们叫什么。我查看了 Microsoft 网站并查看 CTabView
成员似乎并没有跳出来说“嘿,这就是你要找的东西”......
我希望这是一个相对容易的任务。有人知道如何“关闭它们”吗?
谢谢。
更新:
我能够通过将新功能移动到 OutputWnd.h
中现有功能之前解决提到的 C4430,并且解决了输出窗格区域中箭头现在消失的问题。我忘了提到的是,我有另一种机制 AddView
,它正在创建 2 个运行时 类 并将它们放入选项卡式文档视图中。这一次,我一直在使用 GetTabControl()
让它变得漂亮,但这也遇到了同样的问题,现在出现了滚动箭头。
这就是创建 2 个新标签的代码:
Above this code is the constructor/destructor/headers, nothing else.
IMPLEMENT_DYNCREATE(CTrackView, CTabView)
void CTrackView::OnInitialUpdate()
{
// add document views
AddView(RUNTIME_CLASS(CTrainView), AfxStringID(IDS_TRAIN));
AddView(RUNTIME_CLASS(CStationView), AfxStringID(IDS_STATION));
GetTabControl().EnableTabSwap(TRUE);
GetTabControl().SetLocation(CMFCBaseTabCtrl::Location::LOCATION_BOTTOM);
GetTabControl().ModifyTabStyle(CMFCTabCtrl::STYLE_3D);
GetTabControl().SetActiveTabBoldFont(TRUE);
CTabView::OnInitialUpdate();
}
我试图注释掉 CTabView::OnInitialUpdate();
但我知道它不会也不会影响箭头。我在控件上做了一些搜索,但没有看到任何删除箭头的示例,我假设另一个覆盖是有序的。我将按照另一个示例中显示的方法进行操作,我正在寻找是否可以像显示的那样修复它。
它们共享相同的 CMFCTabCtrl
机制还是有所不同?
更新 2:
MFC 向导创建的 OutputWnd.cpp 有同样的问题,现在我已经修改了选项卡控件,我找不到正确的指针来修复 &tabCtrl()
是一个问题未知标识符。编辑:这就是问题所在,我找到了解决方法,请参阅更新 3 以查看解决方案。
int COutputWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rectDummy;
rectDummy.SetRectEmpty();
// Create User Define tab style:
int UserTabStyle = AfxGetApp()->GetProfileInt(_T("Settings"), _T("UserTabStyle"), 0); //Get value from registry
// If the key doesn't exist, UserTableStyle will be 0 or FALSE;
if (UserTabStyle != FALSE && UserTabStyle <= 8) { // User selected tab style type
int EnumUserTabStyle = UserTabStyle - 1; // Fix enum if key doesn't exist.
if (!m_wndTabs.Create(static_cast<CMFCTabCtrl::Style>(EnumUserTabStyle), rectDummy, this, 1))
{
TRACE0("Failed to create output tab window\n");
return -1; // fail to create
}
}
else { // Default tabs style if Reg key does not exist i.e. new install/program reset
if (!m_wndTabs.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, 1))
{
TRACE0("Failed to create output tab window\n");
return -1; // fail to create
}
}
// Nicely hack to access protected member
class CMFCTabCtrlEx : public CMFCTabCtrl
{
public:
void SetDisableScroll() { m_bScroll = FALSE; }
};
// One-Liner to Disable navigation control
((CMFCTabCtrlEx*)&tabCtrl())->SetDisableScroll();
// Create output panes:
const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER;
if (!m_wndOutputBuild.Create(dwStyle, rectDummy, &m_wndTabs, 2) ||
!m_wndOutputDebug.Create(dwStyle, rectDummy, &m_wndTabs, 3))
{
TRACE0("Failed to create output windows\n");
return -1; // fail to create
}
UpdateFonts();
CString strTabName;
BOOL bNameValid;
//Attach list windows to tab:
bNameValid = strTabName.LoadString(IDS_STATUS_TAB);
ASSERT(bNameValid);
m_wndTabs.AddTab(&m_wndOutputBuild, strTabName, (UINT)0);
bNameValid = strTabName.LoadString(IDS_DEBUG_TAB);
ASSERT(bNameValid);
m_wndTabs.AddTab(&m_wndOutputDebug, strTabName, (UINT)1);
int EnableDebugTab = AfxGetApp()->GetProfileInt(_T("Settings"), _T("EnableDebugTab"), 0); //Get value from registry
if (EnableDebugTab == FALSE)
{
OnOutputtabsDebug(); //Check to see if it should be enabled
}
return 0;
}
更新 3:
我找到了我的未知标识符的答案,我试图调用一个不存在的函数。如此改革并按预期工作:
// Nicely hack to access protected member
class CMFCTabCtrlEx : public CMFCTabCtrl
{
public:
void SetDisableScroll() { m_bScroll = FALSE; }
};
// One-Liner to Disable navigation control
((CMFCTabCtrlEx*)&m_wndTabs)->SetDisableScroll();
没有 public,记录了 API 来隐藏那些导航按钮。但是,深入研究 MFC 源代码发现:
箭头是
CMFCTabButton m_btnScrollLeft, m_btnScrollRight, m_btnScrollFirst, m_btnScrollLast;
inCMFCTabCtrl
;只要
CMFCTabCtrl::m_bScroll
为TRUE
,它们就会在CMFCTabCtrl::OnCreate
中创建;CMFCTabCtrl::m_bScroll
在CMFCTabCtrl::Create
中设置为TRUE
如果任何样式STYLE_FLAT
、STYLE_FLAT_SHARED_HORZ_SCROLL
、STYLE_3D_SCROLLED
、STYLE_3D_ONENOTE
、STYLE_3D_VS2005
或STYLE_3D_ROUNDED_SCROLL
。
有了这种洞察力,可以通过多种方式关闭导航按钮。
照章办事:创建
CMFCTabCtrl
时不使用任何启用这些按钮的样式,只留下STYLE_3D
可用。这确实丢失了导航按钮,但选项卡控件的样式也变得不同,选项卡本身显示为小矩形而不是梯形。未记录:在创建选项卡 window 之前覆盖
CMFCTabCtrl::m_bScroll
并将其设置为FALSE
。比如导出一个classCMyTabCtrl
来清除m_bScroll
.class CMyTabCtrl : public CMFCTabCtrl { protected: BOOL PreCreateWindow(CREATESTRUCT &cs) override { m_bScroll = FALSE; return CMFCTabCtrl::PreCreateWindow(cs); } };
然后将控件实例化为
CMyTabCtrl m_wndTabs;
而不是CMFCTabCtrl m_wndTabs;
。
我记得我以前用 One-liner 解决过这个问题。
这里有一个直接访问 CTrackView::::OnCreate() 函数中的 m_bScroll 变量的解决方案(hack)。正如 dxiv 解释的那样,OnInitialUpdate() 来得太晚了。
int void CTrackView::::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTabView::OnCreate(lpCreateStruct) == -1)
return -1;
// add document views
AddView(RUNTIME_CLASS(CTrainView), AfxStringID(IDS_TRAIN));
AddView(RUNTIME_CLASS(CStationView), AfxStringID(IDS_STATION));
:
:
// Nicely hack to access protected member
class CMFCTabCtrlEx : public CMFCTabCtrl
{
public:
void SetDisableScroll() { m_bScroll = FALSE; }
};
// One-Liner to Disable navigation control
((CMFCTabCtrlEx*)&GetTabControl())->SetDisableScroll();
}