Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get correct background and control colors in property pages?

I'm trying to handle background color properly in a dynamically generated property sheet in dynamically generated property pages in win32 api using MFC (though I expect my question is general, and not restricted to MFC, but since my code and examples use it, it's germane to my question anyway).

So we have a:

CPropertySheet

containing multiple

CPropertyPage

I generate the contents of any given page dynamically - from file resources using a custom dialog definition language - all irrelevant other than to say - a list of controls and their coordinates is created within a given page, and the page is resized to accommodate them. This logic is working beautifully.

However, what doesn't work is that the controls and background of each page draws using the dialog default color/brush.

I've tried a number of ways to attempt to force it to draw using the white color/brush that a hard-coded property sheet / page would.

There are two important pieces to this:

  1. Page Background
  2. Control (on the page) background

For #1, I've tried:

  • acquire the background brush from parent window class (it's dialog bkgrd) (same is true if I do this and ask the tab control)
  • change the property page to use WS_EX_TRANSPARENT (PreCreateWindow is not called by the framework when generating a page viz PropertySheet::AddPage)

For #2, I've tried:

  • overriding OnWndMsg / WM_CTLCOLORSTATIC to forward that request to (A) the parent (sheet), and (B) to the tab control (which is what wants the white in the first place).

However, anytime I use any of the above "ask for the background / forward the request" up the chain to either the sheet or the tab control - I get the dialog background color, never the white I'd expect.

Using Spy64, I can see that for a fully hardcoded property sheet / page - that the only discernable differences I can see is that the dialog window created in AddPage (or its moral equivalent) has WS_CHILD instead of mine which has WS_POPUP (the rest of the styles appear to be the same, such as WS_VISIBLE|DS_3DLOOK|DS_FIXEDSYS|DS_SETFONT|DS_CONTROL and WS_EX_CONTROLPARENT.

So, other than the WS_CHILD, I see no significant differences from what I'm creating and from another property sheet that works properly from a standard resource (i.e. hard coded).

I'm also flummoxed as to how this works normally anyway - since forwarding things like the ctrlcolor message doesn't respond correctly - and asking for the windows background colors similar doesn't - then how is it in a standard case the background colors of controls and pages comes out as white, and not dialog background?

Any ideas or help would be appreciated - I'm kind of running out of ideas...

like image 707
Mordachai Avatar asked Oct 20 '25 01:10

Mordachai


2 Answers

When Visual Styles were added in Windows XP they really wanted to show off this new feature so they made the tab background a gradient (really a stretched image) instead of a single color and this caused problems in old applications that did custom drawing with the dialog brush as the background.

Because of this, only applications with a comctl32 v6 manifest got the new look but there was a problem; old propertysheet shell extensions would load in new applications (including Explorer) and things would look wrong.

To work around this they also require you (or your UI framework) to call EnableThemeDialogTexture(.., ETDT_ENABLETAB) to get the correct tab page look.

As if things are not tricky enough, there is a undocumented requirement that you also need a button or a static control on the page!

If you have custom controls they have to call DrawThemeParentBackground when you draw if they are partially transparent.

like image 89
Anders Avatar answered Oct 22 '25 07:10

Anders


Turns out my old code had defined an ON_WM_ERASEBKGND handler - and removing that (and all of my above attempts) makes it work.

So simply doing NOTHING is the correct answer. D'oh!!!

I'm leaving my shame here in case someone else trips on this! [Whoops!]

(Still interested if anyone has deeper insight into how this mechanism works under the hood)

like image 37
Mordachai Avatar answered Oct 22 '25 08:10

Mordachai



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!