1

私は DICOM ファイルを表示するアプリケーションに取り組んでおり、今は MPR に取り掛かっています。次のようなピクチャボックスまたはパネルに線を入れることができるコントロールはありますか:

http://www.vcreatelogic.com/docs/gcf-2.6.0/html/MPRView.jpg その意図は、その行を移動し、移動中にいくつかのことを実行することなので、基本的に何らかのコントロールまたはカスタム コントロール (またはカスタム アイコン) を使用すると、ユーザーはマウスを動かしたときにピクチャ ボックス内のどこに移動しているかを確認できます。

ありがとうございました!

更新:これが私が使用しているコードです:

ピクチャボックスのマウスダウン:

 if (e.Clicks == 2)
        {

            horizontalstart = new Point(0, e.Y);//Start point of Horizontal line.
            horizontalend = new Point(picbox_mpr.Width, e.Y);//End point of Horizontal line.
            verticalstart = new Point(e.X, 0);//Start point of Vertical line
            verticalend = new Point(e.X, picbox_mpr.Height);//End point of Vertical line.
 }

次に、MouseMove (画像をパンできる場所) で、これらの線を描画された場所に固定したままにします..

更新:全体のアイデアは、ユーザーが画像をダブルクリックした場合に線を描画し、画像が移動した場合はそれらの線を画像とともに移動することです..

4

2 に答える 2

1

まず最初に、私が提供しているメソッドは、機能するためにカスタム コントロールを必要としません。PictureBox によって提供される 2 つのイベントを使用してロジックを実行しますが、それでもカスタム コントロールが必要な場合は、実行できるはずです。少しコーディングして、これらのメソッドをそのコントロールに移植します。

以下は、ロジックでほとんどの値を保持する 2 つのフィールドです。

private Point horizontalstart, horizontalend;
private Point verticalstart, verticalend;
private bool drawlines;//Specifies a value whether PictureBox should redraw itself.

これらのポイントの目的を説明しましょう。
最初の Point ステートメントは水平線の
始点と終点を保持し、2 番目の Point ステートメントは垂直線の始点と終点を保持します。
作業が終わったら、このコードを;の中に書きMouseMoveEventます。PictureBox

    private void SourcePictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        if(drawlines==true)//If the lines should move.
        {
         horizontalstart = new Point(0, e.Y);//Start point of Horizontal line.
         horizontalend = new Point(SourcePictureBox.Width, e.Y);//End point of Horizontal line.
         verticalstart = new Point(e.X, 0);//Start point of Vertical line
         verticalend = new Point(e.X, SourcePictureBox.Height);//End point of Vertical line.
         SourcePictureBox.Invalidate();//Force PictureBox to repaint.
        }

        else if(drawlines==false)//To lock the lines at current coordinates.
        {
         //Add any code if needed.
        }
    }

ここSourcePictureBoxで、 は操作対象の PictureBox です。 が上がるとすぐに、MouseMoveEvent両方の線の新しい座標が計算され、再描画メッセージが PictureBox に送信されます。PictureBox は、上記で宣言および計算された座標を使用して線を描画します。

Paintそれでは、PictureBoxのイベントで以下のコードを記述します。

    private void SourcePictureBox_Paint(object sender, PaintEventArgs e)
    {
        if (SourcePictureBox.Image != null)
        {
            e.Graphics.DrawLine(SystemPens.WindowText, horizontalstart, horizontalend);//Draw Horizontal line.
            e.Graphics.DrawLine(SystemPens.WindowText, verticalstart, verticalend);//Draw Vertical line.
        }
    }

あなたの画像で気付いたもう1つのことは、画像が示しているガイドラインが画像よりも少し小さいことです。この場合は、MouseMoveEventイベントの両方のステートメントを次のものを除いて置き換えてくださいInvalidate();

        horizontalstart = new Point(0+10, e.Y);//Start point of Horizontal line.

        horizontalend = new Point(SourcePictureBox.Width-10, e.Y);//End point of Horizontal line.

        verticalstart = new Point(e.X, 0+10);//Start point of Vertical line

        verticalend = new Point(e.X, SourcePictureBox.Height-10);//End point of Vertical line.

しかし、これらのステートメントの新しい点は、両方の線の始点を値 10(int) だけ増やし、終点を値 10 で減らすこと以外に何もないため、PictureBox の端とガイド線の間にいくらかのスペースができます。スペースを増減したい場合は、値 10 を任意の値に置き換えますが、値が PictureBox のサイズの半分を超えてはならないことに注意してください。
私が対処したいもう1つのことはchange the colour of guiding lines、両方のステートメントの最初の引数を、クラスSystemPensPaint Eventによって提供される値のいずれかに置き換えたい場合です。クラスに満足できるものがない場合は、いつでも自由に作成できますあなた自身.それを行う方法を知っている場合は、それが最良の選択です.助けが必要な場合は、見てください.新しいペンを作成すると、ギルディング ラインの幅を定義するオプションが提供されます

アップデート

`いつでも、線の移動を停止するには、drawlines (上で宣言した) をfalseに設定し、機能を再開するにはtrueに設定します。

これは誰にでもできる方法ではありませんが、仕事を終わらせるには十分だと思います.PictureBoxと関連するイベントの名前をPictureBoxの名前に変更することを忘れないでください.

于 2013-08-31T16:25:18.210 に答える