0

こんにちは、C# でマウスを使用してフォームにラバーバンドの四角形を描画しようとしました。

問題

1) マウスを離すと、長方形が消えます。【形にとどめてほしい】

2) 描画された長方形の 4 点の座標も見つける必要があります。

3)必要に応じて、新しい長方形を描画するために長方形を消去する必要もあります

形 :

代替テキスト


コード

 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.Text;
 using System.Windows.Forms;

namespace rubberbandrectangle
{
public partial class Form1 : Form
{
    Boolean bHaveMouse;
    Point ptOriginal = new Point();
    Point ptLast = new Point();


    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        bHaveMouse = true;
        ptOriginal.X = e.X;
        ptOriginal.Y = e.Y;
        ptLast.X = -1;
        ptLast.Y = -1;
    }

    private void MyDrawReversibleRectangle(Point p1, Point p2)
    {
        Rectangle rc = new Rectangle();

        p1 = PointToScreen(p1);
        p2 = PointToScreen(p2);
        if (p1.X < p2.X)
        {
            rc.X = p1.X;
            rc.Width = p2.X - p1.X;
        }
        else
        {
            rc.X = p2.X;
            rc.Width = p1.X - p2.X;
        }
        if (p1.Y < p2.Y)
        {
            rc.Y = p1.Y;
            rc.Height = p2.Y - p1.Y;
        }
        else
        {
            rc.Y = p2.Y;
            rc.Height = p1.Y - p2.Y;
        }
        ControlPaint.DrawReversibleFrame(rc,
                        Color.Red, FrameStyle.Dashed);
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        bHaveMouse = false;
        if (ptLast.X != -1)
        {
            Point ptCurrent = new Point(e.X, e.Y);
            MyDrawReversibleRectangle(ptOriginal, ptLast);
        }
        ptLast.X = -1;
        ptLast.Y = -1;
        ptOriginal.X = -1;
        ptOriginal.Y = -1;
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        Point ptCurrent = new Point(e.X, e.Y);
        if (bHaveMouse)
        {
            if (ptLast.X != -1)
            {
                MyDrawReversibleRectangle(ptOriginal, ptLast);
            }
            ptLast = ptCurrent;
                MyDrawReversibleRectangle(ptOriginal, ptCurrent);
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        MouseDown += new MouseEventHandler(Form1_MouseDown);
        MouseUp += new MouseEventHandler(Form1_MouseUp);
        MouseMove += new MouseEventHandler(Form1_MouseMove);
        bHaveMouse = false;
    }





}
}

読んでくれてありがとう

4

2 に答える 2

1

1)マウスを離すと、長方形が消えます。[フォームに残してほしい]

長方形を継続的に描画するには、フォームのOnPaintメソッドをオーバーライドする必要があります。現在、マウスを動かしたときに描画しますが、後で描画する必要もあります。

2)描かれた長方形の4点の座標も見つける必要があります

これらはptOriginal変数とptLast変数に含める必要があります-これ以上何が必要ですか?

3)必要に応じて、長方形を消去して新しい長方形を描画する必要もあります

長方形の描画を停止し、OnPaintで新しい長方形を描画します。

于 2010-07-05T19:50:19.493 に答える
1

私は似たようなものを探していましたが、見つけた解決策に驚きました! 座標は合っていますか?VisualBasic PowerPacks をそのまま使用できます。これは、Visual Studio 2008 の私のバージョンに含まれています。

これは、TextBox の上に四角形を描画するサンプル コードです。つまり、カスタム ボーダー [コード] を指定しています。

Dim x = TextBox1.Location.X
Dim y = TextBox1.Location.Y
Dim width = TextBox1.Width
Dim height = TextBox1.Height
Dim ShapeContainer1 As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
Me.Controls.Add(ShapeContainer1)
Dim RectangleShape1 As New Microsoft.VisualBasic.PowerPacks.RectangleShape
ShapeContainer1.Shapes.AddRange(New Microsoft.VisualBasic.PowerPacks.Shape() {RectangleShape1})
RectangleShape1.Location = New System.Drawing.Point(x - 1, y - 1)
RectangleShape1.Size = New System.Drawing.Size(width + 1, height + 1)
RectangleShape1.BorderColor = Color.MistyRose
ShapeContainer1.Refresh()

コードは自己記述的ですが、問題があればメッセージを残してください... はい、長方形を削除したい場合は、コントロール (Rectangle または ShapeContainer 全体のいずれか) を破棄するだけで、ペイントも手間もかかりません!

于 2010-12-28T16:25:18.790 に答える