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);
            }
        }

主要就是这么几个事件。有需要的可以参考参考。

时间: 2024-08-27 19:40:55

C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框的相关文章

js 鼠标左键拖动滚动

鼠标左键拖动滚动 原作者: http://blog.csdn.net/lisatisfy/article/details/6606026 本文在源代码的基础上 增加支持水平滚动 的功能 html <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

禁用WPF中DataGrid默认的鼠标左键拖动多选行的效果

最近项目上有需求要做DataGrid的行的拖拽功能, 有个很现实的问题就是鼠标左键按下是拖拽还是多选. 查看了DataGrid的源码发现,系统内部会在鼠标按下的时候CaptureMouse,然后设置私有变量来保存多选标志, 在鼠标MouseMove的时候根据变量判断是否多选. private bool _isDraggingSelection;                                  // Whether a drag select is being performed

用鼠标左键绘制折线,利用鼠标中键或右键终止绘制

用鼠标左键绘制折线,同时在鼠标左键点中的位置输出一个含有该位置信息的字符串,利用鼠标中键或右键终止绘制. 解:建立一个Untitled.m文件 MATLAB指令: clf;axis([0,10,0,5]);hold on x=[];y=[]; for i=1:100 [x1,y1,button]=ginput(1); chstr=['(',num2str(x1),',',num2str(y1),')'];text(x1,y1,chstr); x=[x,x1];y=[y,y1];line(x,y)

MFC中如何在TreeCtrl控件中获取鼠标左键消息时的有效点击位置

MFC中,当在TreeCtrl控件中添加鼠标左键消息时,就意味着,凡是在该控件中点击左键后即会响应鼠标左键的消息,可有时我们只想记下有效的鼠标左键点击的事件,如图所示: 只想在CheckBox中点击鼠标左键时,将已选中的Item的句柄存入到链表中,那么如何只将有效的鼠标左键的消息存入链表中呢? 下面是响应鼠标左键消息时从所有鼠标左键消息都响应到只响应有效的左键消息的三个版本: 当响应鼠标左键的消息时,第一个版本: 获取鼠标的点击位置(注意:此时获取的是针对于当前屏幕的鼠标点击位置,所以需要将其转

解决鼠标左键单击冲突的问题(防止冒泡)

本人在一个页面实现了两种右键菜单,当鼠标左键单击空白处时,右键菜单并不隐藏.于是,Google之,最后找到一种方法,将鼠标左键单击事件改为: $(document).click( function () { } 改为 $(document).on('click touchstart', function () { } 问题解决.解决鼠标左键单击冲突的问题(防止冒泡),布布扣,bubuko.com

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

IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events.button==1 鼠标左键 events.button==2 鼠标右键 events.button==3 鼠标左右键同时按下 events.button==4 鼠标中键 events.button==5 鼠标左键和中键同时按下 events.button==6 鼠标右键和中键同时按下 events.

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

zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: zendstudio 时常 无法ctrl+左键 跳转 到函数源 代码 是创建工程的方式造成的,很有可能是把先前存在的工程以file的形式导入, zendstudio 就把工程当作文档来处理了.解决的办法是: 右键点击工程->configure->add php support 然后系统会自动rebuild工程/workspace.至此,问题解决! 如果你想要zendstudio支持javascript的语法高亮和流

js屏蔽功能键F1~12以及鼠标右键和鼠标左键

function window.onhelp(){return false} //屏蔽F1帮助 document.onkeydown = function(){ if(window.event && window.event.keyCode == 113) {  window.event.keyCode = 505; } if(window.event && window.event.keyCode == 114) {  window.event.keyCode = 505

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

IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0  默认.没有按任何按钮. events.button==1  鼠标左键 events.button==2  鼠标右键 events.button==3  鼠标左右键同时按下 events.button==4  鼠标中键 events.button==5  鼠标左键和中键同时按下 events.button==6  鼠标右键和中键同时按下