`
awark
  • 浏览: 24636 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

C# 实现完整功能的截图控件(1)-实现绘图工具栏控件

 
阅读更多

控件实现了截图、绘制矩形、圆形、箭头、线条、文字,还需要可以撤销绘制步骤、保存图形等功能,基本实现了跟QQ2008截图一样的功能,还可以更换颜色样式和鼠标的样式。截图时候的效果图如下:


相关文章:

1、C# 实现完整功能的截图控件(1)-实现绘图工具栏控件

2、C# 实现完整功能的截图控件(2)-实现颜色和字体选择控件

3、C# 实现完整功能的截图控件(3)-实现漂亮的快捷菜单

4、C# 实现完整功能的截图控件(4)-完整版

C# 实现完整功能的截图控件(1)-实现绘图工具栏控件

之前写了一篇关于截图的文章(查看),只实现了简单的截图,接下的文章将介绍怎样一步步的实现一个完整的截图控件。这篇文章将介绍怎样实现绘图工具栏控件DrawToolsControl,先来了解一下这个工具栏控件包含些什么内容。因为只对截图实现添加一些简单的图形和文字绘制,所以只实现了添加矩形、椭圆、箭头、文字和线条,所以工具栏需要包含绘制矩形、椭圆、箭头、文字和线条按钮。因为还要实现撤销、保存截图等,所以工具栏还要添加撤销、保存、退出和保存当前图形的按钮。需要的按钮就这么多了,我们可以用ToolStrip来添加这些按钮,但是为了控件看起来更漂亮,需要对ToolStrip进行重绘,下面就具体怎样实现DrawToolsControl控件。

第一步:继承UserControl控件,在上面添加一个ToolStrip,然后添加前面所说的所有按钮,调整好UserControl控件的大小,让它刚好可以显示完整的ToolStrip

第二步:添加相应按钮的点击事件,具体就不一一列出了。

第三步:对UserControl进行重绘。先改变UserControlRegion,让它为圆角的样式,然后重绘背景和边框。

第四步:对ToolStrip进行重绘。这是比较重要的,绘制好的ToolStrip还可以在其他地方使用。对ToolStrip实现重绘,需要继承ToolStripRenderer类实现一个新的ToolStripRendererEx类,根据需要,对OnRenderToolStripBackgroundOnRenderButtonBackgroundOnRenderSeparator方法进行重写,然后把ToolStripRenderer属性设置为新的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

分享到:
评论

相关推荐

    C# 实现完整的仿QQ截图控件

    1、C# 实现完整功能的截图控件(1)-实现绘图工具栏控件 2、C# 实现完整功能的截图控件(2)-实现颜色和字体选择控件 3、C# 实现完整功能的截图控件(3)-实现漂亮的快捷菜单 4、C# 实现完整功能的截图控件(4)-完整版

    Visual C# 2005程序设计自学手册 源码--iso文件!!(切记)

    起步篇为第1章~第10章,主要介绍认识Visual C#,C#语言基础,C#语句控制,数组、面向对象编程,熟悉WinForms应用程序,WinForms窗体介绍,WinForms应用程序开发常用控件,菜单栏、工具栏和状态栏设计及对话框等内容...

    C#+gdi+平滑滚动控件

    vs2008,C#+gdi+编写的平滑滚动控件,内附源码。编译后添加的到工具栏,可作为自定义控件。

    免费DataGridView打印及.NET轻松打印控件5.6版(VB打印,C#打印)

    本DataGridView打印控件和.NET打印控件5.6版(含报表模板设计组件)2014年6月22日修改完成,完全免费,在.NET2.0及以上环境下都可以使用(VB打印、C#打印都是可以的),有帮助文档与使用实例。 与上一版本的5.5版...

    C#开发实战宝典.(清华出版.王小科等).part1

    第12章 对话框、菜单、工具栏及状态栏控件 第13章 数据库编程基础 第14章 ADO NET数据访问技术 第15章 DataGridView数据控件 第2部分 高手进阶 第16章 面向对象编程高级技术 第17章 枚举类型与泛型 第18章 LINQ技术...

    明日科技C#开发入门及项目实战

    实例098 在listview控件中实现修改功能 实例099 将数据库数据添加到listview控件 实例100 在listview控件中绘制底纹 实例101 在treeview控件节点中显示图片 实例102 使用树型列表动态显示菜单 实例103 使用treeview...

    C#百例(100个个例,教你学会C#)

    52、该程序实现了一个简易的绘图工具。包括铅笔、直线、椭圆、矩形、字符和橡皮。 53、该程序制成了一个时钟。自行设计了时钟的外观,用Timer组件获得当前时间并不断更新。 54、该程序生成一个自定义空间。 55、该...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    《C#开发实例大全(基础卷)》筛选、汇集了C#开发从基础知识到高级应用各个层面约600个实例及源代码,每个实例都按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析解读。全书分6篇共25章,主要...

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 <br>1.1 Visual Studio开发环境安装与配置 2 <br>0001 安装Visual Studio 2005开发环境须知 2 <br>0002 配置合适的Visual Studio 2005...

    vc++ 开发实例源码包

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    C#程序开发范例宝典 c#学习

    实例010 具有提示功能的工具栏...... 9 1.3 状态栏设计...... 10 实例011 在状态栏中显示检查框...... 10 实例012 带进度条的状态栏...... 11 实例013 状态栏中加入图标...... 12 1.4 导航菜单界面.........

    ASP.NET 3.5 开发大全1-5

    5.17.1 表单验证控件(RequiredFieldValidator) 5.17.2 比较验证控件(CompareValidator) 5.17.3 范围验证控件(RangeValidator) 5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件...

    《C#经典编程220例》.(明日科技).【带书签】-共3部分

    实例098 在listview控件中实现修改功能 161 实例099 将数据库数据添加到listview控件 162 实例100 在listview控件中绘制底纹 164 实例101 在treeview控件节点中显示图片 165 实例102 使用树型列表动态显示菜单 167 ...

    C#开发实战宝典.(清华出版.王小科等).part2

    第12章 对话框、菜单、工具栏及状态栏控件 第13章 数据库编程基础 第14章 ADO NET数据访问技术 第15章 DataGridView数据控件 第2部分 高手进阶 第16章 面向对象编程高级技术 第17章 枚举类型与泛型 第18章 LINQ技术...

    c#开发实战宝典 明日科技 源代码

    对话框、菜单、工具栏及状态栏,数据库编程基础,ADO.NET数据访问技术,DataGridView数据控件,面向对象编程高级技术,枚举类型与泛型,LINQ技术的使用,文件及I/O,GDI+绘图技术,水晶报表与打印,网络编程,线程的...

    C# for CSDN 乱七八糟的看不懂

    // =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, ...

    C#.net_经典编程例子400个

    5 实例006 菜级联菜单 7 1.2 工具栏设计 7 实例007 带背景的工具栏 7 实例008 浮动工具栏 8 实例009 带下拉菜单的工具栏 9 实例010 具有提示功能的工具栏 9 1.3 状态栏设计 10...

Global site tag (gtag.js) - Google Analytics