我敢肯定,我誤解了你要求我的第一個答覆(我將它留在本答案的末尾供參考)。
我現在認爲你正在爲你正在做的事情要求更高層次的設計。
如果您打算進一步開發心率圖顯示,那麼您可能需要爲其編寫自定義的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 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()
。這樣,你實際上通過了MouseEventArgs
,所以你不需要做演員。所以它會變成:
private void pictureBox1_MouseClick(object sender, mouseEventArgs e)
{
int minute = minuteAtPictureBoxCoord(e.X);
MessageBox.Show(minute.ToString());
}
你想如何改善它?它有什麼問題? – MAV
我尋找更優雅的方式來執行該..如果有可能.. –
如果您單擊圖片框中途,您在relativePosX/boxWidth = .5;那麼你是不是簡單地用0.5分乘以60分鐘來獲得第30分鐘?你除以60. – Tim