まず最初に、私が提供しているメソッドは、機能するためにカスタム コントロールを必要としません。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の名前に変更することを忘れないでください.