C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框
最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置。网上查了一些感觉他们做的挺复杂的。我自己研究一天,做了一个比较简单的,发表出来供大家参考一下。如觉得简单,可路过,谢谢。哈哈。
先大概介绍一下原因,GDI画矩形框就不说了,很简单的。这里面最主要的就是滚轮放大和左键移动两个事件,要计算矩形框的坐标位置。下面将代码贴出如下:
先是定义需要的变量,就四个变量。
//矩形框坐标
private Rectangle DrawRect = new Rectangle(0, 0, 100, 100);
//鼠标按下时坐标
private Point MouseDownP = new Point();
//放大倍数
private int zoom = 0;
//鼠标移动矩形框次数,如果移动过矩形框则不从中心放大,以移动后的位置放大缩小,缩小为原大小,缩放数为0时,重置此数
private int MoveCount = 0;
然后编写鼠标事件
private void this_MouseWheel(object sender, MouseEventArgs e)
{
if (e.Delta > 0)
{
if (zoom < 80)// 最大放大80倍
zoom++;
}
else
{
if (zoom > 0)
zoom--;
if (zoom == 0) //放大倍数=0,不放大,鼠标拖动标记归0
MoveCount = 0;
}
//放大原理
//1、先获取放大倍数
//2、根据放大倍数,计算矩形框高度,高度=控件高度-倍数×2;
//3、根据高度,提取矩形宽度,宽度=高度×(控件宽度/控件高度),为保证矩形和原控件纵横比例,所以要乘以比例
//4、根据矩形框大小,和控件大小,计算矩形框在控件中的位置,即X,Y坐标
//1)如果没有拖动过矩形,则按默认中间位置取值,X=(控件宽度-矩形宽度)/2,Y=(控件高度-矩形高度)/2
//2)如果拖动过矩形框,则原X,Y坐标不变化
//5、根据得到的新矩形框的坐标和范围,判断是否超界,判断XY坐标
//滚轮放大事件
//矩形区域高度=控件高度-放大缩小倍数*2
DrawRect.Height = this.Height - zoom * 2;
//按比例计算宽度
DrawRect.Width = (int)(Convert.ToSingle(DrawRect.Height) * (Convert.ToSingle(this.Width) / Convert.ToSingle(this.Height)));
if (MoveCount == 0)//没有拖动过,滚动滚轮才按中间放大缩小
{
DrawRect.X = (this.Width - DrawRect.Width) / 2;
DrawRect.Y = (this.Height - DrawRect.Height) / 2;
}
//===============判断是否超界===============
//如果Right超过控件宽度
if (DrawRect.Right > this.Width)
{
DrawRect.X = DrawRect.X - (DrawRect.Right - this.Width) - 1;
DrawRect.X = DrawRect.X > 1 ? DrawRect.X : 1;
}
//如果Bottom超过控件高度
if (DrawRect.Bottom > this.Height)
{
DrawRect.Y = DrawRect.Y - (DrawRect.Bottom - this.Height) - 1;
DrawRect.Y = DrawRect.Y > 1 ? DrawRect.Y : 1;
}
DrawImg();
}
private void this_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (DrawRect.Contains(MouseDownP))//判断鼠标按下的坐标是否在红框中,确定是否拖动的红框
{
//拖动鼠标位置,矩形框新X=矩形框原X+(当前鼠标X-按下时X),原X+偏移量
//Y轴一样变化
DrawRect.X = DrawRect.X + (e.X - MouseDownP.X); //.Location = ClienP;
DrawRect.Y = DrawRect.Y + (e.Y - MouseDownP.Y); // ClienP.Y;
//判断是否超过左上角
if (DrawRect.X < 0)
DrawRect.X = 0;
if (DrawRect.Y < 0)
DrawRect.Y = 0;
//判断是否超过右下 角
if (DrawRect.X > (this.Width - DrawRect.Width - 1))
DrawRect.X = this.Width - DrawRect.Width - 1;
if (DrawRect.Y > (this.Height - DrawRect.Height - 1))
DrawRect.Y = this.Height - DrawRect.Height - 1;
//画图
DrawImg();
//计算完坐标系,鼠标按下坐标转换成当前鼠标坐标,以重新计算偏移
MouseDownP.X = e.X;
MouseDownP.Y = e.Y;
//拖动过鼠标,鼠标拖动标记累加
MoveCount++;
}
}
}
private void this_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
MouseDownP = new Point(e.X, e.Y);
}
void DrawImg()
{
using (Graphics g = this.CreateGraphics())
{
//重绘背景
g.FillRectangle(new SolidBrush(Color.LightGray), 0, 0, this.Width, this.Height);
g.DrawString("滚轮放大,左键拖动矩形框" + zoom, new Font("黑体", 12f), new SolidBrush(Color.Green), 5, 5);
g.DrawString("放大" + zoom, new Font("黑体", 12f), new SolidBrush(Color.Red), 5, 20);
//重绘矩形
g.DrawRectangle(new Pen(Color.Red), DrawRect);
}
}
主要就是这么几个事件。有需要的可以参考参考。

