Вы .NET WinForms дети действительно должны изучить Win32 API. Получи копию Petzold уже!
Почему g1 перерисовывает изображение во всем окне, а g2 рисует только новую часть, даже если я вызываю g2.Clear () перед рисованием?
Предположительно g2
- это оболочка для контекста устройства, полученная от BeginPaint
. Я представляю себе обертки WinForms PAINTSTRUCT::rcPaint
для вас - эта переменная описывает область, которую нужно нарисовать. Это ожидаемое поведение - вместо того, чтобы сжигать циклы ЦП, перерисовывая все окно каждый раз, когда другое окно перекрывает его всего на один пиксель, вы можете перерисовать ... только один пиксель!
g2.Clear
предположительно ограничено rcPaint
.
g1
- это, вероятно, GetDC
для окна, которое дает вам всю поверхность для рисования.
Почему при использовании любого графического объекта изображение перерисовывается только при увеличении размера окна, а не при уменьшении его размера?
Базовый класс окна, вероятно, не имеет CS_HREDRAW
или CS_VREDRAW
стилей окна. Без них нет повода для поведения по умолчанию запрашивать перерисовку окна, когда оно становится меньше: Windows знает, как выглядит все окно, она может удалить ненужные фрагменты. В отличие от этого, когда окно становится больше, оно не знает, что рисовать в новой области.
Если PaintEventArgs.Graphics не может (или не должен) использоваться для рисования, для чего он используется? Я полагаю, что это просто предотвращает создание нового экземпляра Graphics, если форму не нужно перерисовывать; есть что-то еще, что я пропускаю?
Используется для рисования. Если у вас нет сложных требований к рисованию, вы можете использовать PaintEventArgs.Graphics
, чтобы минимизировать количество рисования, которое идет к вашему окну. (Как указано выше - это огромная экономия циклов ЦП и, вероятно, это простая оболочка над BeginPaint
и EndPaint
- то есть способ выполнения рисования в клиентской области .)