C#软件开发实例.私人订制自己的屏幕截图工具(七)添加放大镜的功能

上一篇:C#软件开发实例.私人订制自己的屏幕截图工具(六)添加配置管理功能

由于截图时可能需要精确截取某一部分,所以需要放大镜的功能,这样截取的时候才更容易定位截图的位置。

添加PictureBox,name属性设置为“pictureBox_zoom”;

在“Form1_Load”事件处理函数中添加以下代码:

//设置放大镜的大小
            this.pictureBox_zoom.Width = this.ZoomBoxWidth;
            this.pictureBox_zoom.Height = this.ZoomBoxHeight;

在“ExitCutImage”方法中添加代码:

在“Form1_MouseUp”事件处理函数中添加代码:

在“ShowForm”方法的else条件最后添加代码:

if (this.ZoomBoxVisible)
                {
                    UpdateCutInfoLabel(UpdateUIMode.ShowZoomBox);
                    this.pictureBox_zoom.Show();
                }

在“UpdateCutInfoLabel”函数最后添加以下代码:

if (this.pictureBox_zoom.Visible || (updateUIMode & UpdateUIMode.ShowZoomBox) != UpdateUIMode.None)
            {
                Point zoomLocation = new Point(MousePosition.X + 15, MousePosition.Y + 22);
                if (zoomLocation.Y + this.pictureBox_zoom.Height > this.Height)
                {
                    if (zoomLocation.X + this.pictureBox_zoom.Width > this.Width)
                    {
                        zoomLocation = new Point(MousePosition.X - this.pictureBox_zoom.Width - 10, MousePosition.Y - this.pictureBox_zoom.Height - 10);
                    }
                    else
                    {
                        zoomLocation = new Point(MousePosition.X + 15, MousePosition.Y - this.pictureBox_zoom.Height - 15);
                    }
                }
                else
                {
                    if (zoomLocation.X + this.pictureBox_zoom.Width > this.Width)
                    {
                        zoomLocation = new Point(MousePosition.X - this.pictureBox_zoom.Width - 15, MousePosition.Y);
                    }
                }
                this.pictureBox_zoom.Location = zoomLocation;
                if (!this.pictureBox_zoom.Visible)
                {
                    this.pictureBox_zoom.Show();
                }
            }

在“Form1_KeyUp”事件处理函数中添加以下代码:

为“pictureBox_zoom”添加“Paint”事件处理程序,代码如下:

        /// <summary>
        /// 放大镜组件重绘事件处理程序
        /// 实时显示鼠标指针位置放大后的图像
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pictureBox_zoom_Paint(object sender, PaintEventArgs e)
        {
            Bitmap bmp_lbl = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height);
            int srcWidth = (int)(this.ZoomBoxWidth / 10);
            int srcHeight = (int)(this.ZoomBoxHeight / 10);

            Bitmap bmp = new Bitmap(srcWidth, srcHeight);
            Rectangle srcRect = new Rectangle(MousePosition.X - 5, MousePosition.Y - 4, srcWidth, srcHeight);
            if (!isCuting)
            {
                srcRect = new Rectangle(MousePosition.X - 6, MousePosition.Y - 5, srcWidth, srcHeight);
            }
            Graphics g = Graphics.FromImage(bmp);
            g.DrawImage(screenImage, 0, 0, srcRect, GraphicsUnit.Pixel);
            g.Dispose();

            //Zoom
            int x, y;
            for (int row = 0; row < bmp.Height; row++)
            {
                for (int col = 0; col < bmp.Width; col++)
                {
                    Color pc = bmp.GetPixel(col, row);
                    for (int h = 0; h < 10; h++)
                    {
                        for (int w = 0; w < 10; w++)
                        {
                            x = col * 10 + w;
                            y = row * 10 + h;
                            if (x < bmp_lbl.Width && y < bmp_lbl.Height)
                            {
                                bmp_lbl.SetPixel(x, y, pc);
                            }
                        }
                    }
                }
            }

            e.Graphics.DrawImage(bmp_lbl, 0, 0);

            int blockX = e.ClipRectangle.Width / 2;
            int blockY = e.ClipRectangle.Height / 2;

            SolidBrush brush = new SolidBrush(Color.FromArgb(10, 124, 202));
            Pen pen = new Pen(brush, 2.0F);
            e.Graphics.DrawLine(pen, new Point(0, blockY), new Point(e.ClipRectangle.Width, blockY));
            e.Graphics.DrawLine(pen, new Point(blockX, 0), new Point(blockX, e.ClipRectangle.Height));

            g.Dispose();
            bmp_lbl.Dispose();
        }

编译,运行,截图看看效果吧!

下一篇:C#软件开发实例.私人订制自己的屏幕截图工具(八)添加键盘操作截图的功能

C#软件开发实例.私人订制自己的屏幕截图工具(七)添加放大镜的功能

时间: 2024-08-03 15:37:17

C#软件开发实例.私人订制自己的屏幕截图工具(七)添加放大镜的功能的相关文章

C#软件开发实例.私人订制自己的屏幕截图工具(九)使用自定义光标,QQ截图时的光标

