C#软件开发实例.私人订制自己的屏幕截图工具(十一)编辑工具栏的实现

简介: 本实例全部文章目录(一)功能概览(二)创建项目、注册热键、显示截图主窗口(三)托盘图标及菜单的实现(四)基本截图功能实现(五)针对拖拽时闪烁卡顿现象的优化(六)添加配置管理功能(七)添加放大镜的功能(八)添加键盘操作截图的功能(九)使用自定义光标,QQ截图时的光标(十)在截图中包含鼠标指针形状概述截图之后,有时我们需要对其进行标注、修改等功能,这里就讲一下编辑工具栏的实现。

本实例全部文章目录

(三)托盘图标及菜单的实现

(四)基本截图功能实现

(五)针对拖拽时闪烁卡顿现象的优化

(六)添加配置管理功能

(七)添加放大镜的功能

(八)添加键盘操作截图的功能

(九)使用自定义光标,QQ截图时的光标

(十)在截图中包含鼠标指针形状

概述

截图之后,有时我们需要对其进行标注、修改等功能,这里就讲一下编辑工具栏的实现。

效果


资源




大概思路

工具栏的图片包含正常的状态和选中的状态,绘制的时候根据状态取对应位置的图片进行绘制;

事件方法

需要响应几个事件:
选取截图区域结束,显示工具栏;
鼠标在工具栏上移动时,设置按钮的焦点状态;
鼠标在工具栏上按下时, 设置按钮的焦点状态;

界面元素


我这里使用Label控件显示工具栏;
使用Panel控件显示工具的设置项及调色板;

相关代码

初始化工具栏
        /// <summary>
        /// 窗口加载事件处理程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            this.lbl_ToolBox.Size = new Size(Properties.Resources.ToolsBox.Size.Width, 26);//设置大小
            this.lbl_ToolBox.Visible = false;//默认不显示
        }
