2013-08-15 2 views
1

У меня есть некоторые проблемы с этими элементами. Я пытаюсь рисовать линию с графикой и помещать ее в pictureBox. Затем я вызываю MessageBox, и он запускается в моем mainWindow. Я не могу использовать mainWindow, потому что программа ждет нажатия кнопок MesageBox. Но я этого не вижу. Кнопка Alt помогает мне только, или Alt + Tab, но это глупо. Итак, это мой код:pictureBox, графика и messageBox

общественный частичный класс Form1: Форма { Графика g; Bitmap 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 показывает за основным окном? – 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

Второй пример не очень хорош, потому что тогда я пытаюсь сохранить этот чертеж в файл. поэтому для меня необходимо иметь Bitmap для хранения. но я не понимаю, как преобразовать графику g в растровое изображение. где угодно записывает bitmap b = new bitmap(); графика g = graphics.fromimage (b). но если бы я использовал g = e.graphics, тогда я получаю пустое изображение – mit

+0

Вы можете получить и сохранить изображение прямо из самого PictureBox http://stackoverflow.com/questions/6845720/how-to-save-picturebox-image- to-file – keyboardP