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

因为截图时可能须要精确截取某一部分,所以须要放大镜的功能,这样截取的时候才更easy定位截图的位置。

加入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#软件开发实例.私人订制自己的屏幕截图工具(七)加入放大镜的功能的更多相关文章

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

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

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

    本实例所有文章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加 ...

  3. Java Native Interface 基于JNI的嵌入式手机软件开发实例

    1.通过JNI和c/c++的库组件.其他代码交互 2.java和c不能互通的原因时数据类型问题 Introduction https://docs.oracle.com/javase/8/docs/t ...

  4. 【网络爬虫】【python】网络爬虫(二):网易微博爬虫软件开发实例(附软件源码)

    对于urllib2的学习,这里先推荐一个教程<IronPython In Action>,上面有很多简明例子,并且也有很详尽的原理解释:http://www.voidspace.org.u ...

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

    本文系作者原创.如转载,请注明出处. 谢谢! 音频软件开发同其他软件开发一样,都需要去调试.音频软件调试同其他软件调试方法有相同的地方,也有不同的地方,同时调试时还需要借助一些专门的工具,有了这些方法 ...

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

    章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加入放大镜的功 ...

  7. Maven&mdash;&mdash;软件开发中一个神奇的项目管理工具

    由于本人是从c++转入从事JAVA工作的 所以很多东西要从头学起,相信有很多跟我一样的人吧,那么我们一起来学习. 今天我们一起来认识下Maven这个工具,很多人可能会问题了,为什么说是工具呢?不是写代 ...

  8. 软件开发学习笔记 <二>软件开发模型、Up、Rup、敏捷Up

    软件开发过程(process) 是一个将用户需求转化为软件系统所需要的活动的集合. 软件生命周期(SDLC,Software Devlopment Life Cycle) 软件从孕育.诞生.成长.成熟 ...

  9. SDKMAN 软件开发工具包管理器

    SDKMAN 是用来在类Unix 系统中管理多个版本的开发环境的工具.提供命令行接口来安装.切换.删除.列出候选版本. SDKMAN!是在大多数基于Unix的系统上管理多个软件开发套件的并行版本的工具 ...

随机推荐

  1. 先装Net Framework 后 装 IIS的处理办法

    先装IIS话,后面装Net Framework时候会自动注册 处理aspx和ashx等的处理扩展程序 先装Net Framework 后 装 IIS.扩展程序注册在命令:aspnet_regiis - ...

  2. Android ----------获取各种路径(更新中。。。。。。)

    ##在手机中的路径 *获取应用的路径,形式:/data/data/包名 String appDataDir = getApplicationInfo().dataDir; *获取手机数据存储路径,即/ ...

  3. Javascript判断空对象

    最近在项目开发中判断空对象时,用了“!”运算符,结果程序出现bug,找了好久才找到原因. 其实自己范了一些低级错误,现在把自己经验总结一下: 在JavaScript中,任意JavaScript的值都可 ...

  4. EMCA常用命令 【weber整理必出精品】

    EMCA常用命令 创建一个EM资料库 emca -repos create 重建一个EM资料库 emca -repos recreate 删除一个EM资料库 emca -repos drop 配置数据 ...

  5. 【Solr初探】Solr安装,启动,查询,索引

    1. 安装&启动 官网:http://lucene.apache.org/solr/ 下载源代码,解压,进入根目录(我把solr放在/usr/local/solr下) 在/usr/local/ ...

  6. AngularJS中的控制器示例

    <!doctype html> <html ng-app="myApp"> <head> <script src="C:\\Us ...

  7. http、TCP/IP协议与socket之间的区别

    http.TCP/IP协议与socket之间的区别     网络由下往上分为:  www.2cto.com   物理层--                       数据链路层-- 网络层--   ...

  8. npm install 本地安装与全局安装

    npm的包安装分为本地安装(local).全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已: npm install grunt # 本地安装 npm install -g gr ...

  9. POJ 2778 DNA Sequence (AC自动机,矩阵乘法)

    题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种. 思路:用AC自动机,利用AC自动机上的节点做矩阵乘法. #include<iostream> #includ ...

  10. svn: “sqlite: attempt to write a readonly database”

    原因很可能是在svn与本地同步的时候上锁了,可能没注意在svn执行与仓库同步的时候被中断,所以锁文件没有解锁,但是这样的错误,应该不是标题上所说的错误啊??搞不懂了,以前这样的错误,cleanup都有 ...