将鼠标单击位置转换为给定比例

时间:2013-05-18 12:51:35

标签: c# winforms

以下是我要解决的问题:

  

您有一个显示心率的屏幕(1小时 - 60分钟),如何在点击屏幕时知道您在哪一分钟?   当您点击屏幕时,您将获得特定的高度和宽度。

这就是我所做的:我创建了一个表单,并且在表单上我已经停靠了PictureBox对象。 PictureBox对象有一个通过单击PictureBox对象调用的方法。方法:

private void pictureBox1_Click(object sender, EventArgs e)
{
    var mouseEventArgs = e as MouseEventArgs;
    if (mouseEventArgs != null)
    {
        int widthPerMinute = (int)(mouseEventArgs.X / ((pictureBox1.Width + 1) / 60.0));
        MessageBox.Show((widthPerMinute).ToString());
    }
}

有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我很确定我误解了你要求我第一次回复的内容(我将在本回答的最后留下以供参考)。

我现在认为你正在为你正在做的事情要求更高级别的设计。

如果您要进一步开发心率图表显示,那么您可能想要为它编写自己的自定义Control,而不仅仅是使用PictureBox。这样你就可以很好地将所有绘图逻辑封装在它的实现中。

但这将是一个很好的学习。值得一提的是,如果您认为将来可能需要写更多内容。

MSDN介绍在这里:http://msdn.microsoft.com/en-us/library/bs3yhkh7%28v=vs.110%29.aspx

但从它的声音来看,这是一个面试问题,在这种情况下,你可能不想花这么多时间在它上面。 ;)


我之前的回答:

我不会说有一种更“优雅”的方式,但我想你可以通过提取计算分钟的逻辑单独的方法来使代码更具可读性:

int minuteAtPictureBoxCoord(int x)
{
    double totalMinutes = 60;
    double minutesPerPixel = totalMinutes/(pictureBox1.Width+1);
    int minute = (int)(x*minutesPerPixel);
    return minute;
}

这显然要长得多,但可以说代码是正确的更容易。 (虽然我对pictureBox1.Width+1上的+1并不完全确定 - 我不确定这是否正确;我是从原始代码中复制的。)

它还简化了呼叫站点:

private void pictureBox1_Click(object sender, EventArgs e)
{
    var mouseEventArgs = e as MouseEventArgs;
    if (mouseEventArgs != null)
    {
        int minute = minuteAtPictureBoxCoord(mouseEventArgs.X);
        MessageBox.Show(minute.ToString());
    }
}

我认为一眼就能看出代码的内容要容易一些。

此外,如果您更改屏幕上显示的分钟数,或者如果您有多行心率数据(那么您需要X ),这样可以更轻松地在以后更改计算和一个Y客户端坐标。)

还有一件事:你应该使用PictureBox.MouseClick而不仅仅是Click()。这样你实际上通过了MouseEventArgs,所以你不需要进行演员表演。所以它会变成:

private void pictureBox1_MouseClick(object sender, mouseEventArgs e)
{
    int minute = minuteAtPictureBoxCoord(e.X);
    MessageBox.Show(minute.ToString());
}