diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp
index 5031b5a8d..e12c9c3b8 100644
--- a/PowerEditor/src/Notepad_plus.cpp
+++ b/PowerEditor/src/Notepad_plus.cpp
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
-#include
+
#include
#include
#include "Notepad_plus.h"
@@ -24,12 +24,9 @@
#include "FileNameStringSplitter.h"
#include "lesDlgs.h"
#include "Utf8_16.h"
-#include "regExtDlg.h"
#include "RunDlg.h"
-#include "ShortcutMapper.h"
#include "preferenceDlg.h"
#include "TaskListDlg.h"
-#include "xmlMatchedTagsHighlighter.h"
#include "EncodingMapper.h"
#include "ansiCharPanel.h"
#include "clipboardHistoryPanel.h"
@@ -2726,7 +2723,7 @@ void Notepad_plus::setupColorSampleBitmapsOnMainMenuItems()
// Adds tab colour icons
for (int i = 0; i < 5; ++i)
{
- COLORREF colour = nppParam.getIndividualTabColor(i, NppDarkMode::isDarkMenuEnabled(), true);
+ COLORREF colour = nppParam.getIndividualTabColor(i, NppDarkMode::isEnabled(), true);
HBITMAP hBitmap = generateSolidColourMenuItemIcon(colour);
SetMenuItemBitmaps(_mainMenuHandle, IDM_VIEW_TAB_COLOUR_1 + i, MF_BYCOMMAND, hBitmap, hBitmap);
}
diff --git a/PowerEditor/src/NppBigSwitch.cpp b/PowerEditor/src/NppBigSwitch.cpp
index 4f5b7fefc..9343ab368 100644
--- a/PowerEditor/src/NppBigSwitch.cpp
+++ b/PowerEditor/src/NppBigSwitch.cpp
@@ -23,7 +23,6 @@
#include
#include "Notepad_plus_Window.h"
#include "TaskListDlg.h"
-#include "ImageListSet.h"
#include "ShortcutMapper.h"
#include "ansiCharPanel.h"
#include "clipboardHistoryPanel.h"
@@ -212,21 +211,16 @@ LRESULT Notepad_plus_Window::runProc(HWND hwnd, UINT message, WPARAM wParam, LPA
try
{
NppDarkMode::setDarkTitleBar(hwnd);
+ NppDarkMode::autoSubclassWindowMenuBar(hwnd);
+ NppDarkMode::autoSubclassCtlColor(hwnd);
_notepad_plus_plus_core._pPublicInterface = this;
LRESULT lRet = _notepad_plus_plus_core.init(hwnd);
if (NppDarkMode::isEnabled() && NppDarkMode::isExperimentalSupported())
{
- RECT rcClient;
- GetWindowRect(hwnd, &rcClient);
-
// Inform application of the frame change.
- SetWindowPos(hwnd,
- NULL,
- rcClient.left, rcClient.top,
- rcClient.right - rcClient.left, rcClient.bottom - rcClient.top,
- SWP_FRAMECHANGED);
+ ::SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
}
SetOSAppRestart();
@@ -263,50 +257,14 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
LRESULT result = FALSE;
NppParameters& nppParam = NppParameters::getInstance();
- if (NppDarkMode::isDarkMenuEnabled() && NppDarkMode::isEnabled() && NppDarkMode::runUAHWndProc(hwnd, message, wParam, lParam, &result))
- {
- return result;
- }
-
switch (message)
{
case WM_NCACTIVATE:
{
// Note: lParam is -1 to prevent endless loops of calls
::SendMessage(_dockingManager.getHSelf(), WM_NCACTIVATE, wParam, -1);
- result = ::DefWindowProc(hwnd, message, wParam, lParam);
- if (NppDarkMode::isDarkMenuEnabled() && NppDarkMode::isEnabled())
- {
- NppDarkMode::drawUAHMenuNCBottomLine(hwnd);
- }
-
NppDarkMode::calculateTreeViewStyle();
- return result;
- }
-
- case WM_NCPAINT:
- {
- result = ::DefWindowProc(hwnd, message, wParam, lParam);
- if (NppDarkMode::isDarkMenuEnabled() && NppDarkMode::isEnabled())
- {
- NppDarkMode::drawUAHMenuNCBottomLine(hwnd);
- }
- return result;
- }
-
- case WM_ERASEBKGND:
- {
- if (NppDarkMode::isEnabled())
- {
- RECT rc{};
- GetClientRect(hwnd, &rc);
- ::FillRect(reinterpret_cast(wParam), &rc, NppDarkMode::getDlgBackgroundBrush());
- return 0;
- }
- else
- {
- return ::DefWindowProc(hwnd, message, wParam, lParam);
- }
+ return ::DefWindowProc(hwnd, message, wParam, lParam);
}
case WM_SETTINGCHANGE:
diff --git a/PowerEditor/src/NppDarkMode.cpp b/PowerEditor/src/NppDarkMode.cpp
index 79f0f39d9..d110391bf 100644
--- a/PowerEditor/src/NppDarkMode.cpp
+++ b/PowerEditor/src/NppDarkMode.cpp
@@ -21,16 +21,15 @@
#include "DarkMode/UAHMenuBar.h"
#include
+#include
#include
#include
+#include
+
#include "Parameters.h"
-#include "resource.h"
#include "dpiManagerV2.h"
-
-#include
-
-#include
+#include "resource.h"
#ifdef __GNUC__
#include
@@ -190,7 +189,7 @@ namespace NppDarkMode
};
// black (default)
- static const Colors darkColors{
+ static constexpr Colors darkColors{
HEXRGB(0x202020), // background
HEXRGB(0x383838), // softerBackground
HEXRGB(0x454545), // hotBackground
@@ -205,11 +204,11 @@ namespace NppDarkMode
HEXRGB(0x484848) // disabledEdgeColor
};
- constexpr int offsetEdge = HEXRGB(0x1C1C1C);
+ static constexpr int offsetEdge = HEXRGB(0x1C1C1C);
// red tone
- constexpr int offsetRed = HEXRGB(0x100000);
- static const Colors darkRedColors{
+ static constexpr int offsetRed = HEXRGB(0x100000);
+ static constexpr Colors darkRedColors{
darkColors.background + offsetRed,
darkColors.softerBackground + offsetRed,
darkColors.hotBackground + offsetRed,
@@ -225,8 +224,8 @@ namespace NppDarkMode
};
// green tone
- constexpr int offsetGreen = HEXRGB(0x001000);
- static const Colors darkGreenColors{
+ static constexpr int offsetGreen = HEXRGB(0x001000);
+ static constexpr Colors darkGreenColors{
darkColors.background + offsetGreen,
darkColors.softerBackground + offsetGreen,
darkColors.hotBackground + offsetGreen,
@@ -242,8 +241,8 @@ namespace NppDarkMode
};
// blue tone
- constexpr int offsetBlue = HEXRGB(0x000020);
- static const Colors darkBlueColors{
+ static constexpr int offsetBlue = HEXRGB(0x000020);
+ static constexpr Colors darkBlueColors{
darkColors.background + offsetBlue,
darkColors.softerBackground + offsetBlue,
darkColors.hotBackground + offsetBlue,
@@ -259,8 +258,8 @@ namespace NppDarkMode
};
// purple tone
- constexpr int offsetPurple = HEXRGB(0x100020);
- static const Colors darkPurpleColors{
+ static constexpr int offsetPurple = HEXRGB(0x100020);
+ static constexpr Colors darkPurpleColors{
darkColors.background + offsetPurple,
darkColors.softerBackground + offsetPurple,
darkColors.hotBackground + offsetPurple,
@@ -276,8 +275,8 @@ namespace NppDarkMode
};
// cyan tone
- constexpr int offsetCyan = HEXRGB(0x001020);
- static const Colors darkCyanColors{
+ static constexpr int offsetCyan = HEXRGB(0x001020);
+ static constexpr Colors darkCyanColors{
darkColors.background + offsetCyan,
darkColors.softerBackground + offsetCyan,
darkColors.hotBackground + offsetCyan,
@@ -293,8 +292,8 @@ namespace NppDarkMode
};
// olive tone
- constexpr int offsetOlive = HEXRGB(0x101000);
- static const Colors darkOliveColors{
+ static constexpr int offsetOlive = HEXRGB(0x101000);
+ static constexpr Colors darkOliveColors{
darkColors.background + offsetOlive,
darkColors.softerBackground + offsetOlive,
darkColors.hotBackground + offsetOlive,
@@ -310,9 +309,9 @@ namespace NppDarkMode
};
// customized
- Colors darkCustomizedColors{ darkColors };
+ static Colors darkCustomizedColors{ darkColors };
- ColorTone g_colorToneChoice = blackTone;
+ static ColorTone g_colorToneChoice = blackTone;
void setDarkTone(ColorTone colorToneChoice)
{
@@ -339,15 +338,15 @@ namespace NppDarkMode
}
};
- Theme tDefault(darkColors);
- Theme tR(darkRedColors);
- Theme tG(darkGreenColors);
- Theme tB(darkBlueColors);
- Theme tP(darkPurpleColors);
- Theme tC(darkCyanColors);
- Theme tO(darkOliveColors);
+ static Theme tDefault(darkColors);
+ static Theme tR(darkRedColors);
+ static Theme tG(darkGreenColors);
+ static Theme tB(darkBlueColors);
+ static Theme tP(darkPurpleColors);
+ static Theme tC(darkCyanColors);
+ static Theme tO(darkOliveColors);
- Theme tCustom(darkCustomizedColors);
+ static Theme tCustom(darkCustomizedColors);
static Theme& getTheme()
@@ -385,10 +384,9 @@ namespace NppDarkMode
static Options configuredOptions()
{
- NppGUI nppGui = NppParameters::getInstance().getNppGUI();
+ const NppGUI& nppGui = NppParameters::getInstance().getNppGUI();
Options opt;
opt.enable = nppGui._darkmode._isEnabled;
- opt.enableMenubar = opt.enable;
opt.enablePlugin = nppGui._darkmode._isEnabledPlugin;
g_colorToneChoice = nppGui._darkmode._colorTone;
@@ -465,7 +463,6 @@ namespace NppDarkMode
NppGUI& nppGUI = nppParam.getNppGUI();
nppGUI._darkmode._isEnabled = NppDarkMode::isDarkModeReg() && !IsHighContrast();
_options.enable = nppGUI._darkmode._isEnabled;
- _options.enableMenubar = _options.enable;
}
setDarkMode(_options.enable, true);
@@ -496,12 +493,6 @@ namespace NppDarkMode
setDarkMode(_options.enable, _options.enable);
}
- if (_options.enableMenubar != config.enableMenubar)
- {
- supportedChanged = true;
- _options.enableMenubar = config.enableMenubar;
- }
-
// other options not supported to change at runtime currently
if (!supportedChanged && !forceRefresh)
@@ -532,11 +523,6 @@ namespace NppDarkMode
return _options.enablePlugin;
}
- bool isDarkMenuEnabled()
- {
- return _options.enableMenubar;
- }
-
bool isExperimentalActive()
{
return g_darkModeEnabled;
@@ -899,10 +885,10 @@ namespace NppDarkMode
{
DWORD data{};
DWORD dwBufSize = sizeof(data);
- LPCTSTR lpSubKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize";
- LPCTSTR lpValue = L"AppsUseLightTheme";
+ static constexpr LPCWSTR lpSubKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize";
+ static constexpr LPCWSTR lpValue = L"AppsUseLightTheme";
- auto result = RegGetValue(HKEY_CURRENT_USER, lpSubKey, lpValue, RRF_RT_REG_DWORD, nullptr, &data, &dwBufSize);
+ const auto result = ::RegGetValueW(HKEY_CURRENT_USER, lpSubKey, lpValue, RRF_RT_REG_DWORD, nullptr, &data, &dwBufSize);
if (result != ERROR_SUCCESS)
{
return false;
@@ -912,206 +898,6 @@ namespace NppDarkMode
return data == 0UL;
}
- // processes messages related to UAH / custom menubar drawing.
- // return true if handled, false to continue with normal processing in your wndproc
- bool runUAHWndProc(HWND hWnd, UINT message, WPARAM /*wParam*/, LPARAM lParam, LRESULT* lr)
- {
- static HTHEME g_menuTheme = nullptr;
-
- switch (message)
- {
- case WM_UAHDRAWMENU:
- {
- auto pUDM = reinterpret_cast(lParam);
- RECT rc{};
-
- // get the menubar rect
- {
- MENUBARINFO mbi{};
- mbi.cbSize = sizeof(MENUBARINFO);
- GetMenuBarInfo(hWnd, OBJID_MENU, 0, &mbi);
-
- RECT rcWindow{};
- GetWindowRect(hWnd, &rcWindow);
-
- // the rcBar is offset by the window rect
- rc = mbi.rcBar;
- OffsetRect(&rc, -rcWindow.left, -rcWindow.top);
-
- rc.top -= 1;
- }
-
- FillRect(pUDM->hdc, &rc, NppDarkMode::getDlgBackgroundBrush());
-
- *lr = 0;
-
- return true;
- }
-
- case WM_UAHDRAWMENUITEM:
- {
- auto pUDMI = reinterpret_cast(lParam);
-
- // get the menu item string
- wchar_t menuString[256] = { '\0' };
- MENUITEMINFO mii{};
- {
- mii.cbSize = sizeof(MENUITEMINFO);
- mii.fMask = MIIM_STRING;
- mii.dwTypeData = menuString;
- mii.cch = (sizeof(menuString) / 2) - 1;
-
- GetMenuItemInfo(pUDMI->um.hmenu, pUDMI->umi.iPosition, TRUE, &mii);
- }
-
- // get the item state for drawing
-
- DWORD dwFlags = DT_CENTER | DT_SINGLELINE | DT_VCENTER;
-
- int iTextStateID = MBI_NORMAL;
- int iBackgroundStateID = MBI_NORMAL;
- {
- if (pUDMI->dis.itemState & ODS_SELECTED)
- {
- // clicked
- iTextStateID = MBI_PUSHED;
- iBackgroundStateID = MBI_PUSHED;
- }
- else if (pUDMI->dis.itemState & ODS_HOTLIGHT)
- {
- // hot tracking
- iTextStateID = (pUDMI->dis.itemState & ODS_INACTIVE) ? MBI_DISABLEDHOT : MBI_HOT;
- iBackgroundStateID = MBI_HOT;
- }
- else if ((pUDMI->dis.itemState & ODS_GRAYED) || (pUDMI->dis.itemState & ODS_DISABLED) || (pUDMI->dis.itemState & ODS_INACTIVE))
- {
- // disabled / grey text / inactive
- iTextStateID = MBI_DISABLED;
- iBackgroundStateID = MBI_DISABLED;
- }
- else if (pUDMI->dis.itemState & ODS_DEFAULT)
- {
- // normal display
- iTextStateID = MBI_NORMAL;
- iBackgroundStateID = MBI_NORMAL;
- }
-
- if (pUDMI->dis.itemState & ODS_NOACCEL)
- {
- dwFlags |= DT_HIDEPREFIX;
- }
- }
-
- if (!g_menuTheme)
- {
- g_menuTheme = OpenThemeData(hWnd, VSCLASS_MENU);
- }
-
- switch (iBackgroundStateID)
- {
- case MBI_NORMAL:
- case MBI_DISABLED:
- {
- ::FillRect(pUDMI->um.hdc, &pUDMI->dis.rcItem, NppDarkMode::getDlgBackgroundBrush());
- break;
- }
-
- case MBI_HOT:
- case MBI_DISABLEDHOT:
- {
- ::FillRect(pUDMI->um.hdc, &pUDMI->dis.rcItem, NppDarkMode::getHotBackgroundBrush());
- break;
- }
-
- case MBI_PUSHED:
- case MBI_DISABLEDPUSHED:
- {
- ::FillRect(pUDMI->um.hdc, &pUDMI->dis.rcItem, NppDarkMode::getCtrlBackgroundBrush());
- break;
- }
-
- default:
- {
- ::DrawThemeBackground(g_menuTheme, pUDMI->um.hdc, MENU_BARITEM, iBackgroundStateID, &pUDMI->dis.rcItem, nullptr);
- break;
- }
- }
-
- DTTOPTS dttopts{};
- dttopts.dwSize = sizeof(DTTOPTS);
- dttopts.dwFlags = DTT_TEXTCOLOR;
- switch (iTextStateID)
- {
- case MBI_NORMAL:
- case MBI_HOT:
- case MBI_PUSHED:
- {
- dttopts.crText = NppDarkMode::getTextColor();
- break;
- }
-
- case MBI_DISABLED:
- case MBI_DISABLEDHOT:
- case MBI_DISABLEDPUSHED:
- {
- dttopts.crText = NppDarkMode::getDisabledTextColor();
- break;
- }
- }
-
- ::DrawThemeTextEx(g_menuTheme, pUDMI->um.hdc, MENU_BARITEM, iTextStateID, menuString, mii.cch, dwFlags, &pUDMI->dis.rcItem, &dttopts);
-
- *lr = 0;
-
- return true;
- }
-
- case WM_DPICHANGED:
- case WM_DPICHANGED_AFTERPARENT:
- case WM_THEMECHANGED:
- {
- if (g_menuTheme)
- {
- CloseThemeData(g_menuTheme);
- g_menuTheme = nullptr;
- }
- // continue processing in main wndproc
- return false;
- }
- default:
- return false;
- }
- }
-
- void drawUAHMenuNCBottomLine(HWND hWnd)
- {
- MENUBARINFO mbi{};
- mbi.cbSize = sizeof(MENUBARINFO);
- if (!GetMenuBarInfo(hWnd, OBJID_MENU, 0, &mbi))
- {
- return;
- }
-
- RECT rcClient{};
- GetClientRect(hWnd, &rcClient);
- MapWindowPoints(hWnd, nullptr, (POINT*)&rcClient, 2);
-
- RECT rcWindow{};
- GetWindowRect(hWnd, &rcWindow);
-
- OffsetRect(&rcClient, -rcWindow.left, -rcWindow.top);
-
- // the rcBar is offset by the window rect
- RECT rcAnnoyingLine = rcClient;
- rcAnnoyingLine.bottom = rcAnnoyingLine.top;
- rcAnnoyingLine.top--;
-
-
- HDC hdc = GetWindowDC(hWnd);
- FillRect(hdc, &rcAnnoyingLine, NppDarkMode::getDlgBackgroundBrush());
- ReleaseDC(hWnd, hdc);
- }
-
// from DarkMode.h
void initExperimentalDarkMode()
@@ -3317,8 +3103,6 @@ namespace NppDarkMode
NppDarkMode::subclassCustomBorderForListBoxAndEditControls(hwnd);
}
-#ifndef __MINGW64__ // mingw build for 64 bit has issue with GetWindowSubclass, it is undefined
-
bool changed = false;
if (::GetWindowSubclass(hwnd, CustomBorderSubclass, static_cast(SubclassID::darkMode), nullptr) == TRUE)
{
@@ -3341,8 +3125,6 @@ namespace NppDarkMode
{
::SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
}
-
-#endif // !__MINGW64__
}
void subclassAndThemeListView(HWND hwnd, NppDarkModeParams p)
@@ -4171,6 +3953,249 @@ namespace NppDarkMode
SetWindowSubclass(hwnd, WindowNotifySubclass, static_cast(SubclassID::darkMode), 0);
}
+ static void paintMenuBar(HWND hWnd, HDC hdc)
+ {
+ // get the menubar rect
+ MENUBARINFO mbi{};
+ mbi.cbSize = sizeof(MENUBARINFO);
+ ::GetMenuBarInfo(hWnd, OBJID_MENU, 0, &mbi);
+
+ RECT rcWindow{};
+ ::GetWindowRect(hWnd, &rcWindow);
+
+ // the rcBar is offset by the window rect
+ RECT rcBar{ mbi.rcBar };
+ ::OffsetRect(&rcBar, -rcWindow.left, -rcWindow.top);
+
+ rcBar.top -= 1;
+
+ ::FillRect(hdc, &rcBar, NppDarkMode::getDlgBackgroundBrush());
+ }
+
+ static void paintMenuBarItems(UAHDRAWMENUITEM& UDMI, const HTHEME& hTheme)
+ {
+ // get the menu item string
+ std::wstring buffer(MAX_PATH, L'\0');
+ MENUITEMINFO mii{};
+ mii.cbSize = sizeof(MENUITEMINFO);
+ mii.fMask = MIIM_STRING;
+ mii.dwTypeData = buffer.data();
+ mii.cch = MAX_PATH - 1;
+
+ ::GetMenuItemInfoW(UDMI.um.hmenu, static_cast(UDMI.umi.iPosition), TRUE, &mii);
+
+ // get the item state for drawing
+
+ DWORD dwFlags = DT_CENTER | DT_SINGLELINE | DT_VCENTER;
+
+ int iTextStateID = MBI_NORMAL;
+ int iBackgroundStateID = MBI_NORMAL;
+ if ((UDMI.dis.itemState & ODS_SELECTED) == ODS_SELECTED)
+ {
+ // clicked
+ iTextStateID = MBI_PUSHED;
+ iBackgroundStateID = MBI_PUSHED;
+ }
+ else if ((UDMI.dis.itemState & ODS_HOTLIGHT) == ODS_HOTLIGHT)
+ {
+ // hot tracking
+ iTextStateID = ((UDMI.dis.itemState & ODS_INACTIVE) == ODS_INACTIVE) ? MBI_DISABLEDHOT : MBI_HOT;
+ iBackgroundStateID = MBI_HOT;
+ }
+ else if (((UDMI.dis.itemState & ODS_GRAYED) == ODS_GRAYED)
+ || ((UDMI.dis.itemState & ODS_DISABLED) == ODS_DISABLED)
+ || ((UDMI.dis.itemState & ODS_INACTIVE) == ODS_INACTIVE))
+ {
+ // disabled / grey text / inactive
+ iTextStateID = MBI_DISABLED;
+ iBackgroundStateID = MBI_DISABLED;
+ }
+ else if ((UDMI.dis.itemState & ODS_DEFAULT) == ODS_DEFAULT)
+ {
+ // normal display
+ iTextStateID = MBI_NORMAL;
+ iBackgroundStateID = MBI_NORMAL;
+ }
+
+ if ((UDMI.dis.itemState & ODS_NOACCEL) == ODS_NOACCEL)
+ {
+ dwFlags |= DT_HIDEPREFIX;
+ }
+
+ switch (iBackgroundStateID)
+ {
+ case MBI_NORMAL:
+ case MBI_DISABLED:
+ {
+ ::FillRect(UDMI.um.hdc, &UDMI.dis.rcItem, NppDarkMode::getDlgBackgroundBrush());
+ break;
+ }
+
+ case MBI_HOT:
+ case MBI_DISABLEDHOT:
+ {
+ ::FillRect(UDMI.um.hdc, &UDMI.dis.rcItem, NppDarkMode::getHotBackgroundBrush());
+ break;
+ }
+
+ case MBI_PUSHED:
+ case MBI_DISABLEDPUSHED:
+ {
+ ::FillRect(UDMI.um.hdc, &UDMI.dis.rcItem, NppDarkMode::getCtrlBackgroundBrush());
+ break;
+ }
+
+ default:
+ {
+ ::DrawThemeBackground(hTheme, UDMI.um.hdc, MENU_BARITEM, iBackgroundStateID, &UDMI.dis.rcItem, nullptr);
+ break;
+ }
+ }
+
+ DTTOPTS dttopts{};
+ dttopts.dwSize = sizeof(DTTOPTS);
+ dttopts.dwFlags = DTT_TEXTCOLOR;
+ switch (iTextStateID)
+ {
+ case MBI_NORMAL:
+ case MBI_HOT:
+ case MBI_PUSHED:
+ {
+ dttopts.crText = NppDarkMode::getTextColor();
+ break;
+ }
+
+ case MBI_DISABLED:
+ case MBI_DISABLEDHOT:
+ case MBI_DISABLEDPUSHED:
+ {
+ dttopts.crText = NppDarkMode::getDisabledTextColor();
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+
+ ::DrawThemeTextEx(hTheme, UDMI.um.hdc, MENU_BARITEM, iTextStateID, buffer.c_str(), static_cast(mii.cch), dwFlags, &UDMI.dis.rcItem, &dttopts);
+ }
+
+ static void drawUAHMenuNCBottomLine(HWND hWnd)
+ {
+ MENUBARINFO mbi{};
+ mbi.cbSize = sizeof(MENUBARINFO);
+ if (::GetMenuBarInfo(hWnd, OBJID_MENU, 0, &mbi) == FALSE)
+ {
+ return;
+ }
+
+ RECT rcClient{};
+ ::GetClientRect(hWnd, &rcClient);
+ ::MapWindowPoints(hWnd, nullptr, reinterpret_cast(&rcClient), 2);
+
+ RECT rcWindow{};
+ ::GetWindowRect(hWnd, &rcWindow);
+
+ ::OffsetRect(&rcClient, -rcWindow.left, -rcWindow.top);
+
+ // the rcBar is offset by the window rect
+ RECT rcAnnoyingLine{ rcClient };
+ rcAnnoyingLine.bottom = rcAnnoyingLine.top;
+ rcAnnoyingLine.top--;
+
+
+ HDC hdc = ::GetWindowDC(hWnd);
+ ::FillRect(hdc, &rcAnnoyingLine, NppDarkMode::getDlgBackgroundBrush());
+ ::ReleaseDC(hWnd, hdc);
+ }
+
+ static LRESULT CALLBACK WindowMenuBarSubclass(
+ HWND hWnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam,
+ UINT_PTR uIdSubclass,
+ DWORD_PTR dwRefData
+ )
+ {
+ auto* pMenuThemeData = reinterpret_cast(dwRefData);
+
+ if (uMsg != WM_NCDESTROY && (!NppDarkMode::isEnabled() || !pMenuThemeData->ensureTheme(hWnd)))
+ {
+ return ::DefSubclassProc(hWnd, uMsg, wParam, lParam);
+ }
+
+ switch (uMsg)
+ {
+ case WM_NCDESTROY:
+ {
+ ::RemoveWindowSubclass(hWnd, WindowMenuBarSubclass, uIdSubclass);
+ delete pMenuThemeData;
+ break;
+ }
+
+ case WM_UAHDRAWMENU:
+ {
+ auto* pUDM = reinterpret_cast(lParam);
+ paintMenuBar(hWnd, pUDM->hdc);
+
+ return 0;
+ }
+
+ case WM_UAHDRAWMENUITEM:
+ {
+ auto* pUDMI = reinterpret_cast(lParam);
+ paintMenuBarItems(*pUDMI, pMenuThemeData->_hTheme);
+
+ return 0;
+ }
+
+#if 0 // for debugging
+ case WM_UAHMEASUREMENUITEM:
+ {
+ auto* pMMI = reinterpret_cast(lParam);
+ return ::DefSubclassProc(hWnd, uMsg, wParam, lParam);
+ }
+#endif
+
+ case WM_DPICHANGED:
+ case WM_DPICHANGED_AFTERPARENT:
+ case WM_THEMECHANGED:
+ {
+ pMenuThemeData->closeTheme();
+ break;
+ }
+
+ case WM_NCACTIVATE:
+ case WM_NCPAINT:
+ {
+ const LRESULT retVal = ::DefSubclassProc(hWnd, uMsg, wParam, lParam);
+ drawUAHMenuNCBottomLine(hWnd);
+ return retVal;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+ return ::DefSubclassProc(hWnd, uMsg, wParam, lParam);
+ }
+
+ void autoSubclassWindowMenuBar(HWND hWnd)
+ {
+ if (::GetWindowSubclass(hWnd, WindowMenuBarSubclass, static_cast(SubclassID::darkMode), nullptr) == FALSE)
+ {
+ auto pMenuThemeData = std::make_unique(VSCLASS_MENU);
+ if (::SetWindowSubclass(hWnd, WindowMenuBarSubclass, static_cast(SubclassID::darkMode), reinterpret_cast(pMenuThemeData.get())) == TRUE)
+ {
+ static_cast(pMenuThemeData.release());
+ }
+ }
+ }
+
void setDarkTitleBar(HWND hwnd)
{
constexpr DWORD win10Build2004 = 19041;
diff --git a/PowerEditor/src/NppDarkMode.h b/PowerEditor/src/NppDarkMode.h
index 676d772b4..accd0a7c1 100644
--- a/PowerEditor/src/NppDarkMode.h
+++ b/PowerEditor/src/NppDarkMode.h
@@ -44,7 +44,6 @@ namespace NppDarkMode
struct Options
{
bool enable = false;
- bool enableMenubar = false;
bool enablePlugin = false;
};
@@ -90,7 +89,6 @@ namespace NppDarkMode
void initAdvancedOptions();
bool isEnabled();
- bool isDarkMenuEnabled();
bool isEnabledForPlugins();
bool isExperimentalActive();
bool isExperimentalSupported();
@@ -176,11 +174,6 @@ namespace NppDarkMode
void handleSettingChange(HWND hwnd, LPARAM lParam, bool isFromBtn = false);
bool isDarkModeReg();
- // processes messages related to UAH / custom menubar drawing.
- // return true if handled, false to continue with normal processing in your wndproc
- bool runUAHWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT* lr);
- void drawUAHMenuNCBottomLine(HWND hWnd);
-
// from DarkMode.h
void initExperimentalDarkMode();
void setDarkMode(bool useDark, bool fixDarkScrollbar);
@@ -216,6 +209,7 @@ namespace NppDarkMode
ULONG autoSubclassAndThemePlugin(HWND hwnd, ULONG dmFlags);
void autoSubclassCtlColor(HWND hWnd);
void autoSubclassAndThemeWindowNotify(HWND hwnd);
+ void autoSubclassWindowMenuBar(HWND hWnd);
void setDarkTitleBar(HWND hwnd);
void setDarkExplorerTheme(HWND hwnd);
diff --git a/PowerEditor/src/NppNotification.cpp b/PowerEditor/src/NppNotification.cpp
index 3ccff483e..c2d6ad5f0 100644
--- a/PowerEditor/src/NppNotification.cpp
+++ b/PowerEditor/src/NppNotification.cpp
@@ -20,7 +20,7 @@
#include "functionListPanel.h"
#include "xmlMatchedTagsHighlighter.h"
#include "VerticalFileSwitcher.h"
-#include "ProjectPanel.h"
+#include "NppDarkMode.h"
#include "documentMap.h"
#include "Common.h"
#include
@@ -1077,7 +1077,7 @@ BOOL Notepad_plus::notify(SCNotification *notification)
// Adds colour icons
for (int i = 0; i < 5; ++i)
{
- COLORREF colour = nppParam.getIndividualTabColor(i, NppDarkMode::isDarkMenuEnabled(), true);
+ COLORREF colour = nppParam.getIndividualTabColor(i, NppDarkMode::isEnabled(), true);
HBITMAP hBitmap = generateSolidColourMenuItemIcon(colour);
SetMenuItemBitmaps(_tabPopupMenu.getMenuHandle(), IDM_VIEW_TAB_COLOUR_1 + i, MF_BYCOMMAND, hBitmap, hBitmap);
}