none
如何获取picturebox控件中鼠标的位置 RRS feed

  • 问题

  • picturebox中显示图片

    希望将鼠标放在图片上时能得到相对于图片的坐标位置,也就是鼠标在该图片的位置

    在picturebox控件属性页面添加了mousedown事件

    由MouseEventArgs e 

    将e.x e.y作为了坐标值

    这样想对吗

    另外在同一个命名空间下,自写了一个private函数如private int min()

    在另一个private函数中不能直接调用么

    private void process_click(object sender, EventArgs e)

    {

    int x = min();

    }

    设置断点验证的时候,提示系统优化,断点变白,根本没有到e.x e.y这一步,很是郁闷

    谢谢

    2016年5月18日 12:59

答案

  • Hi zhongxingys,
    >>要把picturebox控件固定,pictureBox1.PointToClient(Point)得到的是相对于图片的坐标,如果图片是移动的,这样得到的坐标还是相对于图片的正确坐标吗
    这个倒是没测试过,你可以直接调试下加个断点并监控变量看看就知道了,不过应该也是正确的,因为它是根据控件来计算的,控件移动后坐标也变化了,换算的结果也会变化。

    >>自己想的是,picturebox1控件添加mousedown和mouseup事件,并且提前设一个标志,当点击上面按钮时,该标志为真,此时在picturebox1_mousedown事件中,判断该标志,为真时,判断左右键,然后由pointToClient(Point)方法得到坐标位置,就能对该点坐标进行运算
    这个想法可行,你可以参考下面的方法:
    1. 动态绑定(加上一个bool变量的用于判断事件是否绑定)

            //事件绑定标记
            bool eventFlag = false;
            private void buttonClick(object sender, EventArgs e)
            {
                if (!eventFlag)//pb 是picturebox
                {
                    pb.MouseDown += Picture_MouseDown;
                    pb.MouseUp += Picture_MouseUP; 
                }
                else
                {
                    pb.MouseDown -= Picture_MouseDown;
                    pb.MouseUp -= Picture_MouseUP;
                }
                eventFlag = !eventFlag;//反转变量
            }
            private void Picture_MouseDown(object sender, MouseEventArgs e)
            { }
            private void Picture_MouseUP(object sender, MouseEventArgs e)
            { }

    2. 使用变量作为判断条件(不要忘了绑定到控件上):

            bool eventFlag = false;
            private void buttonClick(object sender, EventArgs e)
            {
                eventFlag = !eventFlag;//反转变量
            }
            private void Picture_MouseDown(object sender, MouseEventArgs e)
            {
                if (eventFlag)
                {
                    //做些操作
                };
            }
            private void Picture_MouseUP(object sender, MouseEventArgs e)
            {
                if (eventFlag)
                {
                    //做些操作
                };
            }

    Regards,
    Moonlight


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2016年5月24日 2:16