C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框的更多相关文章
- js 鼠标左键拖动滚动
鼠标左键拖动滚动 原作者: http://blog.csdn.net/lisatisfy/article/details/6606026 本文在源代码的基础上 增加支持水平滚动 的功能 html &l ...
- 在Window工作区按下鼠标左键拖动窗体
Window.DragMove(): 允许使用在窗口工作区的暴露区域上方按下其鼠标左键的鼠标来拖动窗口.(窗口工作区:除去窗体的title.bottom后的剩余部分空间) 使用该方法时注意:一定要在鼠 ...
- Qt 圆角矩形+鼠标左键拖动窗口
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWind ...
- zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...
- 【转】 js怎么区分出点击的是鼠标左键还是右键?
IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events. ...
- [Eclipse] eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件【待解决】
eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件: 1. 设置eclipse ctrl + 左键打开源文件代码,如下图,设置都正常 2. 在网上找了很多种办法,均失败,在 ...
- JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】
IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events.b ...
- win10 uwp 获取按钮鼠标左键按下
我们可以使用PointerPressed获得鼠标右键按下,但是我们如何获得左键? 其实UWP已经没有MouseLeftButtonDown,于是我们可以使用一个简单方法去获取鼠标左键按下. 我们在xa ...
- delphi Ctrl+鼠标左键或者Find Declaration不能定位到源文件
在Delphi代码编辑器中使用Ctrl+鼠标左键可跳转到鼠标下的类所在的定义处,但今天发现一个奇怪的问题,EhLib组件的类无法跳转(包括uses中的pas文件),重新安装也是如此,后来经过验证,发现 ...
随机推荐
- 说说设计模式~大话目录(Design Pattern)
回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...
- Chrome开发者工具不完全指南(一、基础功能篇)
就算你不是一名前端开发工程师,相信你也不会对Chrome浏览器感到陌生.根据最新的一份(2015/06)的浏览器市场占有率报告,Chrome近乎占有浏览器天下的半壁江山.简单.快捷使它成为了新时代人们 ...
- Atitit sql计划任务与查询优化器--统计信息模块
Atitit sql计划任务与查询优化器--统计信息模块 每一个统计信息的内容都包含以上三部分的内容. 我们依次来分析下,通过这三部分内容SQL Server如何了解该列数据的内容分布的. a.统计信 ...
- Uiautomator 2.0之UiDevice新增API学习小记
1. InstrumentationRegistry类 1.1. 类说明: 一个暴露的注册实例,持有instrumentation运行的进程和参数,还提供了一种简便的方法调用instrumentati ...
- [原创]直播服务器简单实现 http_flv和hls 内网直播桌面
直播都不陌生了,如今主流的协议分析的对比图,个人见解. 协议 httpflv rtmp hls dash 传输层 http流 tcp流 http http 视频格式 flv flv tag Ts文件 ...
- PHP从PHP5.0到PHP7.1的性能全评测
本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...
- 事务复制5: Transaction and Command
事务复制使用 dbo.msrepl_transactions 和 dbo.MSrepl_commands 存储用于数据同步的Transaction和Command.在replication中,每个co ...
- vs运行时候冒了这个错:无法启动IIS Express Web 服务器~Win10
后期会在博客首发更新:http://dnt.dkill.net 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 网上的方法多种, ...
- 推荐21款最佳 HTML5 网页游戏
尽管 HTML5 的完全实现还有很长的路要走,但 HTML5 正在改变 Web,未来 HTML5 将把 Web 带入一个更加成熟和开放的应用平台.现在,越来越多的人尝试用 HTML5 来制作网页游戏等 ...
- 【续集】在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题
dudu 的一篇博文:在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题 针对 IIS 部署 ASP.NET 5 应用程序的问题,在上面博文中主要采用两种方式尝试: VS2015 的 Publ ...