WTL ExplorerBar






4.85/5 (11投票s)
2005年3月24日
2分钟阅读

56111

3612
一个 WTL 封装,用于 Ingo A. Kubbilun 的 "XP 风格的 Explorer Bar (Win32/MFC)" 控件。
引言
很久以前,我在 CodeProject 和创建此控件的 Ingo A. Kubbilun 的网站上发现了优秀的控件“XP 风格的 Explorer Bar”。它与其他 (c++) 在网络上的实现不同之处在于,
- 它作为免费软件发布
- 它可以下载完整的源代码
而且最棒的是,它完全支持主题!
这使得它成为一个完美的入门,可以集成到任何项目中。
事实上,ExplorerBar 不依赖于 MFC 或任何其他附加库,这使得它成为一个真正的轻量级组件,非常适合任何 WTL 项目。
背景
用户应该记住,这是一个封装,用于 Ingo A. Kubbilun 创建的 现有控件。 熟练掌握原始文档通常是成功使用任何封装类的先决条件。
使用代码
这个封装类必须像 WTL 框架中的任何其他封装类一样使用
- 将头文件包含到 Frame 或 View
#include "wtl_explorerbar.h"
备注
您需要确保,来自 原始源代码 的文件 "explorerbar.h" 和 "shellstyle.h" 与 "wtl_explorerbar.h" 位于同一文件夹中。 此外,正确的 DLL (也来自 explorerbar 源代码) 必须存在于同一目录中 (这是首选),或者可以在标准系统 DLL 搜索路径中找到。
- 在正确的位置 (Frame 或 View) 插入一个成员变量
lwt::wtlExplorerBar exbar_;
- 在 Frame/ View 的
OnCreate
方法中- 创建控件
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);
- 插入窗格
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);
- 创建控件
- 将消息处理程序宏添加到 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)
- 将所需的消息处理程序函数定义和声明添加到您的项目中。
备注
这些消息处理程序函数必须定义如下
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);
- 根据您的需要实现定义的消息处理程序函数。
关注点
演示项目使用了 Yao Zhifeng 在 CodeProject 上介绍的封装 DLL 函数的方法。感谢分享这些想法。
修订历史
20050324 v1.0 Initial public release
许可信息
WTL ExplorerBar © 2005 Ralph-D. Wetzel, 88400 Biberach, 德国。保留所有权利。
提供的代码可免费用于个人和商业用途,前提是版权声明保持不变,并且所有最终更改都用注释明确标记。
免责声明
此代码按“原样”提供,并且不提供任何明示或暗示的保证,包括但不限于对适销性和特定用途适用性的暗示保证。 在任何情况下,作者或任何贡献者均不对任何直接、间接、偶然、特殊、惩戒性或间接损害 (包括但不限于采购替代商品或服务、使用损失、数据或利润损失或业务中断) 承担责任。