最近在上网的时候,发现了这个C# 下的 OutlookBar 控件,看了一下感觉还真不错,特此记录一下。

using System;
using System.Drawing;
using System.Windows.Forms;namespace OutLookBarDemo
{internal class BandTagInfo{public OutlookBar outlookBar;public int index;public BandTagInfo(OutlookBar ob, int index){outlookBar=ob;this.index=index;}}public class OutlookBar : Panel{private int buttonHeight;private int selectedBand;private int selectedBandHeight;public int ButtonHeight{get{return buttonHeight;}set{buttonHeight=value;// do recalc layout for entire bar
            }}public int SelectedBand{get{return selectedBand;}set{SelectBand(value);}}public OutlookBar(){buttonHeight=25;selectedBand=0;selectedBandHeight=0;}public void Initialize(){//parent Panel 必须存在不能删除//this.BorderStyle = BorderStyle.None;Parent.SizeChanged+=new EventHandler(SizeChangedEvent);}public void AddBand(string caption, ContentPanel content){content.outlookBar=this;int index=Controls.Count;BandTagInfo bti=new BandTagInfo(this, index);BandPanel bandPanel=new BandPanel(caption, content, bti);Controls.Add(bandPanel);UpdateBarInfo();RecalcLayout(bandPanel, index);}public void SelectBand(int index){selectedBand=index;RedrawBands();}private void RedrawBands(){for (int i=0; i<Controls.Count; i++){BandPanel bp=Controls[i] as BandPanel;RecalcLayout(bp, i);}}private void UpdateBarInfo(){selectedBandHeight=ClientRectangle.Height-(Controls.Count * buttonHeight);}private void RecalcLayout(BandPanel bandPanel, int index){int vPos=(index <= selectedBand) ? buttonHeight*index : buttonHeight*index+selectedBandHeight;int height=selectedBand==index ? selectedBandHeight+buttonHeight : buttonHeight;// the band dimensionsbandPanel.Location=new Point(0, vPos);bandPanel.Size=new Size(ClientRectangle.Width, height);// the contained button dimensionsbandPanel.Controls[0].Location=new Point(0, 0);bandPanel.Controls[0].Size=new Size(ClientRectangle.Width, buttonHeight);// the contained content panel dimensionsbandPanel.Controls[1].Location=new Point(0, buttonHeight);bandPanel.Controls[1].Size=new Size(ClientRectangle.Width-2, height-8);}private void SizeChangedEvent(object sender, EventArgs e){Size=new Size(Size.Width, ((Control)sender).ClientRectangle.Size.Height);UpdateBarInfo();RedrawBands();}}internal class BandPanel : Panel{public BandPanel(string caption, ContentPanel content, BandTagInfo bti){BandButton bandButton=new BandButton(caption, bti);Controls.Add(bandButton);Controls.Add(content);}}internal class BandButton : Button{private BandTagInfo bti;public BandButton(string caption, BandTagInfo bti){Text=caption;FlatStyle=FlatStyle.Standard;Visible=true;this.bti=bti;            Click+=new EventHandler(SelectBand);}private void SelectBand(object sender, EventArgs e){bti.outlookBar.SelectBand(bti.index);}}public abstract class ContentPanel : Panel{public OutlookBar outlookBar;public ContentPanel(){// initial stateVisible=true;}}public class IconPanel : ContentPanel{protected int iconSpacing;protected int margin;public int IconSpacing{get{return iconSpacing;}}public int Margin{get{return margin;}}public IconPanel(){margin=20;//这里是调节图标间距的iconSpacing = 32 + 15 + 20;    // icon height + text height + marginBackColor=Color.LightBlue;AutoScroll=true;}public void AddIcon(string caption, Image image, EventHandler onClickEvent){int index=Controls.Count/2;    // two entries per iconPanelIcon panelIcon=new PanelIcon(this, image, index, onClickEvent);Controls.Add(panelIcon);Label label=new Label();label.Text=caption;label.Visible=true;label.Location = new Point(0, margin + image.Size.Height + index * iconSpacing+5);label.Size=new Size(Size.Width, 15);label.TextAlign=ContentAlignment.BottomCenter;label.Click+=onClickEvent;label.Tag=panelIcon;Controls.Add(label);}}public class PanelIcon : PictureBox{public int index;public IconPanel iconPanel;private Color bckgColor;private bool mouseEnter;public int Index{get{return index;}}public PanelIcon(IconPanel parent, Image image, int index, EventHandler onClickEvent){this.index=index;this.iconPanel=parent;Image=image;Visible=true;Location=new Point(iconPanel.outlookBar.Size.Width/2-image.Size.Width/2,iconPanel.Margin + index*iconPanel.IconSpacing);Size=image.Size;Click+=onClickEvent;Tag=this;MouseEnter+=new EventHandler(OnMouseEnter);MouseLeave+=new EventHandler(OnMouseLeave);MouseMove+=new MouseEventHandler(OnMouseMove);bckgColor=iconPanel.BackColor;mouseEnter=false;}private void OnMouseMove(object sender, MouseEventArgs args){if ( (args.X < Size.Width-2) &&(args.Y < Size.Width-2) &&(!mouseEnter) ){BackColor=Color.LightCyan;BorderStyle=BorderStyle.FixedSingle;Location=Location-new Size(1, 1);mouseEnter=true;}}private void OnMouseEnter(object sender, EventArgs e){}private void OnMouseLeave(object sender, EventArgs e){if (mouseEnter){BackColor=bckgColor;BorderStyle=BorderStyle.None;Location=Location+new Size(1, 1);mouseEnter=false;}}}
}OutlookBar 组件代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace OutLookBarDemo
{public partial class FrmMain : Form{public FrmMain(){InitializeComponent();#region 初始化 OutLookBaroutlookBar.BorderStyle = BorderStyle.FixedSingle;outlookBar.Initialize();IconPanel iconPanel1 = new IconPanel();IconPanel iconPanel2 = new IconPanel();IconPanel iconPanel3 = new IconPanel();outlookBar.AddBand("工具条A", iconPanel1);outlookBar.AddBand("工具条B", iconPanel2);outlookBar.AddBand("工具条C", iconPanel3);//0iconPanel1.AddIcon("信息查询", Image.FromFile(@"Image\1.ico"), new EventHandler(PanelEventA));//1iconPanel1.AddIcon("购物车管理", Image.FromFile(@"Image\2.ico"), new EventHandler(PanelEventA));//2iconPanel2.AddIcon("电子邮件", Image.FromFile(@"Image\3.ico"), new EventHandler(PanelEventB));//3iconPanel2.AddIcon("密码管理", Image.FromFile(@"Image\4.ico"), new EventHandler(PanelEventB));//4iconPanel3.AddIcon("时间设置", Image.FromFile(@"Image\4.ico"), new EventHandler(PanelEventC));outlookBar.SelectBand(0);#endregion}public void PanelEventA(object sender, EventArgs e){Control ctrl = (Control)sender;PanelIcon panelIcon = ctrl.Tag as PanelIcon;string clickInfo = string.Empty;switch (panelIcon.Index){case 0:clickInfo = "信息查询";break;case 1:clickInfo = "购物车管理";break;}this.label1.Text = string.Format("您选择了 {0}", clickInfo);}public void PanelEventB(object sender, EventArgs e){Control ctrl = (Control)sender;PanelIcon panelIcon = ctrl.Tag as PanelIcon;string clickInfo = string.Empty;switch (panelIcon.Index){case 0:clickInfo = "电子邮件";break;case 1:clickInfo = "密码管理";break;}this.label1.Text = string.Format("您选择了 {0}", clickInfo);}public void PanelEventC(object sender, EventArgs e){Control ctrl = (Control)sender;PanelIcon panelIcon = ctrl.Tag as PanelIcon;string clickInfo = string.Empty;switch (panelIcon.Index){case 0:clickInfo = "时间设置";break;}this.label1.Text = string.Format("您选择了 {0}", clickInfo);}}
}调用代码

虽然 调用和获取 这块有点费劲,但是还是不错的一款组件。

-==源码下载==-

转载于:https://www.cnblogs.com/belx/p/9194792.html

分享一个 C# Winfrom 下的 OutlookBar 控件的使用相关推荐

  1. 一个效果很好的outlookbar控件CXTOutBarCtrl

    该控件来源于Xtreme Toolkit,我对其进行了修改,使其不依赖于类库独立存在,由于我没有运用XT的其他类,可能你会觉得它没有在类库中的华丽,但相对于其小巧的体格而言,已经很难得了. 源文件包括 ...

  2. 分享一个VS写的PDF打印控件

    控件CLSID A04AC669-CB70-4E8B-9CC0-9B73FC153784 功能描述 自己写的一个控件,某人寿公司的需求,可惜最后没用到. 需求如下: 1.给你一个一个PDF文档,让你打 ...

  3. Android SwipeRefreshLayout 官方下拉刷新控件介绍

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24521483 下面App基本都有下拉刷新的功能,以前基本都使用XListView ...

  4. c# OutlookBar控件

    最近在上网的时候,发现了这个C# 下的 OutlookBar 控件,看了一下感觉还真不错,特此记录一下. using System; using System.Drawing; using Syste ...

  5. Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件

    前言: 因为公司人员变动原因,导致了博主四个月没有动安卓,一直在做IOS开发,如今接近年前,终于可以花一定的时间放在安卓上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下 ...

  6. Matlab App Designer自学笔记(十四):分档旋钮控件、下拉菜单控件、微调控件

    由于一些主观及客观的原因,博主已经放弃了在CSDN上更新文章,感兴趣的朋友可以去我的个人博客去浏览可能需要的文章. 陶小桃Blog-无限进步的优质帅气大学生!热衷于分享技术和日常生活的机械专业小哥哥, ...

  7. mac下dashboard小控件开发实例(附源码)

    1.背景          用mac的用户都应该知道,mac有一个很好的功能,就是dashboard小控件的功能,按下F12键就可以自由切换.博主最近在背GRE单词,就尝试这开发了一个背单词的dash ...

  8. 想建一个带分隔条的label 控件;

    想建一个带分隔条的label 控件: Delphi / Windows SDK/API http://www.delphi2007.net/DelphiBase/html/delphi_2006120 ...

  9. js html 导出word 不用activexobject,javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印第2/2页...

    javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印第2/2页 更新时间:2008年06月21日 22:57:31   作者: 由于时间比较紧,没多的时候 ...

最新文章

  1. COM 组件设计与应用(六)——用 ATL 写第一个组件(vc.net)
  2. kubectl命令自动补全功能
  3. Magento布局layout.xml文件详解
  4. python代码示例-Python3 实例
  5. vue jsx webpack报错_从零开始,使用webpack高效搭建react工作流
  6. C#并行和多线程编程
  7. python selenium 获取接口数据
  8. xcodebuild命令行打包发布ipa
  9. 逆向Mac版WPS(解除版本过期限制)
  10. python的help()
  11. 核心数据库保护安全技术实践
  12. react antd表格中渲染一张或多张图片
  13. 二进制推广者电子计算机,31-戏说计算机与二进制那点事儿
  14. Oracle回收站及flashback drop(上)
  15. 基于stm32单片机的电子称设计
  16. 【冬察冬见】【管理知行解决方案手册】【团队治理】周报撰写
  17. 2021清华软件学院夏令营
  18. 学术/答辩PPT制作(结构篇)
  19. Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.7 - 图生成 无标度网络
  20. oracle 本地磁盘使用率,Windows 7磁盘配置使用技巧提高磁盘使用率

热门文章

  1. 开发高性能的Socket服务器
  2. 80%的经理人都不知道的邮件常识
  3. C# 电脑麦克风录音
  4. 机器学习中的概念---输入空间、标记空间、样本空间、假设空间、版本空间
  5. static_cast 剖析
  6. sql-DbContext
  7. 数据安全与隐私保护要点整理
  8. 接上一篇Trao文本行数及省略号问题
  9. 钛资本研究院:5G时代,SD-WAN将何去何从?
  10. Improved Techniques for Training GANs 代码执行中的坑 python3.6 tf环境