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

baidu_20898373 2015-06-23 10:24:08

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;

using System.Threading;
using System.Drawing.Drawing2D;

namespace Test
{
public partial class Form1 : Form
{
enum MouseState
{
None = 0,
MouseLeftDown = 1,
MouseRightDown = 2,
}

private MouseState _MouseState = MouseState.None;

public Form1()
{
InitializeComponent();

this.Load += new EventHandler(Form1_Load);
this.MouseMove += new MouseEventHandler(Form1_MouseMove);
this.MouseDown += new MouseEventHandler(Form1_MouseDown);
this.MouseUp += new MouseEventHandler(Form1_MouseUp);
}

void Form1_MouseUp(object sender, MouseEventArgs e)
{
_MouseState = MouseState.None;
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
this.Refresh();
}
}

void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
_MouseState = MouseState.MouseLeftDown;
return;
}

if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
_MouseState = MouseState.MouseRightDown;
return;
}
}

void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (_MouseState == MouseState.None)
{
return;
}

if (_MouseState == MouseState.MouseLeftDown)
{
Console.WriteLine(e.X + ", " + e.Y);

Graphics g = this.CreateGraphics();
//g.DrawEllipse(new Pen(Color.Red, 2), new Rectangle(e.X - 1, e.Y - 1, 2, 2));
g.DrawLine(new Pen(Color.Red, 2), new Point(e.X - 2, e.Y - 2), new Point(e.X, e.Y));
g.Dispose();
return;
}
}

void Form1_Load(object sender, EventArgs e)
{
this.AutoScaleBaseSize = new Size(5, 13);
this.ClientSize = new Size(800, 500);
}
}
}
参考别人的代码已经实现了用鼠标在picturebox里的Image上画任意线条。但是由于图片有大有小,因此我设置了图片居中显示picturebox.Sizemode=PictureBoxSizeMode.CenterImage;这时候图片是能居中显示了,但是鼠标画图的线条与鼠标所点击的位置差了一段距离。也就是鼠标在这里移动,而线条在另一处出现,求大神指点,我没多少分,抱歉!
...全文
659 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
O_OQAQ 2015-07-03
  • 打赏
  • 举报
回复
引用 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 的坐标 希望你能理解
我是初学者,你能不能告诉要在哪里修改哪些代码啊?谢谢[/quote]picturebox的代码传上去了,麻烦教我一下怎么修改,分全部给你[/quote] 代码呢
JavaLiCong 2015-07-01
  • 打赏
  • 举报
回复
引用 23 楼 baidu_20898373 的回复:
引用 22 楼 JavaLiCong 的回复:
虽然不晓得楼主要做什么样的程序,若是图片上绘图软件的话,建议不要使用picturebox,而是重写panel,实现无刷新缓存重绘图片,精确控制坐标点!
我需要对picturebox中的图片进行编辑,然后将编辑后的图片保存
可参考这个:http://www.cnblogs.com/stg609/archive/2008/03/30/1129221.html
baidu_20898373 2015-06-30
  • 打赏
  • 举报
回复
引用 22 楼 JavaLiCong 的回复:
虽然不晓得楼主要做什么样的程序,若是图片上绘图软件的话,建议不要使用picturebox,而是重写panel,实现无刷新缓存重绘图片,精确控制坐标点!
我需要对picturebox中的图片进行编辑,然后将编辑后的图片保存
xuzuning 2015-06-29
  • 打赏
  • 举报
回复
由于 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 的坐标 希望你能理解
JavaLiCong 2015-06-29
  • 打赏
  • 举报
回复
虽然不晓得楼主要做什么样的程序,若是图片上绘图软件的话,建议不要使用picturebox,而是重写panel,实现无刷新缓存重绘图片,精确控制坐标点!
baidu_20898373 2015-06-29
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
即便 图片在 picturebox 中居中,计算偏移也是很简单的。不就是多加一项吗?
请问具体如何写代码 谢谢
baidu_20898373 2015-06-29
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
最简单的办法当然还是让picturebox适应图片大小,这样坐标就完全一致了 否则你需要根据图片大小和picturebox的大小自己计算偏差
请问具体如何写代码
baidu_20898373 2015-06-29
  • 打赏
  • 举报
回复
引用 7 楼 conmajia 的回复:
(a-b)/2
能具体点吗?
baidu_20898373 2015-06-29
  • 打赏
  • 举报
回复
引用 18 楼 xuzuning 的回复:
1、将
            this.MouseMove += new MouseEventHandler(Form1_MouseMove);
            this.MouseDown += new MouseEventHandler(Form1_MouseDown);
            this.MouseUp += new MouseEventHandler(Form1_MouseUp);
