2012-02-28 2 views
2

Я использую BCB6, но она должна быть такой же, как Delphi, если я просто добавить обработчик, как это моя форма:Delphi/Builder/VCL, переопределить WM_PAINT формы без потери двойной буферизации?

void __fastcall TForm1::WndProc(TMessage &Message) 

И обрабатывать WM_PAINT, я не получаю выгоду DoubleBuffered что TWinControl обеспечивает. Есть ли способ сделать некоторую пользовательскую картину в форме, которая соответствует настройке DoubleBuffered (aka-пишет в растровое изображение памяти, созданное TWinControl)?

Эта функция в controls.pas то, где DoubleBuffered будет применяться:

procedure WMPaint(var Message: TWMPaint); message WM_PAINT; 

Это создает битовую карту памяти, а затем снова называет себя. Поэтому мне нужен способ вызвать эту функцию, когда Message.DC равно 0, поэтому он будет создавать растровое изображение, а затем я не буду называть его снова после этого ... но WMPaint не является виртуальным, и ни один из них не является PaintHandler, поэтому я «Не вижу способа зацепиться за это.

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

+0

Формы в Delphi7 (не уверены в BCB) имеют событие OnPaint, но оно не буферизировано, вам все равно придется делать это с помощью простого TBitmap. – Dampsquid

ответ

5

Переопределить метод Paint, а не пытаться обрабатывать сообщения WM_PAINT. Таким образом, встроенный механизм двойной буферизации будет по-прежнему активным, но вы можете настроить свою картину.

+0

OMG, не могу поверить, я пропустил это. Прекрасно работает! – eselk

Смежные вопросы