September 12th, 2008

Who is responsible for destroying the font passed in the WM_SETFONT message?

The WM_SETFONT message tells a control which font you would like the control to use for its text. This message is a convention, not a rule. For example, our scratch program doesn’t pay attention to the WM_SETFONT message. If somebody sends it a WM_SETFONT, nothing happens. The scratch program just ignores the caller and uses whatever font it wants.

Although supporting the WM_SETFONT message is optional, if you do choose to support it, you would be well-served to adhere to the following convention: The WM_SETFONT message does not alter font ownership. In other words, whoever was responsible for destroying the font before the WM_SETFONT message is sent is still responsible for destroying it after the message is sent.

Corollary: If you tell somebody to use a specific font, don’t destroy the font while they’re still using it, because they’re counting on you to keep the font valid.

Example: The dialog manager creates the dialog box font and sends the WM_SETFONT message to each control to tell it what font it should use. The dialog manager keeps the font valid until the dialog box is destroyed, at which point the font is destroyed as well.

But what font does a control use before it receives a WM_SETFONT message? Whatever font it wants. Some controls have particular ideas about the font they will use by default; the list view, for example, uses the icon label font. In those cases, it is the control’s responsibility to destroy that default font when the control is destroyed. This is true even if the parent window creates another font and sends a WM_SETFONT to change to that font. There are now two fonts involved: the original default font (which is the control’s responsibility to destroy) and the font set by WM_SETFONT (which is the parent’s responsibility to destroy).

Now this may all sound complicated, but remember the basic rule: The WM_SETFONT message does not change who is responsible for destroying a font. Let’s look at that scenario again, but take out the WM_SETFONT message. (I’ve crossed it out below.) A control creates a default font. The parent window creates another font. The parent window sends the WM_SETFONT message to the control.

Now, without that crossed-out sentence, the ownership rules are crystal clear. The control is responsible for destroying the default font it created, and the parent is responsible for destroying its own font.

The same principle applies to the WM_GETFONT message. You can send WM_SETFONT and WM_GETFONT messages all day long; it has no effect on who is responsible for destroying the font at the end of the day.

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.