diff options
author | George Hazan <ghazan@miranda.im> | 2022-08-15 21:48:21 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2022-08-15 21:48:21 +0300 |
commit | 78d9faca5242838c8d6f5476fd90f7484a63b7c4 (patch) | |
tree | c5941189cb7b25781fbc767cd02852a5ebd19cd8 /src/mir_core | |
parent | 092ca1a988e83bed078e077bc20d80abf0d5eabd (diff) |
if possible, we use UxTheme.dll to get a theme font
Diffstat (limited to 'src/mir_core')
-rw-r--r-- | src/mir_core/src/Windows/diatheme.cpp | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/src/mir_core/src/Windows/diatheme.cpp b/src/mir_core/src/Windows/diatheme.cpp index ca368f2632..2c16131643 100644 --- a/src/mir_core/src/Windows/diatheme.cpp +++ b/src/mir_core/src/Windows/diatheme.cpp @@ -18,24 +18,55 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "../stdafx.h" #include "diatheme.h" -// The following code was borrowed from Notepad++ sources and adapted for Miranda NG +// The following code was borrowed from Notepad2 sources and adapted for Miranda NG + +typedef HTHEME (WINAPI *OTD)(HWND hwnd,LPCWSTR pszClassList); +typedef HRESULT (WINAPI *GTSF)(HTHEME hTheme,int iFontId,LOGFONT *plf); +typedef HRESULT (WINAPI *CTD)(HTHEME hTheme); BOOL GetThemedDialogFont(LPWSTR lpFaceName, WORD *wSize) { + BOOL bSucceed = FALSE; + HDC hDC = GetDC(nullptr); int iLogPixelsY = GetDeviceCaps(hDC, LOGPIXELSY); ReleaseDC(nullptr, hDC); - NONCLIENTMETRICS ncm; - ncm.cbSize = sizeof(NONCLIENTMETRICS); - SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0); - if (ncm.lfMessageFont.lfHeight < 0) - ncm.lfMessageFont.lfHeight = -ncm.lfMessageFont.lfHeight; - *wSize = (WORD)MulDiv(ncm.lfMessageFont.lfHeight, 72, iLogPixelsY); - if (*wSize == 0) - *wSize = 8; - - wcsncpy_s(lpFaceName, LF_FACESIZE, ncm.lfMessageFont.lfFaceName, _TRUNCATE); + if (HMODULE hModUxTheme = GetModuleHandle(L"uxtheme.dll")) { + OTD _OpenThemeData = (OTD)GetProcAddress(hModUxTheme, "OpenThemeData"); + GTSF _GetThemeSysFont = (GTSF)GetProcAddress(hModUxTheme, "GetThemeSysFont"); + CTD _CloseThemeData = (CTD)GetProcAddress(hModUxTheme, "CloseThemeData"); + + if (_CloseThemeData && _GetThemeSysFont && _OpenThemeData) { + if (HTHEME hTheme = _OpenThemeData(NULL, L"WINDOWSTYLE;WINDOW")) { + LOGFONT lf; + if (S_OK == _GetThemeSysFont(hTheme,/*TMT_MSGBOXFONT*/805, &lf)) { + if (lf.lfHeight < 0) + lf.lfHeight = -lf.lfHeight; + *wSize = (WORD)MulDiv(lf.lfHeight, 72, iLogPixelsY); + if (*wSize == 0) + *wSize = 8; + wcsncpy_s(lpFaceName, LF_FACESIZE, lf.lfFaceName, _TRUNCATE); + bSucceed = TRUE; + } + _CloseThemeData(hTheme); + } + } + } + + if (!bSucceed) { + NONCLIENTMETRICS ncm; + ncm.cbSize = sizeof(NONCLIENTMETRICS); + SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0); + if (ncm.lfMessageFont.lfHeight < 0) + ncm.lfMessageFont.lfHeight = -ncm.lfMessageFont.lfHeight; + *wSize = (WORD)MulDiv(ncm.lfMessageFont.lfHeight, 72, iLogPixelsY); + if (*wSize == 0) + *wSize = 8; + + wcsncpy_s(lpFaceName, LF_FACESIZE, ncm.lfMessageFont.lfFaceName, _TRUNCATE); + } + return TRUE; } |