问题描述
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的代码传上去了,麻烦教我一下怎么修改,分全部给你
代码呢