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

Outlook 栏控件和框架 (WTL)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (7投票s)

2001 年 3 月 23 日

viewsIcon

283843

downloadIcon

7096

可以在您的 WTL 应用程序中使用的 Outlook 控件和框架

Sample Image - atloutlookbar3.gif

致谢

首先,我要感谢最初的作者 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 应用中使用该控件

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

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

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

  2. 将头文件 atloutbarctrl.hatloutbarsplit.h 添加到主框架类,并声明 Outlook bar 控件、Outlook Bar Splitter 对象和要在 Outlook bar 中使用的图像列表的实例。
    COutBarCtrl wndBar;
    CImageList imaLarge, imaSmall;
    COutlookSplitterWindow m_splitter
    
  3. 创建 Outlook 分隔符类,例如:
    m_hWndClient = m_splitter.Create(m_hWnd, rect, NULL, 
        WS_CHILD | WS_VISIBLE);
  4. 创建 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);
  5. 您需要设置一些分隔符方法才能使其像 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
  6. 要在选择选项卡时接收事件,请将宏添加到消息映射。
    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 框架。还使用窗格来锁定和解锁浮动树窗口。
© . All rights reserved.