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

时间: 2024-08-01 17:31:54

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

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

上一篇:C#软件开发实例.私人订制自己的屏幕截图工具(五)针对拖拽时闪烁卡顿现象的优化 添加设置窗口 在解决方案资源管理器窗口中,右键单击项目名称,在弹出的菜单中选择:添加>Windows窗体: 输入窗体名称"frmSetup": 设置窗体的Text属性为"设置",设置窗体的Size为"472, 276",StartPosition属性为"CenterScreen". 添加设置标签页: 左侧工具箱>窗器:双击&qu

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

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

C#软件开发实例.私人订制自己的屏幕截图工具(十)在截图中包含鼠标指针形状

在写一此帮助说明类的文档时,截取的图片如果还有鼠标的指针形状,看起来就更直观更友好一些.接下来就讲一下如何在截图中包含鼠标指针形状. 上一篇:C#软件开发实例.私人订制自己的屏幕截图工具(九)使用自定义光标,QQ截图时的光标 添加结构CURSORINFO: [StructLayout(LayoutKind.Sequential)] struct CURSORINFO { public int cbSize; public int flags; public IntPtr hCursor; pub

C#软件开发实例.私人订制自己的屏幕截图工具(三)托盘图标及菜单的实现

概述 添加托盘图标功能主要是为了添加菜单功能,可以通过托盘图标来管理程序:托盘菜单包括"打开保存目录.录制Flash动画.录制GIF动画.延时5秒截图.截图.设置.退出"等功能. 系统托盘 系统托盘是个特殊区域,通常在桌面的底部,在那里,用户可以随时访问正在运行中的那些程序.在微软的Windows里,系统托盘常指任务栏的状态区域:在Gnome的桌面时,常指布告栏区域:在KDE桌面时,指系统托盘.在每个系统里,托盘是所有正运行在桌面环境里的应用程序共享的区域. 添加托盘图标 在Form1

C#软件开发实例.私人订制自己的屏幕截图工具(一)功能概览

概述 开发该软件的原因主要是想订制实现自己想要的功能,比如:自动保存,气泡提示框类型的标注功(主要用于功能说明文档的写作)能. 托盘图标及菜单 添加托盘图标,是因为有些功能还是需要使用菜单呼出,不能什么都用快捷键. 有些东西(菜单.提示框)可能通过快捷键截图的时候截取不到,所以设置了"延时5秒截图"功能. 基本设置 QQ的截图热键是"Ctrl + Alt + A",为了不和它冲突,这里默认使用"Ctrl + Shift + A"作为快捷键. 有些

C#软件开发实例.私人订制自己的屏幕截图工具(二)创建项目、注册热键、显示截图主窗口

开发环境 操作系统:Windows Server 2008 R2 集成开发环境(IDE):Microsoft Visual Studio 2010 开发语言:c# 创建项目 文件>新建>项目 .NET Framework可以选择2.0版本,也可以选择4.0版本: 项目类型选择:Windows窗体应用程序 输入项目名称,确定 项目创建成功,如下图: 修改主窗体属性 修改窗体的"FormBorderStyle"属性为"none",实现一个没有边框的窗体 修改

C#软件开发实例.私人订制自己的屏幕截图工具(四)基本截图功能实现

实现原理 基本截图的功能主要靠响应主窗体的鼠标按下.鼠标移动.鼠标抬起几个事件的功能来实现的.截取的图片区域使用"Label"组件来显示,需要重新实现"Label"组件的"Paint"方法. 左键单击开始截图,右键单击取消截图,双击鼠标左键完成截图,将截取的图片保存到Windows剪贴板中. 添加"Label"组件 工具箱>公共组件>双击"Label"组件,修改组件属性: Name=lbl_Cu

iPhone拍照/摄像软件开发实例

  这个App基于lolfriend的源码改写,完全使用官方API.目前还没实现的功能有:替换 UIImagePickerController的cameraOverlayView;滤镜.其他效果如图,我的测试环境是3.1.2的虚拟机和 3.1.2的iPhone 3GS. 开发实例-iphone7双摄像头拍照"> 附件: CameraDemo.zips 帖子如下: 为什么我联机开发如此简单呢?? 其实今天有点激动的,因为可以通过XCode连接自己的iPod Touch进行程序的运行了. 一般

个人考勤软件开发实例(Update)

更新说明:自拙作 attendance( 2.0 版 ) 个人考勤软件登出后,不时有网友来信交流,最近有网友指出程序中的一个缺陷:在打印预览窗口中工具条按钮的命令状态不能改变.现在这个问题已基本解决.现将改好的源代码(可以算作2.1版)发布出来,同时对说明文档进行了增补(第10点说明). 这个程序是一个个人考勤软件,它从系统时钟获取时间信息,只要上下班时按时在当日考勤栏内点击相应的栏目标题即可逐日记录下个人每天的工作时间,按月统计汇总,按年形成文件.可以随意查看过去的记录,也可把记录按月打印出来