最初の返信であなたが求めていたものを誤解したと確信しています(参考のために、この回答の最後に残しています)。
私は今、あなたがやっていることのより高いレベルの設計を求めていると思います.
心拍数グラフ表示をさらに開発する場合は、PictureBox を使用するだけでなく、独自のカスタムControl
を作成することをお勧めします。そうすれば、すべての描画ロジックをその実装内にうまくカプセル化できます。
それはそれで大変勉強になりますが。将来もっと書く必要があると思われる場合は、価値があります。
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
もう1 つ: おそらくClick()
. そうすれば、実際に a が渡されるMouseEventArgs
ので、キャストを行う必要はありません。したがって、次のようになります。
private void pictureBox1_MouseClick(object sender, mouseEventArgs e)
{
int minute = minuteAtPictureBoxCoord(e.X);
MessageBox.Show(minute.ToString());
}