2010-03-29 83 views
1

class OriginalImage:Form { private image image; private PictureBox pb;C#WinForms問題與繪製圖像

public OriginalImage() 
    { 
     pb = new PictureBox {SizeMode = PictureBoxSizeMode.CenterImage}; 
     pb.SizeMode = PictureBoxSizeMode.StretchImage; 

     Controls.Add(pb); 

     image = Image.FromFile(@"Image/original.jpg"); 

     this.Width = image.Width; 
     this.Height = image.Height; 

     this.Text = "Original image"; 
     this.Paint += new PaintEventHandler(Drawer); 
    } 

    public virtual void Drawer(object source, PaintEventArgs e) 
    { 
     Graphics g = pb.CreateGraphics(); 
     g.DrawImage(image,0,0); 
    } 

我把這個創建對象按照其他形式稱爲創建對象OriginalImage,但是圖像沒有被繪製?問題在哪裏?

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var oi = new OriginalImage(); 
     oi.Show(); 
    } 
} 
+0

爲什麼你是從形式來實現的原因嗎?而不只是創建一個圖像,並將其添加到當前的形式? – 2010-03-29 13:53:36

+0

這聽起來像他想以一種新形式展示圖像...。 – 2010-03-29 13:56:36

回答

2

你正在創建一個PictureBox並將其添加到您的控件,但你從來沒有真正使用它(你手工繪製的圖像中的Paint事件)。爲什麼?此控件可能會遮住表單的繪圖區域,因爲任何控件都會在您在Paint事件中繪製的任何控件之上進行。

另外,您通過PictureBox而不是Form本身調用CreateGraphics得到Graphics對象。這是錯誤的,因爲PictureBox的Paint事件將在之後觸發,這會擦除您繪製的任何內容。

我會建議您更改OriginalForm代碼如下:

class OriginalImage: Form 
{ 
    private Image image; 
    private PictureBox pb; 

    public OriginalImage() 
    { 
     pb = new PictureBox(); 
     pb.SizeMode = PictureBoxSizeMode.StretchImage; 

     pb.Dock = DockStyle.Fill; // this will make the PictureBox occupy the 
            // whole form 

     Controls.Add(pb); 

     image = Image.FromFile(@"Image/original.jpg"); 

     this.ClientSize = new Size(image.Width, image.Height); // this allows you to 
                   // size the form while 
                   // accounting for the 
                   // border 

     this.Text = "Original image"; 

     pb.Image = image; // use this instead of drawing it yourself. 
    } 
}