Setting title bar and border colors programmatically

Alpay picture Alpay · Aug 31, 2015 · Viewed 20.5k times · Source

I am trying to change my application' s title bar and border colors programmatically. I tried lots of things but with no success, and decided to change these colors system-wide. Because it is also acceptable for me to change title bar and border colors as my application is running, and revert them back in the end of my application. (Managed environment, with small set of applications running)

Is it possible to change these colors dynamically(process-wide, or system-wide unless process-wide change is possible)? Can you suggest any way to achieve this?

I tried something like the following but it doesn' t do what I want:

int aElements[2] = {COLOR_WINDOW, COLOR_ACTIVECAPTION};
DWORD aOldColors[2];
DWORD aNewColors[2];

aOldColors[0] = GetSysColor(aElements[0]); 
aOldColors[1] = GetSysColor(aElements[1]); 
aNewColors[0] = RGB(0x80, 0x80, 0x80);  // light gray 
aNewColors[1] = RGB(0x80, 0x00, 0x80);  // dark purple 

SetSysColors(2, aElements, aNewColors);
SetSysColors(2, aElements, aOldColors);

Thanks in advance

EDIT

This is exactly what I want:

enter image description here

Answer

lexx9999 picture lexx9999 · Jun 25, 2016

I don't recommend to customize border and title redrawing. It's really hard to do it the right way. Office just draws everything by itself in the client area but using normal border. Using NC_PAINT the right way is a pain and may introduce flickering. Especially positioning the minimize,maximize and close buttons is difficult, because every windows does it differently. Also take into account accessibility, larger fonts used, customized user settings.

Whats the purpose of changing the colors?

To change the global colors you have to at least separate your code

// call this once at startup of your application (e.g. in WM_CREATE)

SetSysColors(2, aElements, aNewColors); 

// call this when closing you application (e.g. in WM_DESTROY)

SetSysColors(2, aElements, aOldColors);