最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置。网上查了一些感觉他们做的挺复杂的。我自己研究一天,做了一个比较简单的,发表出来供大家参考一下。如觉得简单,可路过,谢谢。哈哈。

先大概介绍一下原因,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绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框的更多相关文章

  1. js 鼠标左键拖动滚动

    鼠标左键拖动滚动 原作者: http://blog.csdn.net/lisatisfy/article/details/6606026 本文在源代码的基础上 增加支持水平滚动 的功能 html &l ...

  2. 在Window工作区按下鼠标左键拖动窗体

    Window.DragMove(): 允许使用在窗口工作区的暴露区域上方按下其鼠标左键的鼠标来拖动窗口.(窗口工作区:除去窗体的title.bottom后的剩余部分空间) 使用该方法时注意:一定要在鼠 ...

  3. Qt 圆角矩形+鼠标左键拖动窗口

    #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWind ...

  4. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

    转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...

  5. 【转】 js怎么区分出点击的是鼠标左键还是右键?

    IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0  默认.没有按任何按钮. events. ...

  6. [Eclipse] eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件【待解决】

    eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件: 1. 设置eclipse ctrl + 左键打开源文件代码,如下图,设置都正常 2. 在网上找了很多种办法,均失败,在 ...

  7. JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】

    IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events.b ...

  8. win10 uwp 获取按钮鼠标左键按下

    我们可以使用PointerPressed获得鼠标右键按下,但是我们如何获得左键? 其实UWP已经没有MouseLeftButtonDown,于是我们可以使用一个简单方法去获取鼠标左键按下. 我们在xa ...

  9. delphi Ctrl+鼠标左键或者Find Declaration不能定位到源文件

    在Delphi代码编辑器中使用Ctrl+鼠标左键可跳转到鼠标下的类所在的定义处,但今天发现一个奇怪的问题,EhLib组件的类无法跳转(包括uses中的pas文件),重新安装也是如此,后来经过验证,发现 ...

随机推荐

  1. 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent

    本章主要介绍下基于内核模式构造的线程同步方式,事件,信号量. 阅读目录: 理论 WaitHandle AutoResetEvent ManualResetEvent 总结 理论 Windows的线程同 ...

  2. WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用

    一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...

  3. Linux sudo

    200 ? "200px" : this.width)!important;} --> 介绍 本篇文章主要介绍sudo配置和用法,为了给某个用户控制权限比如执行某个命令或者关 ...

  4. char varchar nchar nvarcharar到底有多大区别

    首先说明下,ASP.NET MVC系列还在龟速翻译中. 工作好多年,基础知识甚是薄弱,决定以后在coding(cv操作)的时候尽量多google下,然后总结下来,目的有三:     1. 加深自己的理 ...

  5. Step by step 如何创建一个新森林

    原创地址:http://www.cnblogs.com/jfzhu/p/4006118.html 转载请注明出处 创建一个新森林就是在一台计算机上安装AD DS,并将这台计算机提升为域控制器. 演示环 ...

  6. Qt5中的信号槽

    Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...

  7. [Canvas前端游戏开发]——FlappyBird详解

    一直想自己做点小东西,直到最近看了本<HTML5游戏开发>,才了解游戏开发中的一点点入门知识. 本篇就针对学习的几个样例,自己动手实践,做了个FlappyBird,源码共享在度盘 :也可以 ...

  8. Gitcafe绑定自定义域名

    之前将自己练习写作工具替换为Markdown,部署工具改为Hexo,并且将托管地搬家到GitCafe之后,便是被各种的舒爽所围绕.具体折腾的详情参见使用Hexo搭建专属Blog.她们的组合方便快捷,让 ...

  9. iOS---iOS9搜索功能

    前言 在iOS9之前我们只能使用Spotlight来搜索应用名称来打开指定App,而其他的内容都是提供给系统使用(信息,联系人,邮件等).在iOS9以后Apple允许开发者设置应用中任意内容可以被Sp ...

  10. python django基础(一)

    Django简介:Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.不过在Django实际使用中,Django更关注的是模型(Mod ...