本文共 3721 字,大约阅读时间需要 12 分钟。
在编写这段代码时,我希望开发一个类似Outlook侧边栏的MFC控件。这个控件能够在主窗口的左侧固定显示,类似于Microsoft Outlook中的侧边栏功能。控件主要由几个文件夹组成,每个文件夹包含一系列项,这些项可以是子窗口或与标准菜单命令ID相关的标签。这些项的外观可以通过自定义样式设置为列表框项、复选框、单选框或简单的超链接等形式。所有的状态和动作都由MFC的标准命令处理器和命令更新处理器来控制。
由于我没有最新的Outlook截图,所以无法确定这个控件是否与最新版本的Outlook完全一致。但我尽量模仿了我所见到的截图中的功能,尽管肯定还有许多地方会有差异或不正确之处。这个控件最初是为我们公司内部的一个应用开发的,但我觉得这个小项目挺有趣的,希望可以引起其他开发者的兴趣。它也可以与BCG库一起使用,无需任何修改。
##控件使用方法
这个控件由两部分组成:outlook2ctrl.h和.cpp文件。要在项目中使用,需要先包含这两个文件。如果希望控件支持渐变绘图的按钮,可以在项目的stdafx.h文件中将WINVER定义从0x400更改为0x500。若未更改,图形在Windows 2000和XP之前的版本可能会不完美。
在主框架头文件中添加控件的方式如下:
#include "Outlook2Ctrl.h"class CMainFrame : public CFrameWnd { COutlook2Ctrl wndOutBar; ...}; wndOutBar是继承自标准MGC CControlBar(或CBCGToolBar)的控件,通常会在主窗口的左侧固定显示。
在CMainFrame::OnCreate函数中,可以创建并初始化控件:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { // 启用其他三个边缘的停靠功能 EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM | CBRS_ALIGN_RIGHT); // 创建控件 wndOutBar.Create(this, ID_MYOUTBAR); // 添加图标到项目中 HICON hIco1 = (HICON) LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0); HICON hIco2 = (HICON) LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, 16, 16, 0); HICON hIco3 = (HICON) LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON3), IMAGE_ICON, 16, 16, 0); wndOutBar.AddFolderRes("Contacts", IDI_ICON1); wndOutBar.AddFolderItem("Categories"); wndOutBar.AddSubItem("Friends", hIco1, COutlook2Ctrl::OCL_SELECT, ID_CATEGORIES_FRIEND); wndOutBar.AddSubItem("Private", hIco2, COutlook2Ctrl::OCL_SELECT, ID_CATEGORIES_PRIVATE); wndOutBar.AddSubItem("Work", hIco3, COutlook2Ctrl::OCL_SELECT, ID_CATEGORIES_WORK); wndOutBar.AddFolderItem("View Style"); wndOutBar.AddSubItem("Grid", NULL, COutlook2Ctrl::OCL_RADIO, ID_VIEW_GRID); wndOutBar.AddSubItem("List", NULL, COutlook2Ctrl::OCL_RADIO, ID_VIEW_LIST); wndOutBar.AddSubItem("Cards", NULL, COutlook2Ctrl::OCL_RADIO, ID_VIEW_CARDS); wndOutBar.AddFolderItem(""); wndOutBar.AddSubItem("Name", NULL, COutlook2Ctrl::OCL_CHECK, ID_FIELDS_NAME); wndOutBar.AddSubItem("Phone", NULL, COutlook2Ctrl::OCL_CHECK, ID_FIELDS_PHONE); wndOutBar.AddSubItem("Address", NULL, COutlook2Ctrl::OCL_CHECK, ID_FIELDS_ADDRESS); wndOutBar.AddFolderItem(""); wndOutBar.AddSubItem("Create new contact ..", NULL, COutlook2Ctrl::OCL_COMMAND, ID_TEST_CREATENEWCONTACT); wndOutBar.AddSubItem("Import contacts ..", NULL, COutlook2Ctrl::OCL_COMMAND, ID_TEST_IMPORTCONTACT);} ##控件的功能特点
这个控件采用树状结构存储数据,文件夹项(如"Contacts"、"Categories"等)作为树的基础节点,子项("Friends"、"Private"等)作为其下的组别项。子项的外观和行为可以通过不同的风格参数控制,支持以下几种类型:
COutlook2Ctrl::OCL_SELECT:子项将显示为选中的列表框项,状态由关联的命令ID的OnCmdUI函数返回的值决定。COutlook2Ctrl::OCL_RADIO:子项显示为单选框,状态由命令ID对应的OnCmdUI函数返回的值决定,点击已经选中的单选框不会触发命令。COutlook2Ctrl::OCL_COMMAND:子项显示为热门链接,点击时会触发关联的命令ID命令(如果OnCmdUI返回值允许)。COutlook2Ctrl::OCL_CHECK:子项显示为复选框,状态由命令ID对应的OnCmdUI函数返回的值决定,点击已选中的复选框不会触发命令。COutlook2Ctrl::OCL_HWND:用于自定义窗口子项,通过AddSubItem函数传入预先创建的窗口句柄。##插入项目的方法
控件提供了几个函数来插入文件夹、项目和子项目:
AddFolder:添加带有图标的文件夹项目。AddFolderItem:添加文件夹下的项目。AddSubItem:添加带有图标和样式的子项目,参数包括子项目文本、图标、样式和命令ID。以下是使用示例:
wndOutBar.AddFolderRes("Contacts", IDI_ICON1); // 添加带图标的文件夹wndOutBar.AddFolderItem("Categories"); // 添加文件夹下的项目wndOutBar.AddSubItem("Friends", hIco1, COutlook2Ctrl::OCL_SELECT, ID_CATEGORIES_FRIEND); // 添加带图标和样式的子项目 ##点滴经验
AddSubItem函数加载子窗口时,确保窗口句柄已创建,并设置为WS_CHILD风格。AddSubItem函数中的bStretchTheChild参数,灵活控制子窗口的高度。##总结
这个控件虽然功能简单,但设计上模仿了Outlook侧边栏的风格,具有可定制性和扩展性。它可以在支持BCG库的项目中无缝使用。希望这个小项目能为开发者提供一些灵感或解决方案。
转载地址:http://xbvfk.baihongyu.com/