全部回复

  • 应该是在mouse hover或mouse move事件中写代码

    参考

    https://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousehover%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

    private void panel1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                // Update the mouse path that is drawn onto the Panel.
                int mouseX = e.X;
                int mouseY = e.Y;

                mousePath.AddLine(mouseX,mouseY,mouseX,mouseY);
            }


    专注于.NET MIS开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月18日 13:47
  • 你好,想要的结果是鼠标在picturebox控件的图片上左键、右键点击时,能收到相对于图片的坐标位置,也即坐标点

    mousemove是鼠标移动,mousehover是在控制区域的一定范围内作为提示工具

    相比希望得到的效果还是有一定差距

    在mousedown事件中由MouseEventArgs e 的

    e.x e.y得出的坐标点是有问题,所以还请麻烦提示一下

    如果能给出代码就更好了,谢谢


    2016年5月19日 1:46
  • 不知道您是否会收到,回复(询问)在下面
    2016年5月19日 1:47
  • 我这个系统

    http://www.cnblogs.com/JamesLi2015/p/4738266.html

    最后一张图片,是用热区实现的,鼠标在图片上划一个区域,保存这个区域坐标,运行时鼠标停留在这个区域时,可以点击执行功能,下是部分代码,供你参考

    核心代码也是mouse move 和mouse down

         this.picImage.MouseMove += new System.Windows.Forms.MouseEventHandler(this.picImageMap_MouseMove);
                    this.picImage.MouseDown += new System.Windows.Forms.MouseEventHandler(this.picImageMap_MouseDown);
            

      private void picImageMap_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                    _mouseDownPos = e.Location;
                else
                    _mouseDownPos = Point.Empty;
            }

            private void picImageMap_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left && _mouseDownPos != Point.Empty)
                    this.picImageMap.Invalidate();
            }


    专注于.NET MIS开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms


    2016年5月19日 2:15
  • 您好,您这个e.Location是相对于窗体左上角的绝对位置

    要是这样的话那我如何获得picturebox控件图片的左上角坐标位置呢

    这样就能获得鼠标在图片上的相对坐标

    另外您这个this.picImage和this.picImageMap 具体指的是picturebox控件ID吗

    想补充的是图片加载在picturebox控件上,并且可以用鼠标拖动图片

    如果可以拖动图片,即便获得窗体左上角坐标、控件左上角坐标和鼠标在图片中位置,是不是也得不到鼠标在图片上的相对坐标位置

    2016年5月19日 3:04
  • Hi zhongxingys,
    >>希望将鼠标放在图片上时能得到相对于图片的坐标位置,也就是鼠标在该图片的位置
    你可以使用PointToClient方法,范例:

    Point curP = pictureBox1.PointToClient(e.Location);

    Control.PointToClient 方法 (Point)

    >>另外在同一个命名空间下,自写了一个private函数如private int min() 在另一个private函数中不能直接调用么
    如果在同一个文件下(例如: 都在form1中),可以相互调用,否则同一命名空间下的方法请使用 internal, protected, public等修饰符。(这个应该是每个基础教材中都有提及的)
    Modifiers (C# Reference)
    >>设置断点验证的时候,提示系统优化,断点变白,根本没有到e.x e.y这一步,很是郁闷
    请在未运行前加上断点,运行中添加有时候会有这个情况。
    Regards,
    Moonlight


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2016年5月20日 2:24
  • 非常感谢能把您的知识、经验分享

    在这想问的是

    要把picturebox控件固定,pictureBox1.PointToClient(Point)得到的是相对于图片的坐标,如果图片是移动的,这样得到的坐标还是相对于图片的正确坐标吗

    另一个是,如果在界面中有一个按钮(点标记),添加click事件后,点击该按钮,如何能在picturebox控件已加载的图片上,当点击鼠标左键时,该点能有反应

    自己想的是,picturebox1控件添加mousedown和mouseup事件,并且提前设一个标志,当点击上面按钮时,该标志为真,此时在picturebox1_mousedown事件中,判断该标志,为真时,判断左右键,然后由pointToClient(Point)方法得到坐标位置,就能对该点坐标进行运算

    可实际情况是当点击上面按钮后,再点击控件图片,图片是没有反映的,我这样是没有把消息传过去吗?如果没有,能告诉一个方法吗

    谢谢

    2016年5月21日 12:49
  • 调试器(Debugger)是你学习和解决问题的好工具,我上面实现的是相对于图片的坐标,而不是相对于窗体,多调试一下,问题应该会明朗很多


    专注于.NET MIS开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月21日 15:43
  • Hi zhongxingys,
    >>要把picturebox控件固定,pictureBox1.PointToClient(Point)得到的是相对于图片的坐标,如果图片是移动的,这样得到的坐标还是相对于图片的正确坐标吗
    这个倒是没测试过,你可以直接调试下加个断点并监控变量看看就知道了,不过应该也是正确的,因为它是根据控件来计算的,控件移动后坐标也变化了,换算的结果也会变化。

    >>自己想的是,picturebox1控件添加mousedown和mouseup事件,并且提前设一个标志,当点击上面按钮时,该标志为真,此时在picturebox1_mousedown事件中,判断该标志,为真时,判断左右键,然后由pointToClient(Point)方法得到坐标位置,就能对该点坐标进行运算
    这个想法可行,你可以参考下面的方法:
    1. 动态绑定(加上一个bool变量的用于判断事件是否绑定)

            //事件绑定标记
            bool eventFlag = false;
            private void buttonClick(object sender, EventArgs e)
            {
                if (!eventFlag)//pb 是picturebox
                {
                    pb.MouseDown += Picture_MouseDown;
                    pb.MouseUp += Picture_MouseUP; 
                }
                else
                {
                    pb.MouseDown -= Picture_MouseDown;
                    pb.MouseUp -= Picture_MouseUP;
                }
                eventFlag = !eventFlag;//反转变量
            }
            private void Picture_MouseDown(object sender, MouseEventArgs e)
            { }
            private void Picture_MouseUP(object sender, MouseEventArgs e)
            { }

    2. 使用变量作为判断条件(不要忘了绑定到控件上):

            bool eventFlag = false;
            private void buttonClick(object sender, EventArgs e)
            {
                eventFlag = !eventFlag;//反转变量
            }
            private void Picture_MouseDown(object sender, MouseEventArgs e)
            {
                if (eventFlag)
                {
                    //做些操作
                };
            }
            private void Picture_MouseUP(object sender, MouseEventArgs e)
            {
                if (eventFlag)
                {
                    //做些操作
                };
            }

    Regards,
    Moonlight


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2016年5月24日 2:16