博客
关于我
Outlookbar-style menu interface
阅读量:797 次
发布时间:2023-02-26

本文共 3721 字,大约阅读时间需要 12 分钟。

一个类似Outlook侧边栏的MFC控件开发指南

项目背景

在编写这段代码时,我希望开发一个类似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/

    你可能感兴趣的文章
    oracle的内置函数
    查看>>
    Oracle的存储结构
    查看>>
    Oracle的聚合函数group by结合CUBE和ROLLUP的使用
    查看>>
    Oracle监听配置、数据库实例配置等
    查看>>
    Oracle知识补充
    查看>>
    Oracle笔记(十三) 视图、同义词、索引
    查看>>
    Oracle笔记(十) 约束
    查看>>
    Oracle系列:安装Oracle RAC数据库(二)
    查看>>
    oracle系统 介绍,ORACLE数据库管理系统介绍
    查看>>
    oracle获取数据库表、字段、注释、约束等
    查看>>
    oracle表空间查询维护命令大全之三(暂时表空间)史上最全
    查看>>
    oracle表访问方式
    查看>>
    Oracle触发器
    查看>>
    oracle触发器
    查看>>
    oracle触发器
    查看>>
    Oracle计划将ZGC项目提交给OpenJDK
    查看>>
    oracle账号共享
    查看>>
    Oracle重置序列(不删除重建方式)
    查看>>
    Oracle闪回技术(Flashback)
    查看>>
    oracle零碎要点---ip地址问题,服务问题,系统默认密码问题
    查看>>