65.9K
CodeProject 正在变化。 阅读更多。
Home

OutlookTabCtrl - 另一种 Tab

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (49投票s)

2007年10月4日

公共领域

2分钟阅读

viewsIcon

756934

downloadIcon

7352

此控件是另一种选项卡。选项卡显示为水平条纹,并且可以折叠成按钮。每个选项卡都分配有自己的窗口,单击选项卡时会显示该窗口。

引言

此控件是另一种选项卡。选项卡显示为水平条纹,并且可以折叠成位于单独区域中的按钮。每个选项卡都分配有自己的窗口,单击选项卡时会显示该窗口。可以在按钮区域中显示一个附加按钮。您可以使用它来显示菜单等。

该控件派生自 CWnd,并且是基于 MFC 的公共控件。可以将其放置在任何窗口上:主框架、对话框等。

Using the Code

要创建控件并向其添加元素,您可以执行以下步骤

#include "OutlookTabCtrl.h"

OutlookTabCtrlEx<OutlookTabCtrlCustom1> m_TabCtrl;
CListCtrl m_List1, m_List2;

...

if( !m_TabCtrl.Create(this, WS_CHILD | WS_VISIBLE,CRect(10,10,100,200), ID_OutlookTabCtrl) )
    return -1;    // error.

// Create an ImageList with icons for tabs displayed as stripes.
m_TabCtrl.CreateStripeImage(NULL,IDB_STRIPE_NORMAL,IDB_STRIPE_DISABLE,true,24);
// Create an ImageList with icons for tabs displayed as buttons.
m_TabCtrl.CreateButtonImage(NULL,IDB_BUTTON_NORMAL,IDB_BUTTON_DISABLE,true,16);

// Create child controls.
if( !m_List1.Create(WS_CLIPCHILDREN | LVS_REPORT, CRect(0,0,0,0), &m_TabCtrl,ID_List1) ||
    !m_List2.Create(WS_CLIPCHILDREN | LVS_REPORT, CRect(0,0,0,0), &m_TabCtrl,ID_List2) )
    return -1;    // error.
m_List1.InsertColumn(0,"Mail",LVCFMT_LEFT,100);
m_List2.InsertColumn(0,"Calendar",LVCFMT_LEFT,100);

// Add child items in the m_TabCtrl.
if( !m_TabCtrl.AddItem(&m_List1,"Mail",0,0) ||
    !m_TabCtrl.AddItem(&m_List2,"Calendar",1,1) )
    return -1;    // error.

// Load state from registry.
if( !m_TabCtrl.LoadState(AfxGetApp(),"OutlookTabCtrl","State") )
    m_TabCtrl.PushVisibleItem();    // create default state.

m_TabCtrl.Update();

OutlookTabCtrl 类不绘制自身。为此,请从 OutlookTabCtrl::Draw 类继承并实现其函数。必须通过调用 SetDrawManager 函数将指向 OutlookTabCtrl::Draw 的指针传递给控件。类 OutlookTabCtrlCustom1...OutlookTabCtrlCustom4OutlookTabCtrl::Draw 类的现成实现。 它们各自以自己的风格渲染 OutlookTabCtrlOutlookTabCtrlEx 类可帮助您将 OutlookTabCtrl 与渲染类结合使用。例如,像这样:OutlookTabCtrlEx<OutlookTabCtrlCustom2> ctrl;

OutlookTabCtrl::IRecalc 接口设置控件中区域的大小。 OutlookTabCtrl 类有自己的 OutlookTabCtrl::IRecalc 实现。 但是,您也可以自己实现 OutlookTabCtrl::IRecalc 接口,并使用 SetRecalcManager 函数将指向它的指针传递到控件中。

还有三个附加类:AbilityNotifyToolTipAbility 类允许用户选择任何选项卡。 Notify 通知某些事件的发生。 ToolTip 管理按钮状态下选项卡的工具提示的创建。 指向每个类的实现的指针也必须传递给 OutlookTabCtrl

所有新添加项的窗口应具有唯一的标识符。项目可以处于条纹或按钮状态。默认情况下,项目添加为条纹。用户应调用 Update 函数以显示由函数 DeleteItemSetItemWindowSelectItem 等设置的结果。您可以隐藏项目 (ShowItem) 或阻止它 (DisableItem)。 也可以获得所有可见项目 (GetVisibleIndexByHandle) 或控件中所有项目 (GetIndexByHandle) 中项目的索引。 控件可以从注册表或其他来源(LoadState/SaveState)保存和加载其元素的位置及其可见性。 这只是可能性的一部分。 要了解更多信息,请查看 OutlookTabCtrl 类的 public 接口。

祝您好运!

历史

  • 2007 年 10 月 4 日 - 发布原始版本
  • 2007 年 10 月 11 日 - 修复了添加 Dialog 作为子控件的问题; 添加了函数 SetLayoutSetButtonsAlign 以确定控件区域的位置
  • 2008 年 12 月 17 日 - 只是纠正了一些小错误
  • 2021 年 3 月 16 日 - 改进了文章的来源和文本
© . All rights reserved.