web-dev-qa-db-ja.com

マウスクリックで長方形を描く

MouseClickで長方形を描くことはできますか?私のコードは今のところ機能していません。手伝って頂けますか?

private void panel1_MouseClick(object sender, MouseEventArgs e)
{
    Graphics g = this.CreateGraphics();
    Pen pen = new Pen(Color.Black, 2);

    g.DrawRectangle(pen, 100,100, 100, 200);
}
10
Dinu

編集バージョン:

あなたがやろうとしていることの多くの仮定なしに:

private void panel1_Click(object sender, EventArgs e) {
    using (Graphics g = this.panel1.CreateGraphics()) {
        Pen pen = new Pen(Color.Black, 2);
        Brush brush = new SolidBrush(this.panel1.BackgroundColor);

        g.DrawRectangle(pen, 100,100, 100, 200);

        pen.Dispose();
    }
}

ウィンドウ(this)に四角形を描画しているため、コードは機能せず、描画された四角形はパネルによって非表示になります。

一般的に このような単純なケースでペイントをオーバーライドすることは、パネルに長方形を描画するだけでは手間がかかりすぎます。ただし、この方法で長方形を描画することはできますが、フォームを再描画すると長方形は消えます(たとえば、フォームを最小化してから再度表示するなど)。長方形を永続化する必要がある場合は、Paintメソッドを使用する必要があります。 (たとえば)クリックイベントで長方形を作成し、それをペイントイベントで描画する必要があります(このようなアプローチについては、roygbivのソリューションを参照してください)。注:Paintメソッドを使用する場合は、Paintメソッドが頻繁に呼び出されるため、可能な限り効率を維持する必要があります。

編集2

長方形は常に同じ場所に描画されるため、背景をクリアする必要はありません。ユーザーがクリックしたポイントに長方形を描画するには(これが必要なものであると想定されます)、コードをマウスダウンイベントに移動する必要があります。例:

private void panel1_MouseDown(object sender, MouseEventArgs e) {
    using (Graphics g = this.panel1.CreateGraphics()) {
        Pen pen = new Pen(Color.Black, 2);
        Brush brush = new SolidBrush(this.panel1.BackColor);

        g.FillRectangle(brush, this.panel1.Bounds);  // redraws background
        g.DrawRectangle(pen, e.X, e.Y, 20, 20);

        pen.Dispose();
        brush.Dispose();
    }
}
13
AxelEckenberger

代わりにPictureBoxを使用してこのコードを試してください(開始するためだけに-これにはさまざまな方法があります)。

private void pictureBox1_Click(object sender, EventArgs e)
{
    if (pictureBox1.Image == null)
    {
            pictureBox1.Image = new Bitmap(pictureBox1.width, 
                    pictureBox1.height);
    }
    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
    {
        // draw black background
        g.Clear(Color.Black);
        Rectangle rect = new Rectangle(100, 100, 200, 200);
        g.DrawRectangle(Pens.Red, rect);
    }
    pictureBox1.Invalidate();
}

この手法は、描画を自動的に「永続化」します。つまり、別のウィンドウをドラッグしても描画が消えることはありません。コントロールに直接描画すると(CreateGraphics()呼び出しで何をしようとしているのか)、通常、非永続性の問題が発生します。

更新:これは、マウスがクリックされた場所に応じて何かを描画するより詳細な例を持つ別の答えです:

絵箱に絵を描く方法

3
MusiGenesis

MouseClickで長方形を描くことはできますか?

「パネル上でマウスをクリックすると、長方形を表示したい」という意味の場合は、次のように実行できます。

        private bool displayRectangle = false;

        private void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            displayRectangle = true;
            panel1.Invalidate(false);
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (displayRectangle)
            {
                using (Pen p = new Pen(Color.Black, 2))
                {
                    e.Graphics.DrawRectangle(p, 100, 100, 100, 200);
                }
            }
        }

「パネル上でマウスをドラッグして長方形を作成したい」という意味の場合は、もう少し作業が必要です。

マウスの下降点と現在の位置の間のデルタを追跡する、マウスの上下移動イベントを処理する必要があります。最後に、マウスを上にすると、長方形を描画します。 「ドラッグ」長方形を描画するには、ダブルバッファリングまたは「xor」長方形を使用する必要があるため、さらに複雑になります。

これらの2つのスレッドが役立つ場合があります。

ランタイムのwinform内で画像ボックスをドラッグ

グリッドマウスにスナップする

1
user113476

コントロール(この場合はpanel1)の「Paint」イベントで描画する必要があります。

0
TcKs