在使用QQ的截图功能的时候,是不是觉得它的光标很酷呢?今天就说一下怎么应用自定义光标,在我们的截图工具中使用QQ截图的光标. 打开资源: 切换到文件资源视图: 打开资源文件目录,将光标文件复制到此目录下: 所需光标文件下载:C#软件开发实例.私人订制自己的屏幕截图工具中使用的光标文件 选中Resources目录,刷新,显示出刚刚复制进来的光标文件: 选中光标文件,拖动到资源的文件视图中: 资源资源名称中的单词第一个字母改为大写. 光标预览: 在Form1类中添加私有变量: #region 自定义

C#软件开发实例.私人订制自己的屏幕截图工具(八)添加键盘操作截图的功能

上一篇:C#软件开发实例.私人订制自己的屏幕截图工具(七)添加放大镜的功能 虽然添加了放大镜的功能,但是在进行像素级的定位时,还是不容易精确定位,在用鼠标操作时要改变一两个像素的位置还是有些困难的. 处理键盘按下事件 /// <summary> /// 处理键盘按下事件 /// 用于实现以下功能: /// 当用户按下Esc键时,退出截图过程: /// Shift + Enter 开始截图的功能: /// 使用键盘的上下左右键调整截图位置的功能: /// Shift + 上下左右键调整截图区域大

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

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

音频软件开发中的debug方法和工具

本文系作者原创.如转载,请注明出处. 谢谢! 音频软件开发同其他软件开发一样,都需要去调试.音频软件调试同其他软件调试方法有相同的地方,也有不同的地方,同时调试时还需要借助一些专门的工具,有了这些方法和工具,就能快速的定位问题和解决问题.下面我们就谈谈这些方法和工具. 1,方法 1)log 这是软件调试中最常用的方法,音频调试也不例外.在写代码时加上一定的log, 在出问题时就打开这些log,通过log分析问题出在什么地方.一个好的log体现在如下几点: a)    要有时间和日期,有时候时间戳

C#软件开发实例.个人定制自己的屏幕抓图工具(八)加入了截图功能键盘

章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加入放大镜的功能 (八)加入键盘操作截图的功能 (九)使用自己定义光标,QQ截图时的光标 (十)在截图中包括鼠标指针形状 尽管加入了放大镜的功能,可是在进行像素级的定位时,还是不easy精确定位,在用鼠标操作时要改变一两个像素的位置还是有些困难的. 处理键盘按下事件 /// <summary> /// 处理键盘

C++开发人脸性别识别教程(12)——添加性别识别功能

经过之前几篇博客的讲解,我们已经成功搭建了MFC应用框架,并实现了基本的图像显示和人脸检测程序,在这篇博文中我们要向其中添加性别识别代码. 关于性别识别,之前已经专门拿出两篇博客的篇幅来进行讲解,这里不再赘述,具体参见:C++开发人脸性别识别教程(5)——通过FaceRecognizer类实现性别识别和C++开发人脸性别识别教程(6)——通过SVM实现性别识别. 一.分类器训练 在进行人脸性别识别之前需要训练性别识别的分类器,而分类器的训练过程是相对耗时的(大约五分钟),因此这里我们采用离线训练

华为软件开发云(DevCloud):免费可商用的项目管理工具

在软件开发技术和理念层出不穷的今天,如何更快的适应变化的环境,更好的满足客户的需求,已经成为决定从小到大各种规模企业能否活下去的关键. 天下武功唯快不破,在当今大环境中更是如此,微服务,敏捷开发,新的方法论和技术无时无刻不在提醒我们,要更快响应客户需求,更快交付,更短的迭代周期.如何在控制错误率的前提下,最大程度的提高企业的开发效率,便是每个企业重点关注的方面.Devops,微服务架构,分布式管理,种种技术和开发理念告诉我们,要靠工具:便捷的项目管理工具,高效的部署工具,稳定的自动化运维工具.

软件开发生命周期-酒店销售管理系统实例---1.数据库设计

软件项目开发模式 一  螺旋开发模式 适合于项目前期部分需求不确定的情况,对于每一个模块进行一个个开发: 分析.设计.编码.测试.上线. 好处:降低软件开发的风险(产品尽量满足用户需求) 二  瀑布模式 先进行所有模块的需求分析,当分析结束后,才进入项目下一个阶段,即设计.编码.测试.上线 更容易项目把控,项目质量有控制. "餐馆王" 系统功能分析 1.餐桌管理 2.菜类别管理(菜系) 3.菜信息(菜品) 4.订单管理 详细分析 1.后台录入的餐桌,要在前台显示:且只显示未预订 2.后

SaaS系列介绍之十四: SaaS软件开发分析

1 引言 真正的问题,不是电脑是否具备思考能力,而是人类是否具备这种能力                     ________B.F.Skinner<计算机科学> SaaS模式不同于传统软件不仅仅体现在运营的服务上,同时在软件开发的方式和技术上也有很大的不同. 如何开发SaaS软件,开发SaaS软件将用到哪些技术这都是我们要研究的主要内容. 2 实现SaaS软件的关键技术 l SOA技术 SOA与SaaS被被称作挛生姐妹确实并不为过,SOA与SaaS是现代软件服务领域的二架马车,它们奔蹄狂