Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Avoiding the need to call ProcessMessages

I've got a component I created that embeds a hardware-accelerated renderer in a TWinControl so you can place it on a form. It works pretty well in most cases, but if I try to resize the control, everything goes blank until the message loop runs and calls the WndProc for the renderer, which is hosted in an external DLL. This means that I need to call Application.ProcessMessages explicitly after I've resized the control in code, which I know is considered bad practice.

Is there any way to put some logic in the control itself to make it invoke the WndProc in the DLL when I change the control's size, so I won't need to call ProcessMessages to get stuff to render right?

like image 939
Mason Wheeler Avatar asked Apr 29 '10 14:04

Mason Wheeler


2 Answers

You could call TWinControl.Update instead, which should just SendMessage a WM_PAINT event, so you aren't handling arbitrary messages.

like image 117
Zoë Peterson Avatar answered Sep 22 '22 16:09

Zoë Peterson


The correct solution is to call InvalidateRect when you resize. Windows will then post you a WM_PAINT message. For reference you should pull Petzold off the shelf and read his chapter on painting.

like image 4
David Heffernan Avatar answered Sep 24 '22 16:09

David Heffernan