之前写了一篇关于截图的文章(查看),只实现了简单的截图,接下的文章将介绍怎样一步步的实现一个完整的截图控件。这篇文章将介绍怎样实现绘图工具栏控件DrawToolsControl,先来了解一下这个工具栏控件包含些什么内容。因为只对截图实现添加一些简单的图形和文字绘制,所以只实现了添加矩形、椭圆、箭头、文字和线条,所以工具栏需要包含绘制矩形、椭圆、箭头、文字和线条按钮。因为还要实现撤销、保存截图等,所以工具栏还要添加撤销、保存、退出和保存当前图形的按钮。需要的按钮就这么多了,我们可以用ToolStrip来添加这些按钮,但是为了控件看起来更漂亮,需要对ToolStrip进行重绘,下面就具体怎样实现DrawToolsControl控件。
第一步:继承UserControl控件,在上面添加一个ToolStrip,然后添加前面所说的所有按钮,调整好UserControl控件的大小,让它刚好可以显示完整的ToolStrip。
第二步:添加相应按钮的点击事件,具体就不一一列出了。
第三步:对UserControl进行重绘。先改变UserControl的Region,让它为圆角的样式,然后重绘背景和边框。
第四步:对ToolStrip进行重绘。这是比较重要的,绘制好的ToolStrip还可以在其他地方使用。对ToolStrip实现重绘,需要继承ToolStripRenderer类实现一个新的ToolStripRendererEx类,根据需要,对OnRenderToolStripBackground、OnRenderButtonBackground和OnRenderSeparator方法进行重写,然后把ToolStrip的Renderer属性设置为新的ToolStripRendererEx就行了。
来看看实现的关键代码:
1、 UserControl设置Region和绘制代码:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
using (GraphicsPath path = GraphicsPathHelper.CreatePath(
ClientRectangle, 8, RoundStyle.All, false))
{
using (SolidBrush brush = new SolidBrush(ColorTable.BackColorNormal))
{
g.FillPath(brush, path);
}
using (Pen pen = new Pen(ColorTable.BorderColor))
{
g.DrawPath(pen, path);
using (GraphicsPath innerPath = GraphicsPathHelper.CreatePath(
ClientRectangle, 8, RoundStyle.All, true))
{
g.DrawPath(pen, innerPath);
}
}
}
}
private void SetRegion()
{
using (GraphicsPath path = GraphicsPathHelper.CreatePath(
ClientRectangle, 8, RoundStyle.All, false))
{
if (base.Region != null)
{
base.Region.Dispose();
}
base.Region = new Region(path);
}
}
2、 ToolStripRendererEx重绘代码:
protected override void OnRenderToolStripBackground(
ToolStripRenderEventArgs e)
{
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
LinearGradientMode mode =
e.ToolStrip.Orientation == Orientation.Horizontal ?
LinearGradientMode.Vertical : LinearGradientMode.Horizontal;
RenderBackgroundInternal(
g,
e.AffectedBounds,
ColorTable.BackColorHover,
ColorTable.BorderColor,
ColorTable.BackColorNormal,
RoundStyle.All,
false,
true,
mode);
}
protected override void OnRenderButtonBackground(
ToolStripItemRenderEventArgs e)
{
ToolStripButton item = e.Item as ToolStripButton;
if (item != null)
{
LinearGradientMode mode =
e.ToolStrip.Orientation == Orientation.Horizontal ?
LinearGradientMode.Vertical : LinearGradientMode.Horizontal;
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
Rectangle bounds = new Rectangle(Point.Empty, item.Size);
if (item.BackgroundImage != null)
{
Rectangle clipRect = item.Selected ? item.ContentRectangle : bounds;
ControlPaintEx.DrawBackgroundImage(
g,
item.BackgroundImage,
ColorTable.BackColorNormal,
item.BackgroundImageLayout,
bounds,
clipRect);
}
if (item.CheckState == CheckState.Unchecked)
{
if (item.Selected)
{
Color color = ColorTable.BackColorHover;
if (item.Pressed)
{
color = ColorTable.BackColorPressed;
}
RenderBackgroundInternal(
g,
bounds,
color,
ColorTable.BorderColor,
ColorTable.BackColorNormal,
RoundStyle.All,
true,
true,
mode);
return;
}
else
{
if (e.ToolStrip is ToolStripOverflow)
{
using (Brush brush = new SolidBrush(ColorTable.BackColorNormal))
{
g.FillRectangle(brush, bounds);
}
return;
}
}
}
else
{
Color color = ControlPaint.Light(ColorTable.BackColorHover);
if (item.Selected)
{
color = ColorTable.BackColorHover;
}
if (item.Pressed)
{
color = ColorTable.BackColorPressed;
}
RenderBackgroundInternal(
e.Graphics,
bounds,
color,
ColorTable.BorderColor,
ColorTable.BackColorNormal,
RoundStyle.All,
true,
true,
mode);
return;
}
}
base.OnRenderButtonBackground(e);
}
protected override void OnRenderSeparator(
ToolStripSeparatorRenderEventArgs e)
{
Rectangle rect = e.Item.ContentRectangle;
if (e.ToolStrip is ToolStripDropDown)
{
if (e.Item.RightToLeft == RightToLeft.Yes)
{
//rect.X -= OffsetMargin + 4;
}
else
{
rect.X += OffsetMargin + 4;
}
rect.Width -= OffsetMargin + 8;
}
RenderSeparatorLine(
e.Graphics,
rect,
ColorTable.BackColorPressed,
ColorTable.BackColorNormal,
SystemColors.ControlLightLight,
e.Vertical);
}
单独的源码就先不传上来提供下载了,等整个项目写好后一起提供吧,看看DrawToolsControl的效果:
声明:
本文版权归作者和CS 程序员之窗所有,欢迎转载,转载必须保留以下版权信息,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:Starts_2000
出处:CS 程序员之窗 http://www.csharpwin.com。
你可以免费使用或修改提供的源代码,但请保留源代码中的版权信息,详情请查看:
CS程序员之窗开源协议 http://www.csharpwin.com/csol.html。
相关推荐
1、C# 实现完整功能的截图控件(1)-实现绘图工具栏控件 2、C# 实现完整功能的截图控件(2)-实现颜色和字体选择控件 3、C# 实现完整功能的截图控件(3)-实现漂亮的快捷菜单 4、C# 实现完整功能的截图控件(4)-完整版
起步篇为第1章~第10章,主要介绍认识Visual C#,C#语言基础,C#语句控制,数组、面向对象编程,熟悉WinForms应用程序,WinForms窗体介绍,WinForms应用程序开发常用控件,菜单栏、工具栏和状态栏设计及对话框等内容...
vs2008,C#+gdi+编写的平滑滚动控件,内附源码。编译后添加的到工具栏,可作为自定义控件。
本DataGridView打印控件和.NET打印控件5.6版(含报表模板设计组件)2014年6月22日修改完成,完全免费,在.NET2.0及以上环境下都可以使用(VB打印、C#打印都是可以的),有帮助文档与使用实例。 与上一版本的5.5版...
第12章 对话框、菜单、工具栏及状态栏控件 第13章 数据库编程基础 第14章 ADO NET数据访问技术 第15章 DataGridView数据控件 第2部分 高手进阶 第16章 面向对象编程高级技术 第17章 枚举类型与泛型 第18章 LINQ技术...
实例098 在listview控件中实现修改功能 实例099 将数据库数据添加到listview控件 实例100 在listview控件中绘制底纹 实例101 在treeview控件节点中显示图片 实例102 使用树型列表动态显示菜单 实例103 使用treeview...
52、该程序实现了一个简易的绘图工具。包括铅笔、直线、椭圆、矩形、字符和橡皮。 53、该程序制成了一个时钟。自行设计了时钟的外观,用Timer组件获得当前时间并不断更新。 54、该程序生成一个自定义空间。 55、该...
《C#开发实例大全(基础卷)》筛选、汇集了C#开发从基础知识到高级应用各个层面约600个实例及源代码,每个实例都按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析解读。全书分6篇共25章,主要...
C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 <br>1.1 Visual Studio开发环境安装与配置 2 <br>0001 安装Visual Studio 2005开发环境须知 2 <br>0002 配置合适的Visual Studio 2005...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
实例010 具有提示功能的工具栏...... 9 1.3 状态栏设计...... 10 实例011 在状态栏中显示检查框...... 10 实例012 带进度条的状态栏...... 11 实例013 状态栏中加入图标...... 12 1.4 导航菜单界面.........
5.17.1 表单验证控件(RequiredFieldValidator) 5.17.2 比较验证控件(CompareValidator) 5.17.3 范围验证控件(RangeValidator) 5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件...
实例098 在listview控件中实现修改功能 161 实例099 将数据库数据添加到listview控件 162 实例100 在listview控件中绘制底纹 164 实例101 在treeview控件节点中显示图片 165 实例102 使用树型列表动态显示菜单 167 ...
第12章 对话框、菜单、工具栏及状态栏控件 第13章 数据库编程基础 第14章 ADO NET数据访问技术 第15章 DataGridView数据控件 第2部分 高手进阶 第16章 面向对象编程高级技术 第17章 枚举类型与泛型 第18章 LINQ技术...
对话框、菜单、工具栏及状态栏,数据库编程基础,ADO.NET数据访问技术,DataGridView数据控件,面向对象编程高级技术,枚举类型与泛型,LINQ技术的使用,文件及I/O,GDI+绘图技术,水晶报表与打印,网络编程,线程的...
// =1 // =-1 // =0.6 // =-1.2 经常用模数运算符来判断整数为奇数(=1)或偶数(=0) 。 循环 无条件循环 int sum,x; sum=0; for(x=1;x;x++) { sum+=x; } 有条件循环 private void button1_Click(object sender, ...
5 实例006 菜级联菜单 7 1.2 工具栏设计 7 实例007 带背景的工具栏 7 实例008 浮动工具栏 8 实例009 带下拉菜单的工具栏 9 实例010 具有提示功能的工具栏 9 1.3 状态栏设计 10...