2012-01-25 3 views
1

사용자 컨트롤 또는 폼에 등 문자열, 선 그리기, 3.5 .NET :윈폼, 나는이 (가) 다음 않았다

public partial class Form1 : Form 
{ 
    public UserControl uc = new UserControl(); 

    private void Form1_Load(object sender, EventArgs e) 
    { 
    uc.Width = 100; 
    uc.Height = 20; 
    uc.BackColor = Color.White; 

    uc.Paint += new PaintEventHandler((object s, PaintEventArgs pe) => { 
     Graphics g = ((UserControl)s).CreateGraphics(); 
     g.DrawString("hello", this.Font, Brushes.Black, 0, 0); 
    }); 

    uc.Visible = true; 
    this.Controls.Add(uc); 

    Bitmap bmp = new Bitmap(uc.Width, uc.Height); 
    uc.DrawToBitmap(bmp, uc.ClientRectangle); 
    bmp.Save("c:\\my_image.png", System.Drawing.Imaging.ImageFormat.Png); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
    Bitmap bmp = new Bitmap(uc.Width, uc.Height); 
    uc.DrawToBitmap(bmp, uc.ClientRectangle); 
    bmp.Save("c:\\my_image.png", System.Drawing.Imaging.ImageFormat.Png); 
    } 
} 

을 지금, 나는이 "안녕하세요"문자열 양식에 제대로 표시 볼 수 있지만, my_image .png 파일에는 빈 흰색 배경 만 표시됩니다. button1을 클릭하면 동일한 결과가 나타납니다. 왜? VB.NET에서 위의 코드를 작성하면 더 혼란스러운 일이 발생합니다. 버튼 1을 클릭하면 흰색 배경도 사라집니다. uc는 폭과 높이가 150px 인 새롭게 생성 된 것처럼 작동합니다. 내가 무엇이 누락 되었습니까?

답변

2

Paint 코드가 잘못되었습니다. PaintEventArgsGraphics 개체가 전달되었습니다.
CreateGraphics으로 전화 할 필요가 없습니다. 폼의 클라이언트 영역이 DrawToBitmap 코드가 Load 이벤트에서 실행될 때 아직 인출되지 않았기 때문에 당신이 만드는

uc.Paint += new PaintEventHandler((object s, PaintEventArgs pe) => { 
     pe.Graphics.DrawString("hello", this.Font, Brushes.Black, 0, 0); 
}); 

이미지 파일은 아마도 비어 있습니다.

버튼 클릭에 대한 응답으로 정상적으로 작동합니다. 어떤 코드가 두 위치에 모두 시작해야하는지에 대한 질문이 제기됩니다.

VB.NET 코드의 문제점이 무엇인지 말하기는 어렵습니다. 그러나 Load 이벤트에 대한 응답이 아닌 폼의 생성자 내부에서이 UserControl 생성/초기화를 모두 수행하는 것이 좋습니다.

+0

당신 말이 맞습니다. 원래 Paint 이벤트에 가입하지 않고 문자열을 그리려고했습니다. 그래서 CreateGraphics를 사용했고 페인트 이벤트로 전환했을 때 이벤트 arg를 사용하는 것을 잊었습니다. – synergetic