2

这是我要解决的问题:

您有一个显示心率的屏幕(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());
    }
}

有没有更优雅的解决方案?

4

1 回答 1

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;
}

这显然要长得多,但可以说更容易看出代码是正确的。(虽然我不完全确定 +1 on pictureBox1.Width+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(). 这样你实际上就通过了 aMouseEventArgs所以你不需要做演员表。所以它会变成:

private void pictureBox1_MouseClick(object sender, mouseEventArgs e)
{
    int minute = minuteAtPictureBoxCoord(e.X);
    MessageBox.Show(minute.ToString());
}
于 2013-05-18T13:13:00.060 回答