【问题标题】:How can I display on a label the mouse coordinates over a pictureBox but as PointF and not as int?如何在标签上显示图片框上的鼠标坐标但显示为 PointF 而不是 int?
【发布时间】:2014-01-02 00:18:28
【问题描述】:

在我的绘画活动中:

foreach (PointF pt in extendedPoints)
            {
                e.FillEllipse(Brushes.Red, (pt.X - distance) * (float)currentFactor, pt.Y * (float)currentFactor, 4f, 4f);//pt.X, pt.Y, 4f, 4f);
            }

extendedPoints 是列表 例如,现在 pt.X = 181.856888 我在图片框上画了一些点。

在form1中我做了:

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            label4.Visible = true;
            label4.Text = String.Format("X: {0}; Y: {1}", e.X, e.Y);
        }

我想要的是将图片框中的一些点位置与扩展点列表中的位置/坐标进行比较。

但在 Form1 中,e.X 和 e.Y 是 int 类型。 所以改为 181.856888 我只看到 181 并且坐标 181 上有一些点

【问题讨论】:

  • 如果点在绘制时重叠,那么您当然没有希望找出点击了哪个点。您必须为用户提供一种缩放视图的方法。

标签: c# winforms


【解决方案1】:

屏幕(和表单)上的像素实际上只是整数。图片坐标中没有分数。因此,鼠标指针的坐标只能是整数。

当您根据float 坐标绘制形状时,无论如何都会再次使用像素来绘制该形状 - 它使用某些公式来计算放置像素的位置和不放置像素的位置。

总而言之,即使您使用float 值,屏幕上的像素始终是整数。您应该将您的 float 值转换为整数以进行基于像素的比较。

【讨论】:

    【解决方案2】:

    鼠标/触摸坐标是基于像素的,因此它们始终是整数。

    如果您试图让用户点击图表,首先将原始值转换为屏幕坐标(还应考虑比例因子)。

    所以你的数据类型看起来有点像:

    struct dataPoint
    {
       float rawX, rawY;
       int X,Y;
    }
    

    然后如果您将点击/点击数据与屏幕坐标进行比较。

    foreach (dataPoint data in dataPointCollection)
    {
      if (data.X==e.X && data.Y==e.Y)
      {
         //your code
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2019-02-04
      • 1970-01-01
      • 2021-05-31
      • 2012-10-03
      • 1970-01-01
      相关资源
      最近更新 更多