2013-05-18 27 views
2

這裏是我試圖解決的問題:轉換鼠標點擊位置給定規模

您有顯示心臟率的屏幕(1 HOUR - 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()); 
    } 
} 

有沒有更優雅的解決方案?

+0

你想如何改善它?它有什麼問題? – MAV

+0

我尋找更優雅的方式來執行該..如果有可能.. –

+0

如果您單擊圖片框中途,您在relativePosX/boxWidth = .5;那麼你是不是簡單地用0.5分乘以60分鐘來獲得第30分鐘?你除以60. – Tim

回答

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 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()); 
} 
+0

建議:將'pictureBox1.Width + 1'改爲'pictureBox1.ClientSize.Width'以獲得寬度減去邊框/邊距/等。並加1分鐘,因爲我相信第一分鐘是'1',而不是'0'。 –

+0

當然,我可以做更多的可讀性..但我尋找更優雅的方式來執行該...是的,這是一個面試問題:)我不想花時間,檢查我的答案我通過picturebox做到了這一點..但我喜歡你的迴應!謝謝! amm,+1這是因爲獲得0-59之間的分鐘。 –

+0

@JordanTrudgett與pictureBox1.ClientSize.Width和pictureBox1.Width有什麼不同? –