February 21st, 2007

With what operations is LockWindowUpdate meant to be used?

As I noted earlier, the intended purpose of LockWindowUpdate can be captured in one word: dragging. The simplest case of LockWindowUpdate is used by the window manager when you move or resize a window and “Show window contents while dragging” is disabled. When you start the move/size operation, the window manager locks the entire desktop so it can draw the dotted-rectangle feedback without risking interference from another window that happens to intersect the dotted-rectangle. When the move/size operation is complete, the desktop is unlocked, and the world returns to normal. A common case where an application uses LockWindowUpdate is if it wants to draw a custom image when offering drag feedback. In this case, the application locks its own window in order to draw the drag feedback. It then uses the DCX_LOCKWINDOWUPDATE flag to get a DC that it can use to draw the desired feedback, and it doesn’t have to worry about the window procedure or any other code in the application accidentally drawing to the feedback window and messing up the drag image. For example, if the application is displaying drag feedback on a list view, and some asynchronous event caused the list view contents to change (say, an item got added), and the drag image just happens to be where the new item is about to appear, you wouldn’t want the normal redraw behavior of the listview to overpaint (or worse, merge with) the drag image. A case where you would want to lock another application’s window is if you are dragging an object across the screen. You might do this if you are a program like Spy that has an option to let the user select a window by dragging a “selection gadget” over it. Not only do you have to lock the window the use is selecting so that its own painting won’t conflict with your “selection gadget”, but also so that it doesn’t conflict with the highlight effect you place around that window.

By now, you’ve probably noticed a common thread to all of these LockWindowUpdate scenarios: They all involve dragging of some sort. Dragging a window caption to move it, dragging the edge of a window to resize it, dragging an item into a window, or dragging an item out of a window. This is not a coincidence. The LockWindowUpdate function was designed with these drag scenarios in mind. Since dragging an item uses the mouse button, and there’s only one mouse, you can’t have multiple drag operations in progress at once, and therefore, there’s no need to lock more than one window for update at a time. The function should perhaps more accurately have been named LockDragWindow.

Topics
Code

Author

Raymond has been involved in the evolution of Windows for more than 30 years. In 2003, he began a Web site known as The Old New Thing which has grown in popularity far beyond his wildest imagination, a development which still gives him the heebie-jeebies. The Web site spawned a book, coincidentally also titled The Old New Thing (Addison Wesley 2007). He occasionally appears on the Windows Dev Docs Twitter account to tell stories which convey no useful information.

0 comments

Discussion are closed.