我很确定我误解了您要求我的第一个答复的内容(我将其留在此答案的末尾以供参考)。
我现在认为您正在为您正在做的事情要求更高级别的设计。
如果您要进一步开发心率图表显示,那么您可能想要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());
}