it-swarm.com.ru

Как я могу назвать событие Paint?

Моя программа рисует текст на своей панели, но если я хочу удалить текст, мне нужно перекрасить.

Как мне вызвать (поднять) событие Paint вручную?

43
Ivan Prodanov

Метод Invalidate () вызовет перерисовку.

MSDN Link

41
Matthew Vines

В методе вашей Формы или Контроля у вас есть 3 варианта:

this.Invalidate();  // request a delayed Repaint by the normal MessageLoop system    
this.Update();      // forces Repaint of invalidated area 
this.Refresh();     // Combines Invalidate() and Update()

Обычно вы просто вызываете Invalidate() и позволяете системе объединить это с другими обновлениями экрана. Если вы спешите, вы должны вызвать Refresh(), но тогда вы рискуете, что он будет перекрашиваться несколько раз подряд из-за аннулирования других элементов управления (особенно родительского). 

Обычный способ, которым Windows (Win32 и WinForms.Net) обрабатывает это, состоит в том, чтобы дождаться, пока MessageQueue не запустится, а затем обработать все недействительные области экрана. Это эффективно, потому что когда что-то меняется, что обычно каскадно переходит в другие вещи (элементы управления). 

Наиболее распространенный сценарий для Update () - это когда вы изменяете свойство (скажем, label1.Text, которое сделает недействительным метку) в цикле for, и этот цикл временно блокирует цикл обработки сообщений. Всякий раз, когда вы используете его, вы должны спросить себя, не следует ли вам вместо этого использовать поток. Но ответ не всегда да. 

85
Henk Holterman

Я обнаружил, что Invalidate () создает слишком много мерцания. Вот моя ситуация. Пользовательский элемент управления, который я разрабатываю, рисует его все содержимое посредством обработки события Paint .

this.Paint += this.OnPaint;

Этот обработчик вызывает пользовательскую процедуру, которая выполняет фактическую рисование.

private void OnPaint(object sender, PaintEventArgs e)
{
    this.DrawFrame(e.Graphics);
}

Чтобы имитировать прокрутку, я хочу перекрашивать свой элемент управления каждый раз, когда курсор перемещается, пока нажата левая кнопка мыши. Моим первым выбором было использование Invalidate () , как показано ниже.

private void RedrawFrame()
{
    var r = new Rectangle(
        0, 0, this.Width, this.Height);

    this.Invalidate(r);
    this.Update();
}

Управление прокручивается в порядке, но мигает далеко за пределы любого удобного уровня. Поэтому я решил вместо перерисовки элемента управления вызывать мой метод DrawFrame () непосредственно после обработки события MouseMove . Это произвело плавную прокрутку без мерцания.

private void RedrawFrame()
{
    var g = Graphics.FromHwnd(this.Handle);
    this.DrawFrame(g);
}

Такой подход может быть неприменим ко всем ситуациям, но пока он мне подходит.

6
user2529145

Я думаю, что вы также можете позвонить Refresh().

5
Brian

Вызовите control.invalidate и событие Paint будет вызвано.

4
Otávio Décio

Обновление, вероятно, также сделает код более читабельным, в зависимости от контекста.

3
Simon Nunn

используйте Control.InvokePaint вы также можете использовать его для ручной двойной буферизации

0
TheNegative