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

CFlatTabCtrl 移植到 ATL/WTL

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2001年2月7日

viewsIcon

74929

downloadIcon

1786

使用 WTL 的全功能 FlatTabCtrl

  • 下载源代码文件 - 11 Kb
  • 下载演示项目 - 21 Kb
  • Sample Image - ATLFlatTabCtrl.gif

    鸣谢

    首先,我要感谢使用 MFC 开发这个极好的控件的原始作者。 在查看源代码时,提到了以下名字:

    • Ian Brumby
    • Phil Baxter
    • Kirk Stowell

    概述

    我需要在 ATL/WTL 项目中使用一个 FlatTabCtrl,我注意到 CodeProject 上的 KPad 文章 https://codeproject.org.cn/wtl/kpad.asp 中有类似的东西,但它不是我想要的。 随后我的注意力转向了基于 MFC 的 Flat Tab 控件,这篇文章基本上移植了 CFlatTabCtrl。 两个 ATL 文件包含移植。
    • atlflattab.h(包含 WTL 的主 CFlatTabCtrl 类)
    • atlmetafilebutton.h(由 CFlatTabCtrl 类使用)

    要求

    您需要 WTL 库,可以从 Microsoft 网站下载。网上有很多文章介绍如何操作,所以我就不赘述了。

    注意 - 此控件使用 WTL 的 CString 类和 STL 的 std::list 模板类。

    如何在你的 WTL 应用中使用该控件

    1. 确保在 stdafx.h 中包含以下 ATL 文件:

    • atlwin.h
    • atlctrls.h
    • atlmisc.h

    atlmisc.h 是必需的,因为它包含 WTL CString 类的定义

    2. 将头文件 atlflattab.h 添加到将使用该控件的对话框或视图源代码。

    3. 在 OnInitDialog 函数中创建控件,例如:

    // create the flat tab control.
    
    if (!m_FlatTabCtrl.Create(m_hWnd, rect, NULL, WS_VISIBLE | WS_CHILD | FTS_HASARROWS | FTS_BOTTOM | TCS_TOOLTIPS, 
    			  0, IDC_FLATTAB))
    {
       DWORD dErrorCode = GetLastError();
       //Find out why. Check the Win32 Error codes in MSDN
    
    }
    

    如果您不希望显示工具提示,请删除 TCS_TOOLTIPS 样式

    4. 使用 InsertItem 方法将选项卡添加到控件。

         m_FlatTabCtrl.InsertItem(0, " A ");
    

    5. 如果您需要工具提示,则必须将窗口消息路由到此控件。 可以通过将控件的 PreTranslateMessage 方法通过对话框的 PreTranslateMessage 功能来实现。

    virtual BOOL PreTranslateMessage(MSG* pMsg)
    {
       m_FlatTabCtrl.PreTranslateMessage(pMsg);   return IsDialogMessage(pMsg);
    }
    

    6. 要在选项卡被选中时接收事件,请将 OnNotify 宏添加到消息映射。

           MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
    

    OnNotify 处理程序中,捕获事件。

    LRESULT OnNotify(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
       ATLASSERT(::IsWindow(m_hWnd));
       NMHDR* pNMHDR = (NMHDR*)lParam;
    
       LRESULT lResult = 0;
       // handle messages from the flat tab control itself
    
       if(IDC_FLATTAB == (UINT)wParam)
       {        sBuff.Format("Selected Tab Index %d", nChoice); MessageBox(sBuff, "Test App"); break; default: bHandled = FALSE; // not handled } } return lResult; }
    
          CString sBuff;
          int nChoice;
          switch(pNMHDR->code)
          {         case TCN_SELCHANGING:
             break;         case TCN_SELCHANGE:
             nChoice = m_FlatTabCtrl.GetCurSel();         break;
          }   }
    }
    

    演示应用程序演示了如何在 WTL 对话框类中使用该控件。

    © . All rights reserved.