Outlook 栏控件和框架 (WTL)





5.00/5 (7投票s)
2001 年 3 月 23 日

283843

7096
可以在您的 WTL 应用程序中使用的 Outlook 控件和框架
致谢
首先,我要感谢最初的作者 Iuri Apollonio,他使用 MFC 开发了这款出色的控件。他的代码被用于将控件移植到 WTL,并进行了一些 WTL 调整和修复。原始文章可以在以下位置找到:
Outlook 标题栏基于 Maxime Labelle 编写的 Window Caption Bar,原始文章可以在 https://codeproject.org.cn/useritems/captionbarctrl.asp 找到
标题栏上的 Flatbutton 基于 Davide Calabro 的优秀 CButtonST
类,该类已移植到 WTL。 Flatbutton 类已扩展,包括获取 outlook flatbutton 样式的函数。
概述
- 我需要在 ATL/WTL 项目中使用 Outlook bar,我注意到 Iuri Apollonio Outlook bar 控件是基于 MFC 的,本文基本上移植了原始的
CGfxOutBarCtrl
。三个 ATL 文件包含移植代码。
- atloutbarctrl.h(包含 WTL 的主
COutBarCtrl
类) - atlgroupedit.h(包含 WTL 的
CGroupEdit
类,由COutBarCtrl
类使用) - atloutbarsplit.h(包含 WTL 的
COutlookSplitterWindow
类,由COutBarCtrl
类使用)
标题栏可以在以下位置找到:
- atlcaptionbar.h(包含主
CCaptionBar
)
flatbutton 类可以在以下位置找到:
- atlflatbutton.h(包含主
CButtonST
类)
COutlookSplitterWindow
bar 继承自 WTL CSplitterWindow
类,需要添加其他功能以使左侧窗格对齐(即,当应用程序调整大小时,左侧窗格不会在宽度方向上移动)。 奇怪的是,此功能存在于右侧窗格的基类中。 必须添加进一步的调整才能使其像 Outlook 分隔符一样工作。 原始的 CGfxSplitterWindow
尚未移植,因为 MFC 和 WTL 分隔符类有所不同。
要求
您将需要 WTL 库,可以从 Microsoft 网站下载这些库,网上有许多文章告诉您如何执行此操作,因此我不会用详细信息来打扰您。
注意 - 此控件使用 WTL CString
类和 STL std::list
模板类。
如何在你的 WTL 应用中使用该控件
- 确保您的 stdafx.h 中包含以下 ATL 文件:
- atlwin.h
- atlctrls.h
- atlmisc.h
atlmisc.h 是必需的,因为它具有 WTL
CString
类的定义 - 将头文件 atloutbarctrl.h 和 atloutbarsplit.h 添加到主框架类,并声明 Outlook bar 控件、Outlook Bar Splitter 对象和要在 Outlook bar 中使用的图像列表的实例。
COutBarCtrl wndBar; CImageList imaLarge, imaSmall; COutlookSplitterWindow m_splitter
- 创建 Outlook 分隔符类,例如:
m_hWndClient = m_splitter.Create(m_hWnd, rect, NULL, WS_CHILD | WS_VISIBLE);
- 创建 Outlook bar 控件,并在主框架类的
OnCreate
函数中设置图像列表,例如:DWORD dwf = COutBarCtrl::fDragItems|COutBarCtrl::fEditGroups| COutBarCtrl::fEditItems|COutBarCtrl::fRemoveGroups| COutBarCtrl::fRemoveItems|COutBarCtrl::fAddGroups| COutBarCtrl::fAnimation; if (!wndBar.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), m_splitter.m_hWnd, 1234, dwf)) { DWORD word = GetLastError(); return 0; } wndBar.SetOwner(m_hWnd); imaLarge.Create(IDB_IMAGELIST, 32, 0, RGB(128,128,128)); imaSmall.Create(IDB_SMALL_IMAGELIST, 16, 0, RGB(0,128,128)); wndBar.SetImageList(&imaLarge, COutBarCtrl::fLargeIcon); wndBar.SetImageList(&imaSmall, COutBarCtrl::fSmallIcon); wndBar.SetAnimationTickCount(20); wndBar.SetAnimSelHighlight(200); wndBar.AddFolder("Folder 1", 0); wndBar.AddFolder("Folder 2", 1); wndBar.AddFolder("Folder 3", 2); wndBar.InsertItem(0, 0, "Item 1", 0, 0); wndBar.InsertItem(0, 1, "Item 2", 1, 0); wndBar.InsertItem(0, 2, "Item 3", 2, 0);
- 您需要设置一些分隔符方法才能使其像 Outlook 分隔符一样工作。
m_splitter.m_bFullDrag = false; // Draws the Ghost bar instead m_splitter.SetSplitterExtendedStyle(SPLIT_LEFTALIGNED); // Aligns the outlook bar to the left m_splitter.SetSplitterPanes(wndBar, m_list); // Set the outlook bar on the left pane m_splitter.SetSplitterPos(120); // width of the initial outlook bar
- 要在选择选项卡时接收事件,请将宏添加到消息映射。
MESSAGE_HANDLER(WM_OUTBAR_NOTIFY, OnOutbarNotify)
在
onNotify
处理程序中,捕获事件。LRESULT OnOutbarNotify(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { switch (wParam) { case NM_OB_ITEMCLICK: // cast the lParam to an integer to get the clicked item { int index = (int) lParam; CString cs, cs1; cs1 = wndBar.GetItemText(index); cs.Format("Clicked on %d - <%s>", (int)lParam, cs1); MessageBox(cs, "Outlook Bar", MB_OK); } return 0; case NM_OB_ONLABELENDEDIT: // cast the lParam to an OUTBAR_INFO * struct; // it will contain info about the edited item { OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam; } return 1; case NM_OB_ONGROUPENDEDIT: // cast the lParam to an OUTBAR_INFO * struct; // it will contain info about the edited folder { OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam; } return 1; case NM_OB_DRAGITEM: // cast the lParam to an OUTBAR_INFO * struct; // it will contain info about the dragged items { OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam; } return 1; } return 0; }
演示应用程序显示了如何完整地使用控件。
更新
- v1.00 - 初始移植
- v1.01 - 在演示应用程序中添加了 Outlook 标题栏,还展示了如何使用嵌套的垂直和水平分隔栏来获得 Outlook 的感觉。修复了调整应用程序大小时 Outlook 控件中潜在的绘画问题。
- v1.02 - 通过在标题栏上添加 flat 按钮来扩展 Outlook 框架。还使用窗格来锁定和解锁浮动树窗口。