DesignCoding Studio
一切只要去努力!
博客
相册
关于作者
定制颜色:
[ 显示模式:
摘要
|
列表
]
2008-01-23
自定义控件OutLookBar
时间: 2008-01-23 22:47:51 作者: admin 阅读次数: 1471
字体大小:
小
中
大
仿微软OutLookBar的控件
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
namespace
ctListBar
...
{
public
partial
class
OutLookBar : Panel
...
{
public
OutLookBar()
...
{
buttonHeight
=
25
;
selectedBand
=
0
;
selectedBandHeight
=
0
;
InitializeComponent();
}
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
void
Initialize()
...
{
//
parent must exist!
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 dimensions
bandPanel.Location
=
new
Point(
0
, vPos);
bandPanel.Size
=
new
Size(ClientRectangle.Width, height);
//
the contained button dimensions
bandPanel.Controls[
0
].Location
=
new
Point(
0
,
0
);
bandPanel.Controls[
0
].Size
=
new
Size(ClientRectangle.Width, buttonHeight);
//
the contained content panel dimensions
bandPanel.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();
}
protected
override
void
OnPaint(PaintEventArgs pe)
...
{
//
TODO: 在此处添加自定义绘制代码
//
调用基类 OnPaint
base
.OnPaint(pe);
}
}
internal
class
BandTagInfo
...
{
public
OutLookBar outlookBar;
public
int
index;
public
BandTagInfo(OutLookBar ob,
int
index)
...
{
outlookBar
=
ob;
this
.index
=
index;
}
}
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.System;
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 state
Visible
=
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
=
10
;
iconSpacing
=
32
+
15
+
10
;
//
icon height + text height + margin
BackColor
=
Color.LightBlue;
AutoScroll
=
true
;
}
public
void
AddIcon(
string
caption, Image image, EventHandler onClickEvent)
...
{
int
index
=
Controls.Count
/
2
;
//
two entries per icon
PanelIcon 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);
label.Size
=
new
Size(Size.Width,
15
);
label.TextAlign
=
ContentAlignment.TopCenter;
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
;
}
}
}
}
文章来自:
互联网
引用通告:
查看所有引用 | 我要引用此文章
Tags:
C# OutLookBar
查看评论(0)
发表评论
C#
正在加载中...
信息提示!
发表评论
昵称:
E-Mail (可选):
主页 (可选):
验证码:
内容: (评论提交后不可编辑)
简介
webmaster#designcoding.com
将#替换为@即可
分类
Web (12)
JavaScript (10)
C# (7)
T-SQL (9)
Java (3)
VB6.0 (1)
生活锁碎 (1)
图片故事 (1)
个人日记 (7)
Div+Css (11)
相册
统计
日志:
62
篇
评论:
32
个
访问:
119146
次
在线:
2
人
建站日期:
2007-12-30
阅读排行榜
Java Table的用法(2345)
如何开启Vista Aero的效果(2138)
一个很耐玩的Flash游戏,看(1930)
JS 删除Table中的一行(1929)
移动网关CMPP3.0(原码)(1695)
VB中MDI窗体中如何判断一个(1672)
自定义控件OutLookBar (1471)
GridView导出Excel文件 (1274)
看到一个令人兴奋的 Javasc(1248)
C# 验证码(1011)
最新评论
给我发一分吧,现在公司要做短信...
--飞天鼠
能不能也给我一份呀,谢谢.现在公
--来去
<script>alert(''弹出!!...
--aa
很囧,很强大。哈哈。。过了年再
--兰陵笑笑生
哈哈。终于又见更新。
--long
存档
2007年10月 (1)
2007年11月 (8)
2007年12月 (3)
2007年04月 (3)
2007年06月 (3)
2007年07月 (3)
2007年09月 (7)
2008年01月 (4)
2008年11月 (1)
2008年02月 (5)
2008年03月 (11)
2008年04月 (6)
2009年02月 (1)
2009年03月 (1)
2009年06月 (2)
2009年07月 (1)
2009年08月 (1)
2010年03月 (1)
链接
代码设计
杏林
CSDN
GWazy
支持
其它
Rss Feed
管理