显示工具栏
        /// <summary>
        /// 截图窗口鼠标抬起事件处理程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (this.isCuting)
                {
                    this.isCuting = false;

                    //如果自动发现窗口的区域不为空,则说明用户选择的是自动发现窗口的区域
                    if (!rect_WindowFromPoint.IsEmpty)
                    {
                        SaveCutImageSize(rect_WindowFromPoint.Location, new Point(rect_WindowFromPoint.Right - 1, rect_WindowFromPoint.Bottom -1));
                    }

                    if (this.ToolBoxVisible)
                    {
                        this.lbl_ToolBox.Show();
                        //向工具栏发送鼠标按下和抬起事件,设置默认进入矩形编辑状态
                        MouseEventArgs arg = new MouseEventArgs(MouseButtons.Left, 1, 15, 15, 0);
                        this.lbl_ToolBox_MouseDown(this.lbl_ToolBox, arg);
                        this.lbl_ToolBox_MouseUp(this.lbl_ToolBox, arg);
                    }
                    this.pictureBox_zoom.Hide();

                    this.lastMouseMoveTime = 0;
                    UpdateCutInfoLabel(UpdateUIMode.None);
                }
            }
        }
        /// <summary>
        /// 工具栏按钮的宽度
        /// </summary>
        private int[] toolBoxsWidth = new int[] { 22, 22, 22, 22, 22, 22, 22, 22, 35, 22, 54 };

        /// <summary>
        /// 工具样式按钮的左侧边距
        /// </summary>
        private int[] toolBoxsLeft = new int[] { 7, 33, 59, 85, 111, 137, 171, 197, 223, 268, 294 };

        /// <summary>
        /// 工具栏按钮提示信息
        /// </summary>
        private string[] toolBoxsTip = new string[] { "矩形工具", "椭圆工具", "箭头工具", "画刷工具", "文字工具", "提示工具", "撤消编辑", "保存截图", "上传截图", "退出截图", "完成截图" };

        /// <summary>
        /// 工具栏绘制事件处理程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lbl_ToolBox_Paint(object sender, PaintEventArgs e)
        {
            Bitmap bmp_lbl = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height);
            Graphics g = Graphics.FromImage(bmp_lbl);

            g.DrawImage(Properties.Resources.ToolsBox, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel);

            bool tipFlag = false;
            for (int i = 0; i < toolBoxsLeft.Length; i++)
            {
                Rectangle fcs_Rect = new Rectangle(toolBoxsLeft[i], 3, toolBoxsWidth[i], toolHeight);
                Rectangle sld_Rect = new Rectangle(toolBoxsLeft[i], 29, toolBoxsWidth[i], toolHeight);

                if (fcs_Rect.Contains(this.mouseDownToolBoxLocation))
                {
                    g.DrawImage(Properties.Resources.ToolsBox, fcs_Rect, sld_Rect, GraphicsUnit.Pixel);


                }
                else
                {
                    if (fcs_Rect.Contains(this.mouseInToolBoxLocation))
                    {
                        g.DrawImage(Properties.Resources.ToolsBox, fcs_Rect, sld_Rect, GraphicsUnit.Pixel);
                    }
                }
                //如果选中的是矩形工具,则根据子类型绘制按钮的图标
                if (i == 0)
                {
                    Rectangle src_Rect = new Rectangle(0, 0, 22, 20);
                    //绘制工具按钮的背景
                    if (fcs_Rect.Contains(this.mouseDownToolBoxLocation))
                    {
                        g.DrawImage(Properties.Resources.ToolBox_Selected, fcs_Rect, src_Rect, GraphicsUnit.Pixel);
                    }
                    else
                    {
                        if (fcs_Rect.Contains(this.mouseInToolBoxLocation))
                        {
                            g.DrawImage(Properties.Resources.ToolBox_Selected, fcs_Rect, src_Rect, GraphicsUnit.Pixel);
                        }
                        else
                        {
                            g.DrawImage(Properties.Resources.ToolBox_Normal, fcs_Rect, src_Rect, GraphicsUnit.Pixel);
                        }
                    }

                    Rectangle dst_Rect = new Rectangle(fcs_Rect.Left + 3, fcs_Rect.Top + 2, 16, 16);
                    src_Rect = new Rectangle(0, 0, 16, 16);
                    //根据子类型绘制按钮的图标
                    switch (this.imageSubEditMode)
                    {
                        case ImageSubEditMode.Rectangle:
                            g.DrawImage(Properties.Resources.Icon_Rectangle, dst_Rect, src_Rect, GraphicsUnit.Pixel);

                            break;
                        case ImageSubEditMode.CircularRectangle:
                            g.DrawImage(Properties.Resources.Icon_Circular, dst_Rect, src_Rect, GraphicsUnit.Pixel);
                            break; ;
                        case ImageSubEditMode.Ellipse:
                            g.DrawImage(Properties.Resources.Icon_Ellipse, dst_Rect, src_Rect, GraphicsUnit.Pixel);
                            break;
                        case ImageSubEditMode.Arrowhead:
                            g.DrawImage(Properties.Resources.Icon_Arrowhead, dst_Rect, src_Rect, GraphicsUnit.Pixel);
                            break;
                        default: break;
                    }

                    //绘制三角块
                    Rectangle dstRect_SanJiaoKuai = new Rectangle(fcs_Rect.Left + 15, fcs_Rect.Top + 15, 5, 3);
                    Rectangle srcRect_SanJiaoKuai = new Rectangle(0, 0, 5, 3);
                    g.DrawImage(Properties.Resources.SanJiaoKuai, dstRect_SanJiaoKuai, srcRect_SanJiaoKuai, GraphicsUnit.Pixel);
                }
                //==============================================================================================================

                //如果选中的是提示工具,则根据子类型绘制按钮的图标
                if (i == 5)
                {
                    Rectangle src_Rect = new Rectangle(0, 0, 22, 20);
                    //绘制工具按钮的背景
                    if (fcs_Rect.Contains(this.mouseDownToolBoxLocation))
                    {
                        g.DrawImage(Properties.Resources.ToolBox_Selected, fcs_Rect, src_Rect, GraphicsUnit.Pixel);
                    }
                    else
                    {
                        if (fcs_Rect.Contains(this.mouseInToolBoxLocation))
                        {
                            g.DrawImage(Properties.Resources.ToolBox_Selected, fcs_Rect, src_Rect, GraphicsUnit.Pixel);
                        }
                        else
                        {
                            g.DrawImage(Properties.Resources.ToolBox_Normal, fcs_Rect, src_Rect, GraphicsUnit.Pixel);
                        }
                    }

                    Rectangle dst_Rect = new Rectangle(fcs_Rect.Left + 3, fcs_Rect.Top + 2, 16, 16);
                    src_Rect = new Rectangle(0, 0, 16, 16);
                    //根据子类型绘制按钮的图标
                    switch (this.imageSubEditMode)
                    {
                        case ImageSubEditMode.Rectangle:
                            g.DrawImage(Properties.Resources.Icon_ToolTips, dst_Rect, src_Rect, GraphicsUnit.Pixel);

                            break;
                        case ImageSubEditMode.CircularRectangle:
                            g.DrawImage(Properties.Resources.Icon_ToolTips, dst_Rect, src_Rect, GraphicsUnit.Pixel);
                            break; ;
                        case ImageSubEditMode.Ellipse:
                            g.DrawImage(Properties.Resources.Icon_ToolTips, dst_Rect, src_Rect, GraphicsUnit.Pixel);
                            break;
                        case ImageSubEditMode.Arrowhead:
                            g.DrawImage(Properties.Resources.Icon_ToolTips, dst_Rect, src_Rect, GraphicsUnit.Pixel);
                            break;
                        default: break;
                    }

                    //绘制三角块
                    Rectangle dstRect_SanJiaoKuai = new Rectangle(fcs_Rect.Left + 15, fcs_Rect.Top + 15, 5, 3);
                    Rectangle srcRect_SanJiaoKuai = new Rectangle(0, 0, 5, 3);
                    g.DrawImage(Properties.Resources.SanJiaoKuai, dstRect_SanJiaoKuai, srcRect_SanJiaoKuai, GraphicsUnit.Pixel);
                }
                //==============================================================================================================

                if (fcs_Rect.Contains(this.mouseInToolBoxLocation))
                {
                    this.toolTip1.SetToolTip(this.lbl_ToolBox, toolBoxsTip[i]);
                    tipFlag = true;
                }
            }
            if (!tipFlag)
            {
                this.toolTip1.SetToolTip(this.lbl_ToolBox, "");
            }

            e.Graphics.DrawImage(bmp_lbl, 0, 0);
            g.Dispose();
            bmp_lbl.Dispose();
        }

小结

主要用到的技术:区域绘制,按钮多态,编辑状态;

目录
相关文章
|
6月前
|
C# Windows
C#通过代码实现快捷键编辑
C#通过代码实现快捷键编辑
|
6月前
|
自然语言处理 C# Windows
C#开源免费的Windows右键菜单管理工具
C#开源免费的Windows右键菜单管理工具
|
6月前
|
IDE C# 开发工具
一个开源轻量级的C#代码格式化工具(支持VS和VS Code)
一个开源轻量级的C#代码格式化工具(支持VS和VS Code)
188 6
|
1月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
47 0
|
1月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
40 0
|
1月前
|
SQL JSON BI
最好的 C# .NET 报告工具
最好的 C# .NET 报告工具
35 0
|
3月前
|
传感器 开发框架 JSON
聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例
聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例
152 0
|
4月前
|
文字识别 自然语言处理 C#
印刷文字识别使用问题之C#发票识别的代码实例在哪里可以查看
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
5月前
|
算法 C#
C#开源实用的工具类库,集成超过1000多种扩展方法
C#开源实用的工具类库,集成超过1000多种扩展方法