您现在的位置是:首页 > 正文

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

2024-02-01 03:54:27阅读 2

上一篇: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#软件开发实例.私人订制自己的屏幕截图工具(八)添加键盘操作截图的功能

网站文章

  • 快速复现利用Log4j漏洞启动windows计算器

    快速复现利用Log4j漏洞启动windows计算器

    了解关于漏洞的描述,可以参考Vulnerability Affecting Multiple Log4j Versions Permits RCE Exploit根据文章描述,首先下载JDK1.8u1...

    2024-02-01 03:54:20
  • vue计算属性computed和侦听器watch的使用场景

    vue计算属性computed和侦听器watch的使用场景

    原文链接:https://dsx2016.com/?p=679 微信公众号: 大师兄2016 特点和区别 vue的computed选项主要用于同步对数据的处理,而watch选项主要用于事件的派发,可异步. 这两者都能达到同样的效果,但是基于它们各自的特点,使用场景会有一些区分. computed拥有缓存属性,只有当依赖的数据发生变化时,关联的数据才会变化,适用于计算或者格式化数据的...

    2024-02-01 03:54:13
  • java程序设计任务驱动教程学习笔记二

    java程序设计任务驱动教程学习笔记二

    一、标识符与关键字

    2024-02-01 03:53:43
  • Linux命令-详解more命令

    Linux命令-详解more命令

    2020年已经过去一半,最近欠下了好几篇博客。今天开始说6月的第一个博客,很简单,说一下more的命令。今天在敲命令的时候,忽然忘记咋写了,于是复习一下。

    2024-02-01 03:53:35
  • lftp的日志记录位置

    lftp的日志记录位置

    2024-02-01 03:53:28
  • FPGA:计算滑动求和----信号检测计算信号功率

    FPGA:计算滑动求和----信号检测计算信号功率

    FPGA:计算滑动求和----信号检测计算信号功率

    2024-02-01 03:53:21
  • docker安装oracle11g史上最全步骤(带图文) 热门推荐

    docker安装oracle11g史上最全步骤(带图文) 热门推荐

    因为在Linux中安装oracle非常麻烦,相信每个人也会遇到各种坑,为了一次装好,也方便将来直接可以导出镜像在各平台移植使用,所以选择用docker安装,并做详细记录,为以后需要之时拿来再看。 1、安装docker环境。 2、开始拉取oracle镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_...

    2024-02-01 03:52:50
  • iOS pickerView

    1.有几组 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 2.每组有几行 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 3.显示内容

    2024-02-01 03:52:34
  • 数据结构【ArrayLIst】

    数据结构【ArrayLIst】

    ArrayList 方法的使用和介绍

    2024-02-01 03:52:28
  • java 反射

    java 反射

    在代码运行之前,我们不确定将来会使用哪一种数据结构,只有在程序运行时才决定使用哪一个数据类,而反射可以在程序运行过程中动态获取类信息和调用类方法。通过反射构造类实例,代码最终会演变成下面这样。

    2024-02-01 03:52:02