2013-08-15 4 views
1

이러한 요소에 몇 가지 문제가 있습니다. 그래픽으로 선을 그려서 pictureBox에 놓으려고합니다. 그런 다음 MessageBox를 호출하고 내 mainWindow의 뒤에서 실행됩니다. 왜냐하면 프로그램이 MesageBox 버튼을 클릭하기를 기다리기 때문에 mainWindow를 사용할 수 없다. 그러나 나는 그것을 보지 못한다. 버튼 Alt는 나를 돕거나, Alt + Tab을하지만, 그것은 바보입니다. 그럼, 내 코드입니다 :picturebox, graphics 및 messageBox

공개 부분 클래스 Form1 : 양식 { 그래픽 g; 비트 맵 btm;

public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     btm = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height); 
     g = CreateGraphics(); 
     g = Graphics.FromImage(btm); 
     Pen p = new Pen(Brushes.Red); 
     g.DrawLine(p, 0, 0, btm.Size.Width, btm.Size.Height);    
     pictureBox1.Refresh(); 
     g.Dispose(); 
    } 

    protected override void OnClosing(CancelEventArgs e) 
    { 
     DialogResult dr = MessageBox.Show("Exit?", "Exit", MessageBoxButtons.YesNo); 
     if (dr == DialogResult.No) e.Cancel = true; else e.Cancel = false; 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     pictureBox1.Image = btm; 
    } 
} 

말해줘, 내 문제는 어디에 있습니까? 감사합니다

+0

그래서 무엇이 문제입니까? –

+0

messageBox가 mainWindow 뒤에 표시되는 이유는 무엇입니까? – mit

+0

메인 윈도우는 form1입니까? –

답변

1

양식을 새로 고치면 페인트 이벤트가 호출됩니다. 이 시점에서 플래그를 설정하여 사용자 지정 그리기를 피할 수 있습니다.

bool updatePictureBox = true; 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if(updatePictureBox) 
     pictureBox1.Image = btm; 
} 

protected override void OnClosing(CancelEventArgs e) 
{ 
    updatePictureBox = false; 
    DialogResult dr = MessageBox.Show(this,"Exit?", "Exit", MessageBoxButtons.YesNo); 
    if (dr == DialogResult.No) e.Cancel = true; else e.Cancel = false; 
} 

그러나 Paint 이벤트 자체에 그림으로써 전체 문제를 방지 할 수 있습니다. 위의 플래그 메서드를 사용하는 대신이 작업을 수행하는 것이 좋습니다.

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    var g = e.Graphics;    
    using (Pen p = new Pen(Brushes.Red)) 
    { 
     g.DrawLine(p, 0, 0, pictureBox1.Width, pictureBox1.Height); 
    } 
} 
+0

고마워요! 모든 것이 작동합니다! 이 질문에 도와 주시겠습니까 : http://stackoverflow.com/questions/17945122/problems-with-printalso-pagesettings-pagepreview – mit

+0

두 번째 예제는 좋지 않습니다. 왜냐하면이 도면을 파일에 저장하려고하기 때문입니다. 그래서 저장을 위해 비트 맵을 가지고 있어야합니다. 하지만 그래픽 g를 어떻게 비트 맵으로 변환 할 수 있는지 이해할 수 없습니다. 어디서나 비트 맵을 씁니다. b = new bitmap(); 그래픽 g = graphics.fromimage (b). 하지만 g = egraphics를 사용하면 빈 이미지가 생깁니다. – mit

+0

PictureBox 자체에서 직접 이미지를 가져 와서 저장할 수 있습니다. http://stackoverflow.com/questions/6845720/how-to-save-picturebox-image- to-file – keyboardP