sashoalm
sashoalm

Reputation: 79487

On Win32, can I disable painting of a window for a period of time?

Is there a function that will freeze window repainting for some time, while I do changes to the layout of my dialog?

Upvotes: 7

Views: 8711

Answers (3)

Cody Gray
Cody Gray

Reputation: 244782

If you find that you actually need to do this, you should send the window a WM_SETREDRAW message with the wParam set to FALSE. This indicates that the window should not be redrawn after its contents are changed.

When you want to re-enable drawing, send another WM_SETREDRAW message, this time with the wParam set to TRUE.

Sample code:

// Disable window updates
SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);

// Perform your layout here
// ...

// Re-enable window updates
SendMessage(hWnd, WM_SETREDRAW, TRUE, 0);

For more information, Raymond Chen's blog article on the subject is a great read.

Upvotes: 16

avakar
avakar

Reputation: 32635

You should do the repositioning in a single swoop; use BeginDeferWindowPos et al.

Upvotes: 3

David Heffernan
David Heffernan

Reputation: 612993

The way Windows paints is that the system posts your window WM_PAINT messages instructing you to paint. You can elect to ignore these messages if you so wish, whilst you are modifying the layout, and then force a paint cycle once you have finished modifying the layout.

However, my experience of writing UI on Windows is that you usually don't need to take such steps. Since you are in charge of pumping your message queue, if the window is being refreshed whilst you are in the middle of modifying the layout, then you must have taken action that led to the message queue being pumped.

Put simply, stop pumping the queue whilst modifying the layout and your problems will vanish.

Upvotes: 1

Related Questions