Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在c语言中从一个picturebox中选择两个像素并获得它们的属性?_C#_Coordinates_Pixel_Picturebox_Mouseclick Event - Fatal编程技术网

C# 如何在c语言中从一个picturebox中选择两个像素并获得它们的属性?

C# 如何在c语言中从一个picturebox中选择两个像素并获得它们的属性?,c#,coordinates,pixel,picturebox,mouseclick-event,C#,Coordinates,Pixel,Picturebox,Mouseclick Event,在上一个问题中: @阿图鲁多德给了我这个答案: public Form1() { InitializeComponent(); this.myPictureBox.BackColor = Color.Red; } private void startButton_Click(object sender, EventArgs e) { if (MessageBox.Show( "Please click the object in the image ",

在上一个问题中:

@阿图鲁多德给了我这个答案:

public Form1()
{
    InitializeComponent();
    this.myPictureBox.BackColor = Color.Red;
}

private void startButton_Click(object sender, EventArgs e)
{
    if (MessageBox.Show(
        "Please click the object in the image ",
        "", 
        MessageBoxButtons.OKCancel, 
        MessageBoxIcon.Exclamation, 
        MessageBoxDefaultButton.Button1) == DialogResult.OK)
    {
        this.myPictureBox.MouseClick += this.myPictureBox_MouseClick;
    }
}

void myPictureBox_MouseClick(object sender, MouseEventArgs e)
{
    this.myPictureBox.MouseClick -= myPictureBox_MouseClick;
    var point = new Point(e.X, e.Y);
    MessageBox.Show(string.Format("You've selected a pixel with coordinates: {0}:{1}", point.X, point.Y));
}
对于以下场景: 1用户按下某个按钮 2消息框出现 3用户单击“确定”按钮 4消息框显示 5用户单击图像 你开始处理一些事情

但现在我需要以下场景: 1用户按下按钮 2消息框出现 3用户单击“确定”按钮 4消息框显示 5用户单击图像 6程序记录单击的像素坐标 7消息框出现 8用户单击OK 9消息框显示 10用户再次单击图像 11程序记录单击的像素坐标 12图像处理基于两个坐标开始

上述方法不适用于我的新场景,我不知道如何适应它。我还需要使用相同的图片盒


塔克斯

单击点需要两个变量,只需制作一个计数器,即可完成:

int i = 0;
Point p1, p2;
void myPictureBox_MouseClick(object sender, MouseEventArgs e) {
  if(i == 1) this.myPictureBox.MouseClick -= myPictureBox_MouseClick;
  var point = new Point(e.X, e.Y);
  MessageBox.Show(string.Format("You've selected a pixel with coordinates: {0}:{1}", point.X, point.Y));
  if(i == 0) p1 = point;
  else p2 = point;
  i++;
}
//then use the two points p1,p2 for further processing.
请注意,如果您希望以自己的方式使用-=来取消注册处理程序,从而禁用单击PictureBox,则应注意在单击开始按钮后立即禁用它,并在属性时间重新启用它,如下所示:

private void startButton_Click(object sender, EventArgs e) {
   //all the code you already had go first...
   startButton.Enabled = false;
}
void myPictureBox_MouseClick(object sender, MouseEventArgs e) {
   //...
   if(i == 0) p1 = point;
   else { 
      p2 = point;
      startButton.Enabled = true;
   }
   i++;
}

然后你甚至不再需要+=和-=事件处理程序,只需在点击按钮时将i设置为零,如果i>1,则返回;在图片框中单击。我建议这样做的原因是,当您两次单击按钮时,图片框上的MouseClick事件也会出现两次-不太好。@Luaan是的,这是另一种解决方案/方法,我刚刚对OP的代码做了最小的更改。@Luaan OP使用的代码只允许用户单击两次,在那之后,OP再也没有机会点击更多了。是的,但是如果我在点击图片框之前点击开始按钮10次,会发生什么呢?除非第一次单击后按钮被禁用,否则您将获得10个MouseClick事件处理程序,因此您将单击图片框一次,并在一次单击中获得两个点,因为myPictureBox\u MouseClick每次单击都将被调用10次。@Luan如我所说,不会有大于2的次数,首先,当I=0时,代码正常运行,下一步单击i=1,单击this.myPictureBox.MouseClick-=myPictureBox\u MouseClick;执行并从myPictureBox.MouseClick中注销处理程序,然后它仍然运行剩余的代码,这也是用户第二次单击pictureBox。之后,由于处理程序已注销,单击pictureBox将没有任何代码可处理。