簡體   English   中英

C#自定義圖片框控件

[英]C# custom picturebox control

我從事的項目需要不斷獲取位圖並將其繪制在圖片框上。

這個想法是繪制第一個初始位圖,然后檢索其余的位圖並將它們繪制在初始位圖上方。 (第一個仍顯示在圖片框中,因此我想在第一個位圖上繪制它們)。

我試圖設計一個自定義控件來實現OnPaint事件,但是第二次觸發該事件時,它將繪制第二個block並完全隱藏之前繪制的圖像。

public class RapidPictureBox: PictureBox
{
    public pictureBox1Control()
    {
        SetStyle(
          ControlStyles.AllPaintingInWmPaint |
          ControlStyles.OptimizedDoubleBuffer |
          ControlStyles.UserPaint |
          ControlStyles.ResizeRedraw, true);
    }

     public Bitmap block = null;
     public int x = 0, y = 0;
     protected override void OnPaint(PaintEventArgs e)
     {
         e.Graphics.DrawImage(block, x, y);
     }
 }

private void Form1_Load(object sender, EventArgs e)
{  
    RapidPictureBox pictureBox1 = new RapidPictureBox();
    pictureBox1.Dock = DockStyle.Fill;
    Controls.Add(pictureBox1);

    pictureBox1.block = new Bitmap("3.png"); //first initial image

    pictureBox1.block = new Bitmap("2.png"); //draw on the initial one.
}

我不確定代碼中有什么問題。 每次需要時,我都會使用e EventArgs繪制一個新塊,但新繪制似乎完全隱藏了以前的位圖。

您可以從圖片框創建圖形對象,然后在當前圖像上重繪該對象

initial =new Bitmap("test.png");
pictureBox1.Image = initial;
var graphics = pictureBox1.CreateGraphics(); //create a graphic objec
graphics.DrawImage(block, x,y);//that's the second method

您應該做的是將新圖像覆蓋在先前圖像上。 假設有一個主圖像(第一個圖像),而您想在該主圖像上打印下一個圖像(重疊圖像)。 使用以下方法可以做到這一點。

private Bitmap GetOvelappedImages(Bitmap primaryImage, Bitmap overlappingImage)
{
 //create graphics from main image
 using (Graphics g = Graphics.FromImage(primaryImage))
 {
    //draw other image on top of main Image
     g.DrawImage(overlappingImage, new Point(0, 0));
 }
 return primaryImage;
}

然后將此新圖像設置為pictureBox1.block。

private void Form1_Load(object sender, EventArgs e)
{  
    RapidPictureBox pictureBox1 = new RapidPictureBox();
    pictureBox1.Dock = DockStyle.Fill;
    Controls.Add(pictureBox1);

    pictureBox1.block = GetOverlappedImages(new Bitmap("3.png"),new Bitmap("2.png")); //draw on the initial one.
}

那應該為您工作。

注意:使用圖像后,應將其丟棄。

更新:您需要重新繪制整個圖像,因為僅當需要重畫圖片框上顯示的當前圖像時才調用OnPaint。 重寫OnPaint方法可在每次繪制表單時重新繪制圖像; 否則,圖像將一直保留到下一次重新繪制為止。 在這里閱讀OnPaint的文檔

代碼的問題是您沒有將圖片添加到要替換它們的控件中。

旁注 :使用您擁有的代碼,您不會處理PictureBox es圖像中設置的Bitmap對象,因此這可能會導致內存泄漏。

您可以創建類似的控件LayeredPictureBox 這將獲取所有圖像並將它們繪制在彼此之上。 它將具有較差的性能,並且圖像將需要具有透明度才能看起來分層,但是您可以理解:

public class LayeredPictureBox : PictureBox
{
    public LayeredPictureBox()
    {
        SetStyle(
          ControlStyles.AllPaintingInWmPaint |
          ControlStyles.OptimizedDoubleBuffer |
          ControlStyles.UserPaint |
          ControlStyles.ResizeRedraw, true);
    }

     public List<Bitmap> blocks = new List<Bitmap>();
     public int x = 0, y = 0;
     protected override void OnPaint(PaintEventArgs e)
     {
         foreach (Bitmap block in blocks)
         {
             e.Graphics.DrawImage(block, x, y);
         }
     }
 }

private void Form1_Load(object sender, EventArgs e)
{  
    RapidPictureBox pictureBox1 = new RapidPictureBox();
    pictureBox1.Dock = DockStyle.Fill;
    Controls.Add(pictureBox1);

    pictureBox1.blocks.Add(new Bitmap("3.png")); //first initial image

    pictureBox1.blocks.Add(new Bitmap("2.png")); //draw on the initial one.
}

另一種選擇是在添加所有圖像時將它們合並在一起,然后將其繪制到PictureBox中。

暫無
暫無

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

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