Non-Client control painting

Non-Client control painting

This article was submitted .

Custom painting of Windows controls is common these days, but I rarely see attempts to change the border and caption-decorations of the standard controls.

Non Client painting in Windows allows you to custom paint the frames, border and caption of your window. Two important messages need to be handled: the WM_NCCALCSIZE, which determines the size of the non-client area, and WM_NCPAINT where you do the painting.

The WM_NCPAINT message is sent to all windows just prior the usual WM_PAINT message. Unlike WM_PAINT, you need to grab hold of the Device Context (HDC) yourself using the GetWindowDC API. Once set up, you can do custom painting of any sort of the Window border and caption.

The sample included here custom paints my old Property Grid control with bulky and slanted headers. It's not very pretty, but shows that it is really not too difficult to create new headerbars for the common ListView control.

There are only a few samples available from Microsoft to demonstrate this technique. It's probably due to the fact that they change the appearance (theme) of the standard controls from time to time (OS to OS), and too much custom painting will create non-compliant controls in the end. I have actually seen comments like "if they're writing the code, they must know what they're doing." As someone who writes code, I appreciate the vote of confidence, but knowing how to program isn't the same thing as knowing what you're doing. Knowing when not to write a certain piece of code is probably a much more powerful gift.

Source Code Dependencies

Microsoft WTL 7.1 Library

Download Files

DownloadSource Code (56 Kb)

To the top