gpt4 book ai didi

c++ - MFC MDI CtabView 隐藏/删除不使用的导航控件

转载 作者:行者123 更新时间:2023-12-04 01:03:59 24 4
gpt4 key购买 nike

我有 4 个按钮没有直接应用到我的程序。我想隐藏或删除它们。我已经搜索过以找出它们的名称...它们看起来像导航、左/右箭头、下一个/上一个。我好像找不到他们叫什么。我在 Microsoft 站点上查看过,查看 CTabView 成员似乎并没有跳出来说“嘿,这就是你要找的东西”......

Buttons I'd like to remove

我希望这是一项相对容易的任务。有人知道如何“关闭它们”吗?

谢谢。

更新:

通过将新函数移动到 OutputWnd.h 中现有函数之前,我能够解决提到的 C4430,这解决了输出 Pane 区域中箭头现在消失的问题。我忘了提及的是,我有另一种机制 AddView,它创建 2 个运行时类并将它们放入选项卡式文档 View 中。这一次,我一直在使用 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();

最佳答案

没有公开的、记录在案的 API 来隐藏这些导航按钮。但是,深入研究 MFC 源代码会发现:

  • CMFCTabCtrl 中的箭头是 CMFCTabButton m_btnScrollLeft, m_btnScrollRight, m_btnScrollFirst, m_btnScrollLast;;

  • 只要 CMFCTabCtrl::m_bScrollTRUE,它们就会在 CMFCTabCtrl::OnCreate 中创建;

  • CMFCTabCtrl::m_bScrollCMFCTabCtrl::Create 中设置为 TRUE 如果任何样式 STYLE_FLATSTYLE_FLAT_SHARED_HORZ_SCROLLSTYLE_3D_SCROLLLEDSTYLE_3D_ONENOTESTYLE_3D_VS2005STYLE_3D_ROUNDED_SCROLL 是用过。

有了这种洞察力,可以通过多种方式关闭导航按钮。

  • 按照书上的规定:创建 CMFCTabCtrl 时不使用任何启用这些按钮的样式,这样只留下 STYLE_3D 可用。这确实会丢失导航按钮,但选项卡控件的样式也变得不同,选项卡本身显示为小矩形而不是梯形。

  • 未记录:覆盖 CMFCTabCtrl::m_bScroll 并在创建选项卡窗口之前将其设置为 FALSE。例如派生类CMyTabCtrl清除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;

关于c++ - MFC MDI CtabView 隐藏/删除不使用的导航控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67114676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com