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

最初の返信であなたが求めていたものを誤解したと確信しています(参考のために、この回答の最後に残しています)。

私は今、あなたがやっていることのより高いレベルの設計を求めていると思います.

心拍数グラフ表示をさらに開発する場合は、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());
    }
}

コードが何をしようとしているのかが一目でわかるようになった方が少し簡単だと思います。

また、これにより、画面全体に表示される分数などを変更した場合や、心拍数データの行が複数ある場合に、後で計算を簡単に変更できます (その場合、XY のクライアント座標が必要になります) 。 .

PictureBox.MouseClickもう1 つ: おそらくClick(). そうすれば、実際に a が渡されるMouseEventArgsので、キャストを行う必要はありません。したがって、次のようになります。

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