改为
            this.pictureBox1.MouseMove += new MouseEventHandler(Form1_MouseMove);
            this.pictureBox1.MouseDown += new MouseEventHandler(Form1_MouseDown);
            this.pictureBox1.MouseUp += new MouseEventHandler(Form1_MouseUp);
此时已解决了 this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 是的鼠标错位问题
你打出了1、应该还有第2点3点?
baidu_20898373 2015-06-29
  • 打赏
  • 举报
回复
引用 18 楼 xuzuning 的回复:
1、将
            this.MouseMove += new MouseEventHandler(Form1_MouseMove);
            this.MouseDown += new MouseEventHandler(Form1_MouseDown);
            this.MouseUp += new MouseEventHandler(Form1_MouseUp);
改为
            this.pictureBox1.MouseMove += new MouseEventHandler(Form1_MouseMove);
            this.pictureBox1.MouseDown += new MouseEventHandler(Form1_MouseDown);
            this.pictureBox1.MouseUp += new MouseEventHandler(Form1_MouseUp);
此时已解决了 this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 是的鼠标错位问题
按照你IDE修改了,效果没有变化
baidu_20898373 2015-06-29
  • 打赏
  • 举报
回复
引用 18 楼 xuzuning 的回复:
1、将
            this.MouseMove += new MouseEventHandler(Form1_MouseMove);
            this.MouseDown += new MouseEventHandler(Form1_MouseDown);
            this.MouseUp += new MouseEventHandler(Form1_MouseUp);
改为
            this.pictureBox1.MouseMove += new MouseEventHandler(Form1_MouseMove);
            this.pictureBox1.MouseDown += new MouseEventHandler(Form1_MouseDown);
            this.pictureBox1.MouseUp += new MouseEventHandler(Form1_MouseUp);
此时已解决了 this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 是的鼠标错位问题
报错了 说“当前上下文中不存在名称“Form1_MouseMove””“Form1_MouseDown”“Form1_MouseUp”
xuzuning 2015-06-29
  • 打赏
  • 举报
回复
1、将
            this.MouseMove += new MouseEventHandler(Form1_MouseMove);
            this.MouseDown += new MouseEventHandler(Form1_MouseDown);
            this.MouseUp += new MouseEventHandler(Form1_MouseUp);
改为
            this.pictureBox1.MouseMove += new MouseEventHandler(Form1_MouseMove);
            this.pictureBox1.MouseDown += new MouseEventHandler(Form1_MouseDown);
            this.pictureBox1.MouseUp += new MouseEventHandler(Form1_MouseUp);
此时已解决了 this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 是的鼠标错位问题
  • 打赏
  • 举报
回复
用鼠标的窗体事件可以实现,不要用picturebox
baidu_20898373 2015-06-29
  • 打赏
  • 举报
回复
引用 16 楼 piaopiao_lucky 的回复:
用鼠标的窗体事件可以实现,不要用picturebox
我这里必须是要对图片进行编辑,然后将编辑后的图片进行保存
baidu_20898373 2015-06-29
  • 打赏
  • 举报
回复
引用 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 的坐标 希望你能理解
我是初学者,你能不能告诉要在哪里修改哪些代码啊?谢谢[/quote]picturebox的代码传上去了,麻烦教我一下怎么修改,分全部给你
baidu_20898373 2015-06-29
  • 打赏
  • 举报
回复
引用 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 的坐标 希望你能理解
我是初学者,你能不能告诉要在哪里修改哪些代码啊?谢谢[/quote] private void PhotoLoadFrm_Load(object sender, EventArgs e) { #region 将上传的照片显示出来 IPList edit = new IPList(); edit.IPProblemDescibleID = wentibianhao; try { _picinfor = DataFactory.FindEntities(edit, IPList.Operation.PHotoGraph_SEL, "IPProblemDescibleID"); } catch { } try { this.pictureBox1.Image = Image.FromFile(@"\\PC200711111858\Images\" + 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 = new Size(5, 13); this.ClientSize = new Size(800, 500); #endregion }
xuzuning 2015-06-29
  • 打赏
  • 举报
回复
在你给出的代码中,并没有看到 picturebox 在哪里
baidu_20898373 2015-06-29
  • 打赏
  • 举报
回复
引用 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 的坐标 希望你能理解
我是初学者,你能不能告诉要在哪里修改哪些代码啊?谢谢
Conmajia 2015-06-28
  • 打赏
  • 举报
回复
(a-b)/2
xuzuning 2015-06-24
  • 打赏
  • 举报
回复
this.MouseMove 这是窗体的事件,而不是 picturebox 的 所以 e.X 和 e.Y 都是鼠标在 Form1 中的位置 如果你不打算将鼠标事件指派到 picturebox,那么就需要将鼠标位置换算到 picturebox(鼠标位置减去picturebox的左上角坐标)
加载更多回复(5)

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