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

用于管理标签视图的WTL标签控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.54/5 (10投票s)

2002年6月22日

4分钟阅读

viewsIcon

122627

downloadIcon

5229

本文描述了一个能够自动化管理选项卡窗口的选项卡控件。

TabViewCtrl Demo Image

引言

如果您正在寻找关于选项卡控件的通用信息,那么您来错地方了。您可以在其他地方找到关于选项卡控件的通用信息(MSDN)。如果您只是想在 WTL 中更轻松地使用选项卡控件,请继续阅读。

关于

选项卡控件是强大的工具,但有时每次需要选项卡控件时都要重新实现选项卡管理可能会很麻烦。此类封装了管理选项卡的功能。

MFC 提供了一些类似的控件,但我找不到任何适用于 WTL 的选项卡管理控件。此类最初是从一个 MFC 类 CSizingTabCtrlBar(作者未知)移植过来的,但随着工作的进展,实现已经发生了显著变化。

每个选项卡的“视图”窗口的管理松散地基于 WTL::CSplitterImpl 的窗格管理。子“视图”窗口由应用程序为每个选项卡创建,并提交给 CWTLTabViewCtrl 进行管理。

用法

要在 SDI WTL 应用程序中使用此类,请从 CWTLTabViewCtrl 派生一个类。(您需要在您的包含路径中添加 WTL 才能编译。)

class CDemoTabViewCtrl : public CWTLTabViewCtrl
{
public:
    DECLARE_WND_SUPERCLASS(NULL, 
                        CWTLTabViewCtrl::GetWndClassName())

    BOOL PreTranslateMessage(MSG* pMsg)
    {
        pMsg;
        return FALSE;
    }

    BEGIN_MSG_MAP_EX(CDemoTabViewCtrl)
        CHAIN_MSG_MAP(CWTLTabViewCtrl)
    END_MSG_MAP()
};

并在主框架上将其声明为成员变量。

...
CDemoTabViewCtrl    m_TabViewDemo;
...

创建

在 WTL SDI 应用程序中,将选项卡视图窗口创建为主框架的子窗口,并将窗口句柄赋给 m_hWndClient 成员变量。

m_hWndClient = m_TabViewDemo.Create( 
                      m_hWnd, rcDefault, NULL, 
                      WS_CHILD | WS_VISIBLE, WS_EX_STATICEDGE );
...

添加选项卡

要向选项卡控件添加选项卡,只需调用 CWTLTabViewCtrl::AddTab,传入选项卡标签、要管理的窗口以及可选的激活状态、图像索引和要与选项卡关联的参数。

CTabDemoHelp    m_DemoTabHwnd;

// Create the tab as a child of the tab control
m_DemoTabHwnd.Create( m_hWndClient );

// Add the tab to the tab control
m_TabViewDemo.AddTab( "Tab Name", m_DemoTabHwnd );
...

删除选项卡

要从选项卡控件中删除选项卡,请调用 CWTLTabViewCtrl::RemoveTab,并传入要删除的选项卡的零基索引。

// Remove the tab by specifying the zero based index of the 
// tab to remove
m_TabViewDemo.RemoveTab( theIndexOfTheTabToRemove );
    ...

CWTLTabViewCtrl::RemoveTab( ) 不会销毁传递给 CWTLTabViewCtrl::AddTab 的窗口句柄。这应该在调用 CWTLTabViewCtrl::RemoveTab() 时或当窗口不再需要时完成。

您还可以重写派生选项卡控件类中的 CWTLTabViewCtrl::OnTabRemoved 虚拟方法,以销毁窗口或为窗口分配的任何内存。

在其他场景中使用

在 WTL MDI 或 WTL 对话框应用程序中使用此类应该很简单。告诉我进展如何 ;-)

修改选项卡控件样式

要修改选项卡控件的样式,请调用 CWTLTabViewCtrl::ModifyTabStyle( ) 方法。使用此方法设置或移除选项卡样式,如 TCS_BOTTOMTCS_RIGHTTCS_VERTICAL,将使字体设置为适当的方向。

显然,选项卡控件可以处理不同方向的选项卡,尽管它无法修改用于绘制选项卡标签的文本以适应适当的方向。WM_SETFONT 消息用于设置适当的字体。

图像列表

图像列表可以与任何选项卡控件关联。这些图像列表用于确定出现在每个选项卡上的图像。CWTLTabViewCtrl::AddTab() 方法的一个可选参数指定了应出现在选项卡标签旁边的图像在图像列表中的零基索引。

API 参考

由于 CWTLTabViewCtrl 是从 WTL::CTabCtrl 派生的,因此 CWTLTabViewCtrl 具有 WTL::CTabCtrl 的所有方法。随源代码下载提供的 Windows 帮助文件包含完整的 API 参考,这是 Doxygen(www.doxygen.org)的功劳。

限制

为了使选项卡视图控件能够接收 TCN_SELCHANGE 消息(通知控件新选项卡已被选中),父窗口必须在其消息映射中使用 REFLECT_NOTIFICATIONS() 宏。

BEGIN_MSG_MAP(CMainFrame)
    ...
    REFLECT_NOTIFICATIONS()
    ...
END_MSG_MAP()

如果选项卡视图窗口是另一个窗口(如 CSplitterWindow)的子窗口,您可以使用 FORWARD_NOTIFICATIONS() 宏来转发 WM_NOTIFY 消息。

BEGIN_MSG_MAP(thisClass)
    ...
    FORWARD_NOTIFICATIONS()
    ...
END_MSG_MAP()

演示应用程序

演示应用程序是一个简单的 WTL SDI 应用程序,它包含选项卡视图控件。它允许您添加和删除选项卡,并动态更改选项卡控件的样式。

此应用程序动态分配一个窗口类,并将其存储为与选项卡关联的参数。当选项卡被删除时,它会在重写的 CWTLTabViewCtrl::OnTabRemoved 虚拟方法中销毁窗口并删除窗口类。它使用图像索引来确定要删除的窗口类型。

历史

有关此类更新,请访问 www.jones-net.com。如果您使用此类,请给我发送电子邮件。

  • 2002/06/18 - 创建。

Copyright

本文及所有附带材料 ©2002 Stephen Jones。保留所有权利。编译后的源代码可以随意使用。

本软件按“原样”提供,不提供任何明示或暗示的保证。请自行承担使用风险!作者对本产品可能造成的任何损坏/业务损失概不负责。

© . All rights reserved.