C# winform鼠标在图片上画图问题

问题描述

usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Net;usingSystem.IO;usingSystem.Threading;usingSystem.Drawing.Drawing2D;namespaceTest{publicpartialclassForm1:Form{enumMouseState{None=0,MouseLeftDown=1,MouseRightDown=2,}privateMouseState_MouseState=MouseState.None;publicForm1(){InitializeComponent();this.Load+=newEventHandler(Form1_Load);this.MouseMove+=newMouseEventHandler(Form1_MouseMove);this.MouseDown+=newMouseEventHandler(Form1_MouseDown);this.MouseUp+=newMouseEventHandler(Form1_MouseUp);}voidForm1_MouseUp(objectsender,MouseEventArgse){_MouseState=MouseState.None;if(e.Button==System.Windows.Forms.MouseButtons.Right){this.Refresh();}}voidForm1_MouseDown(objectsender,MouseEventArgse){if(e.Button==System.Windows.Forms.MouseButtons.Left){_MouseState=MouseState.MouseLeftDown;return;}if(e.Button==System.Windows.Forms.MouseButtons.Right){_MouseState=MouseState.MouseRightDown;return;}}voidForm1_MouseMove(objectsender,MouseEventArgse){if(_MouseState==MouseState.None){return;}if(_MouseState==MouseState.MouseLeftDown){Console.WriteLine(e.X+","+e.Y);Graphicsg=this.CreateGraphics();//g.DrawEllipse(newPen(Color.Red,2),newRectangle(e.X-1,e.Y-1,2,2));g.DrawLine(newPen(Color.Red,2),newPoint(e.X-2,e.Y-2),newPoint(e.X,e.Y));g.Dispose();return;}}voidForm1_Load(objectsender,EventArgse){this.AutoScaleBaseSize=newSize(5,13);this.ClientSize=newSize(800,500);}}}参考别人的代码已经实现了用鼠标在picturebox里的Image上画任意线条。但是由于图片有大有小,因此我设置了图片居中显示picturebox.Sizemode=PictureBoxSizeMode.CenterImage;这时候图片是能居中显示了,但是鼠标画图的线条与鼠标所点击的位置差了一段距离。也就是鼠标在这里移动,而线条在另一处出现,求大神指点,我没多少分,抱歉!

解决方案

解决方案二:
坐标定位出现问题了呗
解决方案三:
请问该修改哪里的代码啊?
解决方案四:
this.MouseMove这是窗体的事件,而不是picturebox的所以e.X和e.Y都是鼠标在Form1中的位置如果你不打算将鼠标事件指派到picturebox,那么就需要将鼠标位置换算到picturebox(鼠标位置减去picturebox的左上角坐标)
解决方案五:
引用3楼xuzuning的回复:

this.MouseMove这是窗体的事件,而不是picturebox的所以e.X和e.Y都是鼠标在Form1中的位置如果你不打算将鼠标事件指派到picturebox,那么就需要将鼠标位置换算到picturebox(鼠标位置减去picturebox的左上角坐标)

即使这样,还是会出问题因为楼主设置了图片居中显示那么图片的坐标(0,0)和picturebox的坐标(0,0)根本就不是同一个点
解决方案六:
最简单的办法当然还是让picturebox适应图片大小,这样坐标就完全一致了否则你需要根据图片大小和picturebox的大小自己计算偏差
解决方案七:
即便图片在picturebox中居中,计算偏移也是很简单的。不就是多加一项吗?
解决方案八:
(a-b)/2
解决方案九:
引用7楼conmajia的回复:

(a-b)/2

能具体点吗?
解决方案十:
引用5楼Z65443344的回复:

最简单的办法当然还是让picturebox适应图片大小,这样坐标就完全一致了否则你需要根据图片大小和picturebox的大小自己计算偏差

请问具体如何写代码
解决方案十一:
引用6楼xuzuning的回复:

即便图片在picturebox中居中,计算偏移也是很简单的。不就是多加一项吗?

请问具体如何写代码谢谢
解决方案十二:
由于Image在PictureBox中居中所以Image相对PictureBox原点的坐标是((PictureBox.Width-PictureBox.Image.Width)/2,(PictureBox.Height-PictureBox.Image.Height)/2)由于你的鼠标坐标是参照Form的,而PictureBox的原点可能不与Form的原点重合所以鼠标相对PictureBox原点的坐标是(e.X-PictureBox.Left,e.Y-PictureBox.Top)两式合起来就是鼠标相对Image的坐标希望你能理解
解决方案十三:
引用11楼xuzuning的回复:

由于Image在PictureBox中居中所以Image相对PictureBox原点的坐标是((PictureBox.Width-PictureBox.Image.Width)/2,(PictureBox.Height-PictureBox.Image.Height)/2)由于你的鼠标坐标是参照Form的,而PictureBox的原点可能不与Form的原点重合所以鼠标相对PictureBox原点的坐标是(e.X-PictureBox.Left,e.Y-PictureBox.Top)两式合起来就是鼠标相对Image的坐标希望你能理解

我是初学者,你能不能告诉要在哪里修改哪些代码啊?谢谢
解决方案十四:
在你给出的代码中,并没有看到picturebox在哪里
解决方案十五:
引用12楼baidu_20898373的回复:

Quote: 引用11楼xuzuning的回复:
由于Image在PictureBox中居中所以Image相对PictureBox原点的坐标是((PictureBox.Width-PictureBox.Image.Width)/2,(PictureBox.Height-PictureBox.Image.Height)/2)由于你的鼠标坐标是参照Form的,而PictureBox的原点可能不与Form的原点重合所以鼠标相对PictureBox原点的坐标是(e.X-PictureBox.Left,e.Y-PictureBox.Top)两式合起来就是鼠标相对Image的坐标希望你能理解

我是初学者,你能不能告诉要在哪里修改哪些代码啊?谢谢

privatevoidPhotoLoadFrm_Load(objectsender,EventArgse){#region将上传的照片显示出来IPListedit=newIPList();edit.IPProblemDescibleID=wentibianhao;try{_picinfor=DataFactory.FindEntities(edit,IPList.Operation.PHotoGraph_SEL,"IPProblemDescibleID");}catch{}try{this.pictureBox1.Image=Image.FromFile(@"\PC200711111858Images"+dizhi);tbxPorder.Text=((IPList)_picinfor[0]).POrderID;tbxCustomerName.Text=((IPList)_picinfor[0]).CustomerName;tbxMPartName.Text=((IPList)_picinfor[0]).MPartName;tbxPartID.Text=((IPList)_picinfor[0]).PartID;rtbxProb.Text=((IPList)_picinfor[0]).IActualProblemDescibe;}catch{}this.pictureBox1.SizeMode=PictureBoxSizeMode.CenterImage;this.pictureBox1.SizeMode=PictureBoxSizeMode.StretchImage;this.AutoScaleBaseSize=newSize(5,13);this.ClientSize=newSize(800,500);#endregion}
解决方案:引用12楼baidu_20898373的回复:

Quote: 引用11楼xuzuning的回复:
由于Image在PictureBox中居中所以Image相对PictureBox原点的坐标是((PictureBox.Width-PictureBox.Image.Width)/2,(PictureBox.Height-PictureBox.Image.Height)/2)由于你的鼠标坐标是参照Form的,而PictureBox的原点可能不与Form的原点重合所以鼠标相对PictureBox原点的坐标是(e.X-PictureBox.Left,e.Y-PictureBox.Top)两式合起来就是鼠标相对Image的坐标希望你能理解

我是初学者,你能不能告诉要在哪里修改哪些代码啊?谢谢

picturebox的代码传上去了,麻烦教我一下怎么修改,分全部给你
解决方案:用鼠标的窗体事件可以实现,不要用picturebox
解决方案:引用16楼piaopiao_lucky的回复:

用鼠标的窗体事件可以实现,不要用picturebox

我这里必须是要对图片进行编辑,然后将编辑后的图片进行保存
解决方案:1、将this.MouseMove+=newMouseEventHandler(Form1_MouseMove);this.MouseDown+=newMouseEventHandler(Form1_MouseDown);this.MouseUp+=newMouseEventHandler(Form1_MouseUp);

改为this.pictureBox1.MouseMove+=newMouseEventHandler(Form1_MouseMove);this.pictureBox1.MouseDown+=newMouseEventHandler(Form1_MouseDown);this.pictureBox1.MouseUp+=newMouseEventHandler(Form1_MouseUp);

此时已解决了this.pictureBox1.SizeMode=PictureBoxSizeMode.StretchImage;是的鼠标错位问题
解决方案:引用18楼xuzuning的回复:

1、将this.MouseMove+=newMouseEventHandler(Form1_MouseMove);this.MouseDown+=newMouseEventHandler(Form1_MouseDown);this.MouseUp+=newMouseEventHandler(Form1_MouseUp);

改为this.pictureBox1.MouseMove+=newMouseEventHandler(Form1_MouseMove);this.pictureBox1.MouseDown+=newMouseEventHandler(Form1_MouseDown);this.pictureBox1.MouseUp+=newMouseEventHandler(Form1_MouseUp);

此时已解决了this.pictureBox1.SizeMode=PictureBoxSizeMode.StretchImage;是的鼠标错位问题

报错了说“当前上下文中不存在名称“Form1_MouseMove””“Form1_MouseDown”“Form1_MouseUp”
解决方案:引用18楼xuzuning的回复:

1、将this.MouseMove+=newMouseEventHandler(Form1_MouseMove);this.MouseDown+=newMouseEventHandler(Form1_MouseDown);this.MouseUp+=newMouseEventHandler(Form1_MouseUp);

改为this.pictureBox1.MouseMove+=newMouseEventHandler(Form1_MouseMove);this.pictureBox1.MouseDown+=newMouseEventHandler(Form1_MouseDown);this.pictureBox1.MouseUp+=newMouseEventHandler(Form1_MouseUp);

此时已解决了this.pictureBox1.SizeMode=PictureBoxSizeMode.StretchImage;是的鼠标错位问题

按照你IDE修改了,效果没有变化
解决方案:引用18楼xuzuning的回复:

1、将this.MouseMove+=newMouseEventHandler(Form1_MouseMove);this.MouseDown+=newMouseEventHandler(Form1_MouseDown);this.MouseUp+=newMouseEventHandler(Form1_MouseUp);

改为this.pictureBox1.MouseMove+=newMouseEventHandler(Form1_MouseMove);this.pictureBox1.MouseDown+=newMouseEventHandler(Form1_MouseDown);this.pictureBox1.MouseUp+=newMouseEventHandler(Form1_MouseUp);

此时已解决了this.pictureBox1.SizeMode=PictureBoxSizeMode.StretchImage;是的鼠标错位问题

你打出了1、应该还有第2点3点?
解决方案:虽然不晓得楼主要做什么样的程序,若是图片上绘图软件的话,建议不要使用picturebox,而是重写panel,实现无刷新缓存重绘图片,精确控制坐标点!
解决方案:引用22楼JavaLiCong的回复:

虽然不晓得楼主要做什么样的程序,若是图片上绘图软件的话,建议不要使用picturebox,而是重写panel,实现无刷新缓存重绘图片,精确控制坐标点!

我需要对picturebox中的图片进行编辑,然后将编辑后的图片保存
解决方案:引用23楼baidu_20898373的回复:

Quote: 引用22楼JavaLiCong的回复:
虽然不晓得楼主要做什么样的程序,若是图片上绘图软件的话,建议不要使用picturebox,而是重写panel,实现无刷新缓存重绘图片,精确控制坐标点!

我需要对picturebox中的图片进行编辑,然后将编辑后的图片保存

可参考这个:http://www.cnblogs.com/stg609/archive/2008/03/30/1129221.html
解决方案:引用15楼baidu_20898373的回复:

Quote: 引用12楼baidu_20898373的回复:
Quote: 引用11楼xuzuning的回复:
由于Image在PictureBox中居中所以Image相对PictureBox原点的坐标是((PictureBox.Width-PictureBox.Image.Width)/2,(PictureBox.Height-PictureBox.Image.Height)/2)由于你的鼠标坐标是参照Form的,而PictureBox的原点可能不与Form的原点重合所以鼠标相对PictureBox原点的坐标是(e.X-PictureBox.Left,e.Y-PictureBox.Top)两式合起来就是鼠标相对Image的坐标希望你能理解

我是初学者,你能不能告诉要在哪里修改哪些代码啊?谢谢

picturebox的代码传上去了,麻烦教我一下怎么修改,分全部给你

代码呢

时间: 2024-09-23 00:54:30

C# winform鼠标在图片上画图问题的相关文章

鼠标放到图片上慢慢变大

 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>网页特效观止|www.jscode.cn| --- 鼠标放到图片上慢慢变大,移开后图片又慢慢变小</title>   </head>   <body> <img id=MainImg onmouse

js实现鼠标悬停图片上时滚动文字说明的方法

 这篇文章主要介绍了js实现鼠标悬停图片上时滚动文字说明的方法,涉及js操作鼠标事件的使用技巧,需要的朋友可以参考下     本文实例讲述了js实现鼠标悬停图片上时滚动文字说明的方法.分享给大家供大家参考.具体实现方法如下:   代码如下: <html> <title>js实现鼠标悬停图片上时的滚动文字说明</title> <body> <SCRIPT LANGUAGE="JavaScript"> <!-- Begin

php-PHP中怎样实现当鼠标放在图片上时,图片放大的效果

问题描述 PHP中怎样实现当鼠标放在图片上时,图片放大的效果 我没有开发PHP的经验,现在遇到一个用PHP开发的网站,要求我把网站首页的图片效果修改成当鼠标经过时,图片放大的效果 解决方案 js控制,不是php..~其实js都不用,css控制就行 <!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD

滚动图片-怎么实现当鼠标放到图片上时图片停止滚动

问题描述 怎么实现当鼠标放到图片上时图片停止滚动 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta

js实现鼠标悬停图片上时滚动文字说明的方法_javascript技巧

本文实例讲述了js实现鼠标悬停图片上时滚动文字说明的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <html> <title>js实现鼠标悬停图片上时的滚动文字说明</title> <body> <SCRIPT LANGUAGE="JavaScript"> <!-- Begin function showtip2(current,e,text){   if (document.all&&a

html 如何实现鼠标放到图片上时显示小图片和信息(就像csdn 的本网页)

问题描述 如何实现鼠标放到图片上时显示小图片和信息(就像csdn的本网页) 解决方案 解决方案二:<imgsrc="a.jsp"alt="这是一个图片"/>解决方案三:是说书标指向用户头像出现的层么?解决方案四:<imgonmouseover="try{showUserCard(this,'b_sky2012')}catch(ex){};"alt="b_sky2012用户头像"title="b_sk

鼠标放在图片上显示大图的JS代码_javascript技巧

显示大图和隐藏大图的js代码: 复制代码 代码如下: <script type="text/javascript">   //显示图片   function over(imgid,obj,imgbig)   {//大图显示的最大尺寸  4比3的大小  400 300maxwidth=400;maxheight=300; //显示        obj.style.display="";        imgbig.src=imgid.src;      

纯css实现鼠标经过图片上时,图片突出显示特效

鼠标放到图片上慢慢变大,移开后图片又慢慢变

提示:您可以先修改部分代码再运行 提示:您可以先修改部分代码再运行