Является ли поверхность рисования объекта Graphics в PaintEventArgs относительно ClipRectangle? - PullRequest
1 голос
/ 17 марта 2011

Я переопределяю OnPaint в моем контроле.Иногда мой элемент управления становится недействительным с помощью прямоугольника отсечения (e.ClipRectangle), который меньше размера элемента управления.

В моем методе OnPaint, когда я рисую на поверхности GDI + (Graphics объект из PaintEventArgs), я начну относительно ClipRectangle или элемента управления?

НапримерДопустим, мой контроль 800 х 600 пикселей.Если я позвоню:

Invalidate(new Rectangle(42, 0, 100, 600));

А затем в OnPaint я нарисую строку:

e.Graphics.DrawString("Don't panic.", new Font("Arial", 12), new Brush(Color.Red), 0, 0);

Появится ли строка на моем элементе управления слева или 42 пикселяс левой стороны?

1 Ответ

1 голос
/ 17 марта 2011

Рисунок всегда должен быть относительно клиентского прямоугольника элемента управления.Это распространенная ошибка - делать это относительно e.ClipRectangle, тоже довольно долго работает на Aero, так как больше не делает окно недействительным, когда вы перетаскиваете через него другое окно.Выдает очень интересные графические эффекты, когда Aero выключен, хотя выглядит как графический эквивалент эха.

Вы должны когда-либо использовать e.ClipRectangle только для оптимизации кода рисования, пропуская части того, что вы рисуете, когда он полностью находится вне области отсечения.Графика уже очень хорошо справляется с автоматическим отсечением, поэтому окупить такой тест не так просто.И очень тяжело, когда не все обрезается, никогда не оптимизируйте это.С включенным Aero мало что остается.

...