Документация цикла рисования WinForms?

Есть ли документация по циклу рисования в WinForms?

Когда я программирую в Windows, цикл рисования обычно имеет форму:

sent a WM_PAINT message
{
   call BeginPaint(&paintStruct)

      //BeginPaint sends WM_NCPAINT and WM_ERASEBKGND
      sent a WM_ERASEBKGND message
      {
         i can:
           - allow default processing (Windows will fill the area with the default background color (e.g. white)
           - erase and background myself (e.g. a gradient) and prevent default processing
           - do nothing (letting whatever was there before me stay there) and prevent default processing
      }

   perform whatever painting i desire on 
         paintStruct.hDC (Device Context)
         paintStruct.rcPaint (Invalid Rectangle)
   that was populated into paintStruct during BeginPaint

   call EndPaint()
}

Все это задокументировано в MSDN: Windows Development \ Graphics and Multimedia \ Windows GDI \ Painting and Drawing \ About Painting and Drawing

Я не могу найти такой документации о WinForms и его цикле рисования. я могу случайным образом найти методы и события, в которых есть имя paint:

  • OnPaint (защищенный метод "Повышает Раскрасьте событие. ")
  • OnPrint (защищенный метод "Повышает Раскрасьте событие. ")
  • InvokePaint (защищенный метод "Поднимает Paint событие для указанного элемента управления. ")
  • Paint (публичное мероприятие)
  • InvokePaintBackground (защищенный метод "Повышает PaintBackground для указанного элемента управления. ")
  • OnPaintBackground (защищенный метод "Рисует фон управления. ")

Примечание: игнорирование факта отсутствия PaintBackground события

Есть ли документация, описывающая конструктивные отношения между этими объектами? Есть ли документация по циклу рисования в WinForms?


person Ian Boyd    schedule 23.04.2011    source источник


Ответы (2)


Это то, что вы ищите?

MSDN: рисование и визуализация настраиваемых элементов управления


OP Edit: когда Microsoft реализует следующий раунд разрыва ссылки, расположение документации:

  • MSDN Library
    • Development Tools and Languages
      • Visual Studio 2010
        • Visual Studio
          • Creating Windows-Based Applications
            • Windows Forms
              • Getting Started with Windows Forms
                • Windows Forms Controls
                  • Development Custom Windows Forms Controls with the .NET Framework
                    • Custom Control Painting and Rendering

person Jason Moore    schedule 23.04.2011

Он не сильно отличается от собственного цикла рисования Windows, события .NET вызываются соответствующими сообщениями Windows. Начиная с нижней части, сообщения генерируются вызовом InvalidateRect () либо оконным менеджером, либо самим приложением. Версия .NET - Control.Invalidate (). Windows отслеживает область обновления для окна, решая, следует ли доставлять сообщения WM_PAINT, WM_NCPAINT и WM_ERASEBKGND.

Сообщения WM_PAINT и WM_ERASEBKGND распознаются Control.WndProc (), когда включен стиль ControlStyles.UserPaint. Он вызывает виртуальные методы OnPaint () и OnPaintBackground (). Производный элемент управления может переопределять эти методы для настройки рисования по мере необходимости. И должен вызвать базовый метод. В конце концов, он достигает метода Control.OnPaint / Background, который запускает события Paint и PaintBackground, чтобы другой код мог настроить рисование.

Единственная другая проблема - это двойная буферизация, разрешенная свойством DoubleBuffered. Winforms создает буфер растрового изображения для элемента управления и запускает OnPaintBackground () и OnPaint (), передавая объект Graphics, созданный из этого растрового изображения. Затем переносит растровое изображение на экран.

person Hans Passant    schedule 23.04.2011
comment
Здесь мы начинаем сталкиваться с нехваткой документации, но UserPaint документация говорит, что если false, событие Paint не возникает. Означает ли это, что Paint event не поднимается? Или это значит, что метод OnPaint не будет вызван? Я замечаю Opaque (если true, элемент управления отображается непрозрачным, а фон не окрашивается) Повлияет ли это на OnPaintBackground. И я вижу еще: AllPaintingInWmPaint OptimizedDoubleBuffer. - person Ian Boyd; 23.04.2011
comment
Я собираюсь принять ответ Джейсона. Строго говоря, я попросил документацию. И хотя документации MSDN может быть чрезвычайно недостаточно, это именно то, что я искал. Хотя этот ответ очень полезен (+1) в качестве дополнения к MSDN. - person Ian Boyd; 23.04.2011