簡體   English   中英

從另一個窗體觸發按鈕單擊事件時,在窗體的面板中繪制一個矩形

[英]Draw a rectangle in a panel of a form when a button click event is fired from another form

我目前正在使用Windows窗體應用程序,其中有兩個窗體。 form1和form2。 在form1內有一個按鈕,單擊該按鈕時會打開form2,而我要在單擊Form2內的按鈕時在form1的面板內創建一個矩形。 我在form2的按鈕單擊事件中放入了一些代碼來創建矩形,但是單擊時它什么也沒顯示。 但是,每當我將draw.rectangle方法放入單擊按鈕的相同窗體內時,它都可以工作,但是不同的是,它不會

這是form1中的代碼

  private void btnSave_Click(object sender, EventArgs e)
    {
        Layoutsetting a = new Layoutsetting();
        a.ShowDialog();
    }
public void DrawObject()
    {

            Graphics g = panel1.CreateGraphics();
            Rectangle rect = new Rectangle(10, 10, 80, 90);
            rect.Inflate(-10, -10);
            g.DrawRectangle(black, rect);
            g.FillRectangle(Brushes.BlueViolet, rect);
            StringFormat f = new StringFormat();
            f.LineAlignment = StringAlignment.Center;
            f.Alignment = StringAlignment.Center;
            g.DrawString("Hello", this.Font, Brushes.GhostWhite, rect, f);
            panel1.Refresh();
 }

這是form2中的代碼

  private void btnConfirm_Click(object sender, EventArgs e)
    {
        Form1.Default.DrawObject();
        this.Close();
    }

您必須向Paint添加一個方法:

panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.draw);

private void draw(object sender, PaintEventArgs e)
{
    if(buttonClicked) {
        Graphics g = e.Graphics;
        //...
    }
}

問題不在於繪制矩形,每當面板的一小部分被隱藏時(例如,它的一部分位於另一個表單后面),面板油漆事件就會觸發並重新繪制面板,因此矩形消失(但是當矩形是活動狀態,不會觸發繪制事件,除非您需要重新繪制面板,否則矩形將被繪制並且不會被清除。)

簡易解決方案:

創建矩形圖像,並在需要時用作背景圖像,而不是繪制它。

另一個解決方案:

在表單(或面板)中添加屬性:

public bool NeedsToBeDrawn {get; set;}

而不是這行代碼:

Form1.Default.DrawObject();

只需將屬性設置為true即可:

   Form1.NeedsToBeDrawn  = true;

並將代碼移至面板的繪畫事件:

private void panel1_Paint(object sender, PaintEventArgs e)
{
     if(NeedsToBeDrawn)
     {
            Rectangle rect = new Rectangle(10, 10, 80, 90);
            rect.Inflate(-10, -10);
            e.Graphics.DrawRectangle(black, rect);
            e.Graphics.FillRectangle(Brushes.BlueViolet, rect);
            StringFormat f = new StringFormat();
            f.LineAlignment = StringAlignment.Center;
            f.Alignment = StringAlignment.Center;
            e.Graphics.DrawString("Hello", this.Font, Brushes.GhostWhite, rect, f);
     }
}

暫無
暫無

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

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