簡體   English   中英

如何通過在Windows窗體內的PictureBox中按住鼠標按鈕來繪制矩形?

[英]How to draw a rectangle by holding down mouse button in a PictureBox inside a windows form?

在我的應用程序中,我想通過按住鼠標按鈕在圖片框上繪制一個矩形,從按下mousbutton的那一刻起以及釋放它的那一刻起,必須檢索定義該矩形的2個點。 問題是,矩形的坐標點是相對於Windows窗體的,但我需要相對於圖片框的坐標點,這意味着圖片框應使用單獨的坐標點,這是我的代碼段...

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

    public Form1()
    {

        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        bHaveMouse = false;
    }
    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.DarkGreen, FrameStyle.Thick);
        textBox2.Text = (rc.Width).ToString();
        textBox3.Text = (rc.Height).ToString();
    }



    private void pictureBox1_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);
            textBox1.Text = (ptOriginal).ToString();
            textBox4.Text = (ptLast).ToString();

        }

    }

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

    private void pictureBox1_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;
    }

我認為您太過復雜了。

不用使用ControlPaint您可以簡單地在您的圖片框上獲得一個Graphics -Object,那樣,在該圖形對象內,您必須使用相對於其自身的坐標,而不是相對於包含它的控件,這是一個小例子:

public Form1()
{
    InitializeComponent();

    Bitmap myBitmap = new Bitmap(this.pictureBox1.Width, this.pictureBox1.Height);

    using (Graphics g = Graphics.FromImage(myBitmap))
    {
        g.Clear(Color.Aqua);
        g.DrawRectangle(new Pen(Brushes.Black), 10, 10, 100, 100);
    }

    this.pictureBox1.Image = myBitmap;
}

對我來說,它的輸出看起來像這樣(表單是:284x262,圖片框:156x124,相對於表單原點位於(47,35))

樣本輸出

使用代碼的大部分內容,您可以輕松地使用相對於pictue框的坐標(我沒有將坐標的輸出使用到文本框中, MyDrawReversibleRectangle用我的簡單的一個替換了MyDrawReversibleRectangle ,現在您可以通過按住在圖片框內按下鼠標按鈕:

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

    public Form1()
    {
        InitializeComponent();

        this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
        this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
        this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp);
    }

    private void MyDrawReversibleRectangle(Point p1, Point p2)
    {
        Bitmap myBitmap = new Bitmap(this.pictureBox1.Width, this.pictureBox1.Height);

        using (Graphics g = Graphics.FromImage(myBitmap))
        {
            g.Clear(Color.Aqua);
            g.DrawRectangle(new Pen(Brushes.Black), p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.Y);
        }

        this.pictureBox1.Image = myBitmap;
    }

    private void pictureBox1_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 pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        bHaveMouse = true;
        ptOriginal.X = e.X;
        ptOriginal.Y = e.Y;
        ptLast.X = -1;
        ptLast.Y = -1;
    }

    private void pictureBox1_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;
    }
}

編輯:您沒有包括代碼的那部分,但是正如我在Form1 -constructor中所做的那樣,我想我也可以明確提及它:您需要在圖片框上定義mouse event handlers ,否則此代碼將無法工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM