I derived CMFCPropertySheet
class from and overrode the OnInitDialog
function:
BOOL CDarkModeMFCPropertySheet::OnInitDialog()
{
BOOL bResult = CMFCPropertySheet::OnInitDialog();
if (IsUsingDarkMode())
{
DarkModeTools::EnableDarkModeForDialog(this);
// Customize tab colors for dark mode
m_wndTab.SetActiveTabColor(RGB(0, 120, 212)); // Active tab background (blue)
m_wndTab.SetTabBkColor(RGB(32, 32, 32)); // Inactive tab background (dark gray)
m_wndTab.SetTabTextColor(RGB(200, 200, 200)); // Inactive tab text (light gray)
m_wndTab.SetActiveTabTextColor(RGB(255, 255, 255)); // Active tab text (white)
// m_wndTab.SetTabBorderColor(RGB(64, 64, 64)); // Tab border (darker gray)
}
return bResult;
}
I have examined the MFC sources and the variable m_wndTab
is defined as:
CMFCPropertySheetTabCtrl m_wndTab;
The CMFCPropertySheetTabCtrl
has all the functions I am trying to use and from the documentation it implies I should be able to colour the tab control. But alas, it is not working. Why?
In the comments it was suggested that I adjust the m_bFlat
variable, which is protected. IN the end I did this:
m_wndTab.ModifyTabStyle(CMFCTabCtrl::STYLE_FLAT);
Now, when I trace into that call, it does:
BOOL CMFCTabCtrl::ModifyTabStyle(Style style)
{
ASSERT_VALID(this);
m_bFlat = (style == STYLE_FLAT);
m_bIsOneNoteStyle = (style == STYLE_3D_ONENOTE);
m_bIsVS2005Style = (style == STYLE_3D_VS2005);
m_bHighLightTabs = m_bIsOneNoteStyle;
m_bLeftRightRounded = (style == STYLE_3D_ROUNDED || style == STYLE_3D_ROUNDED_SCROLL);
SetScrollButtons();
SetTabsHeight();
return TRUE;
}
So it does change the m_bFlat
variable and I confirm it is now TRUE
. But, despite calling this code, no changes have been made to my property sheet colours.
Create a new Visual Manager class and override:
CMFCVisualManager::GetTabFrameColors
Override this function in a derived class if you want to customize the set of colors that the framework uses when it draws a tab window.
Worth investigating!
I ended up using TabCtrl
. It has a lot of features.
So now I have coloured tabs:
And, as for the Outlook bar on property sheets, I did this:
#pragma once
#include <afxvisualmanagerwindows.h>
// CDarkModeMFCVisualManagerWindows command target
class CDarkModeMFCVisualManagerWindows : public CMFCVisualManagerWindows
{
DECLARE_DYNCREATE(CDarkModeMFCVisualManagerWindows)
public:
void OnFillBarBackground(CDC* pDC, CBasePane* pBar, CRect rectClient, CRect rectClip, BOOL bNCArea = FALSE) override
{
if (DarkModeTools::InvokeUseDarkModeFunction())
{
pDC->FillSolidRect(rectClient, DarkModeTools::kDarkControlBackgroundColor);
return;
}
__super::OnFillBarBackground(pDC,pBar,rectClient,rectClip,bNCArea);
}
};
IMPLEMENT_DYNCREATE(CDarkModeMFCVisualManagerWindows, CMFCVisualManagerWindows)
I use that manager in InitInstance
. Now the outlook bar is coloured as I want:
So, not a direct answer to my question, but a satisfactory workaround.