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

WTL ExplorerBar

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (11投票s)

2005年3月24日

2分钟阅读

viewsIcon

56111

downloadIcon

3612

一个 WTL 封装,用于 Ingo A. Kubbilun 的 "XP 风格的 Explorer Bar (Win32/MFC)" 控件。

Sample Image of WTLExplorerBarDemo

引言

很久以前,我在 CodeProject 和创建此控件的 Ingo A. Kubbilun 的网站上发现了优秀的控件“XP 风格的 Explorer Bar”。它与其他 (c++) 在网络上的实现不同之处在于,

  1. 它作为免费软件发布
  2. 它可以下载完整的源代码

而且最棒的是,它完全支持主题!

这使得它成为一个完美的入门,可以集成到任何项目中。

事实上,ExplorerBar 不依赖于 MFC 或任何其他附加库,这使得它成为一个真正的轻量级组件,非常适合任何 WTL 项目。

背景

用户应该记住,这是一个封装,用于 Ingo A. Kubbilun 创建的 现有控件。 熟练掌握原始文档通常是成功使用任何封装类的先决条件。

使用代码

这个封装类必须像 WTL 框架中的任何其他封装类一样使用

  1. 将头文件包含到 Frame 或 View
    #include "wtl_explorerbar.h"

    备注

    您需要确保,来自 原始源代码 的文件 "explorerbar.h" 和 "shellstyle.h" 与 "wtl_explorerbar.h" 位于同一文件夹中。 此外,正确的 DLL (也来自 explorerbar 源代码) 必须存在于同一目录中 (这是首选),或者可以在标准系统 DLL 搜索路径中找到。

  2. 在正确的位置 (Frame 或 View) 插入一个成员变量
    lwt::wtlExplorerBar exbar_;
  3. 在 Frame/ View 的 OnCreate 方法中
    1. 创建控件
      LRESULT OnCreate(LPCREATESTRUCT lpCreateStruct)
      {                                
      // Assert, that libraries are present
      
      bool bRes = exbar_.InitLibrary();
      ATLASSERT(bRes); 
      
      // Create the control...
      
      exbar_.Create(*this, rcDefault, WS_CHILD
                                    | WS_VISIBLE
                                    | WS_CLIPSIBLINGS
                                    | WS_CLIPCHILDREN);
    2. 插入窗格
      exbar_.AddPane(IDD_PANE_PROJECT, _T("Project")
                                     , CHS_FOCUSRECT
                                     | CHS_NOSETFOCUSONCLICK
                                     | CHS_TOOLTIP
                                     | CHS_PLAYSOUND
                                     | CHS_ANIMATEFADE
                                     , MAKEINTRESOURCE(IDD_PANE_PROJECT)
                                     , *this);
      
      exbar_.AddPane(IDD_PANE_PAGE, _T("Page")
                                  , CHS_FOCUSRECT
                                  | CHS_NOSETFOCUSONCLICK
                                  | CHS_TOOLTIP
                                  | CHS_PLAYSOUND
                                  | CHS_ANIMATEFADE
                                  , MAKEINTRESOURCE(IDD_PANE_PAGE)
                                  , *this);
  4. 将消息处理程序宏添加到 Frame / View 的消息映射中
    // This is standard
    BEGIN_MSG_MAP(thisClass)
      MSG_WM_CREATE(OnCreate)
      MSG_WM_SIZE(OnSize)
    
      // ExplorerBar message handling starts here
      BEGIN_EXPLORERBAR_RELAY_HANDLER()
    
        // handlers of 1. pane
        BEGIN_PANE_RELAY_HANDLER(IDD_PANE_PROJECT)
          RELAY_MESSAGE_HANDLER(WM_INITDIALOG, OnPaneInitDialog_Project)
          RELAY_COMMAND_ID_HANDLER(IDC_PROJECT_NEW, OnClick_Project_New)
          RELAY_COMMAND_ID_HANDLER(IDC_PROJECT_OPEN, OnClick_Project_Open)
          RELAY_COMMAND_ID_HANDLER(IDC_PROJECT_SAVE, OnClick_Project_Save)
        END_PANE_RELAY_HANDLER()
    
        // handlers of 2.pane
        BEGIN_PANE_RELAY_HANDLER(IDD_PANE_PAGE)
          RELAY_MESSAGE_HANDLER(WM_INITDIALOG, OnPaneInitDialog_Page)
          RELAY_COMMAND_ID_HANDLER(IDC_PAGE_ADD, OnClick_Page_Add)
          RELAY_COMMAND_ID_HANDLER(IDC_PAGE_DELETE, OnClick_Page_Delete)
        END_PANE_RELAY_HANDLER()
        
      // End of ExplorerBar message handling
      END_EXPLORERBAR_RELAY_HANDLER()
      
      // standard again
      CHAIN_MSG_MAP(baseClass)
      
    END_MSG_MAP()

    备注

    所有标准类型的消息处理程序宏都可用于 WTL ExplorerBar

    #define RELAY_MESSAGE_HANDLER(msg, func)
    #define RELAY_MESSAGE_RANGE_HANDLER(msgFirst, msgLast, func)
    #define RELAY_NOTIFY_HANDLER(id, cd, func)
    #define RELAY_NOTIFY_CODE_HANDLER(cd, func)
    #define RELAY_NOTIFY_ID_HANDLER(id, func)
    #define RELAY_NOTIFY_RANGE_HANDLER(idFirst, idLast, func)
    #define RELAY_COMMAND_HANDLER(id, cd, func)
    #define RELAY_COMMAND_CODE_HANDLER(cd, func)
    #define RELAY_COMMAND_ID_HANDLER(id, func)
    #define RELAY_COMMAND_RANGE_HANDLER(idFirst, idLast, func)
  5. 将所需的消息处理程序函数定义和声明添加到您的项目中。

    备注

    这些消息处理程序函数必须定义如下

    LRESULT MessageHandler(UINT nMsg, WPARAM wParam, 
           LPARAM lParam, HWND hWndDlg, UINT uPaneId, BOOL& bHandled);
    LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, HWND hwndDlg, 
                                UINT uPaneId, BOOL& bHandled);
    LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, 
                   HWND hWndDlg, UINT uPaneId, BOOL& bHandled);
  6. 根据您的需要实现定义的消息处理程序函数。

    关注点

    演示项目使用了 Yao Zhifeng 在 CodeProject 上介绍的封装 DLL 函数的方法。感谢分享这些想法。

    修订历史

    20050324        v1.0        Initial public release

    许可信息

    WTL ExplorerBar © 2005 Ralph-D. Wetzel, 88400 Biberach, 德国。保留所有权利。

    提供的代码可免费用于个人和商业用途,前提是版权声明保持不变,并且所有最终更改都用注释明确标记。

    免责声明

    此代码按“原样”提供,并且不提供任何明示或暗示的保证,包括但不限于对适销性和特定用途适用性的暗示保证。 在任何情况下,作者或任何贡献者均不对任何直接、间接、偶然、特殊、惩戒性或间接损害 (包括但不限于采购替代商品或服务、使用损失、数据或利润损失或业务中断) 承担责任。

© . All rights reserved.