[C#][WinForms] После OnPaint остается неотрисованный участок
От: Vladimir V. Alekseev  
Дата: 10.03.09 18:40
Оценка:
Здравствуйте,

C#, версия csc — 8.00.50727.42, Framework — 2.0.50727, WinXP SP2.

Вот минимальный проблемный код:


using System;
using System.Windows.Forms;
using System.Drawing;

class MyForm :
    Form
{
    public MyForm()
    {
        WindowState = FormWindowState.Maximized;
        pct_ = new PictureBox();
        pct_.Dock = DockStyle.Fill;
        btn_ = new Button();
        btn_.Click += new System.EventHandler(OnClick);
        Controls.Add(pct_);
        Controls.Add(btn_);
        Invalidate();
        return;
    }
    
    protected override void OnPaint(PaintEventArgs args)
    {
        base.OnPaint(args);
        Draw();
        return;
    }
    
    public void OnClick(object sender, System.EventArgs args)
    {
        Form2 f = new Form2();
        f.ShowDialog();
        Invalidate();
        return;
    }
    
    public void Draw()
    {
        Graphics gph = pct_.CreateGraphics();
        gph.Clear(Color.Red);
        gph.Dispose();
        return;
    }
    
    private Button btn_;
    private PictureBox pct_;
}

class Form2 :
    Form
{
}

class App 
{
    public static int Main()
    {
        Application.Run(new MyForm());
        return 0;
    }
};


По моему разумению этот код должен:
1) Рисовать форму, развернутую на весь экран, закрашивать ее красным цветом;
2) По нажатию на кнопку (ее не видно, нажимал ентером) показывать модальную форму;
3) По закрытию модальной формы перерисовывать основную так, чтобы она снова была полностью закрашена красным.

В результате:
1) Форма загружается, разворачивается, просто мигает красным и остается серой;
2) Ок
3) Послы закрытия модальной формы перерисовка происходит, но на красном фоне остается серый след от закрытой формы.

Что интересно, если f.ShowDialog() заменить на MessageBox.Show(...), следов от закрытого MessageBox'а не остается.

Подскажите, пожалуйста:
1) Почему так происходит?
2) Как лечить?

Заранее спасибо.
invalidate onpaint
Re: [C#][WinForms] После OnPaint остается неотрисованный уча
От: Ovl Россия  
Дата: 10.03.09 19:01
Оценка: 3 (1)
class MyForm :
    Form
{
    public MyForm()
    {
                /* поскипано */        

                pct_.Paint += pictureBox_Paint;

        // не надо, сами разберутся
                //Invalidate();
    }
    
    protected override void pictureBox_Paint(PaintEventArgs args)
    {
        Draw(e.Graphics);
    }
    
    public void OnClick(object sender, System.EventArgs args)
    {
        Form2 f = new Form2();
        f.ShowDialog();
                // не надо. События WM_PAINT будут приходить и так
        //Invalidate();
    }
    
    public void Draw(Graphics gr)
    {
        gr.Clear(Color.Red);
              
                /* 
                //у PaintEventArgs есть Graphics, используйте его здесь, так будет правильнее
        Graphics gph = pct_.CreateGraphics();
        gph.Clear(Color.Red);
                // не надо диспозе. по моему в документации явно про это написано
        gph.Dispose();
                */
    }
    
    private Button btn_;
    private PictureBox pct_;
}


VVA>Подскажите, пожалуйста:

VVA>1) Почему так происходит?
потому что код отвечающий за отрисовку PictureBox и ваш — не связаны друг с другом. Да и вообще не очень кошерно сделано было. То есть теоретических неполадок — много.
VVA>2) Как лечить?
а в каком виде нужен больной? посмотрите комментарии — помогли?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: [C#][WinForms] После OnPaint остается неотрисованный
От: Vladimir V. Alekseev  
Дата: 11.03.09 05:46
Оценка:
Здравствуйте, Ovl, Вы писали:

...skipped...
Ovl>а в каком виде нужен больной? посмотрите комментарии — помогли?

Спасибо большое. После исправлений все работает как надо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.