diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index f3ebb227e..3e0724f88 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -106,9 +106,7 @@ bool CanAccessPath(LPCWSTR lpIniFilePath, DWORD genericAccessRights) // check for read-only file attribute if (genericAccessRights & GENERIC_WRITE) { - DWORD const dwFileAttributes = GetFileAttributes(lpIniFilePath); - if ((dwFileAttributes == INVALID_FILE_ATTRIBUTES) || (dwFileAttributes & FILE_ATTRIBUTE_READONLY)) - { + if (IsReadOnly(GetFileAttributes(lpIniFilePath))) { return false; } } @@ -2146,10 +2144,10 @@ void CmdSaveSettingsNow() } if (Globals.bCanSaveIniFile && SaveAllSettings(true)) { InfoBoxLng(MB_ICONINFORMATION, L"MsgSaveSettingsInfo", IDS_MUI_SAVEDSETTINGS); - if (dwFileAttributes != 0) { + if ((dwFileAttributes != 0) && (dwFileAttributes != INVALID_FILE_ATTRIBUTES)) { SetFileAttributes(Globals.IniFile, dwFileAttributes); // reset - Globals.bCanSaveIniFile = CanAccessPath(Globals.IniFile, GENERIC_WRITE); } + Globals.bCanSaveIniFile = CanAccessPath(Globals.IniFile, GENERIC_WRITE); } else { Globals.dwLastError = GetLastError(); diff --git a/src/Dialogs.c b/src/Dialogs.c index c9f963067..e5db0c16a 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -803,30 +803,33 @@ INT_PTR CALLBACK AboutDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam case WM_PAINT: { - HDC const hDC = GetWindowDC(hwnd); + HDC const hdc = GetWindowDC(hwnd); + SetMapMode(hdc, MM_TEXT); int const iconSize = 128; int const dpiWidth = ScaleIntByDPI(iconSize, dpi.x); int const dpiHeight = ScaleIntByDPI(iconSize, dpi.y); HICON const hicon = (dpiHeight > 128) ? Globals.hDlgIcon256 : Globals.hDlgIcon128; if (hicon) { - DrawIconEx(hDC, ScaleIntByDPI(22, dpi.x), ScaleIntByDPI(44, dpi.x), hicon, dpiWidth, dpiHeight, 0, NULL, DI_NORMAL); + DrawIconEx(hdc, ScaleIntByDPI(22, dpi.x), ScaleIntByDPI(44, dpi.x), hicon, dpiWidth, dpiHeight, 0, NULL, DI_NORMAL); } // --- larger bold condensed version string - if (hVersionFont) { DeleteObject(hVersionFont); } - hVersionFont = GetStockObject(DEFAULT_GUI_FONT); - LOGFONT lf; GetObject(hVersionFont, sizeof(LOGFONT), &lf); - int const newWidth = -MulDiv(MulDiv(lf.lfWidth, 3, 2), GetDeviceCaps(hDC, LOGPIXELSX), 72); - int const newHeight = -MulDiv(MulDiv(lf.lfHeight, 3, 2), GetDeviceCaps(hDC, LOGPIXELSY), 72); - lf.lfWeight = FW_BOLD; - lf.lfWidth = ScaleIntByDPI(newWidth, dpi.x); // =0: the aspect ratio of the device is matched against the digitization aspect ratio of the available fonts - lf.lfHeight = ScaleIntByDPI(newHeight, dpi.y); - //~StringCchCopy(lf.lfFaceName, LF_FACESIZE, L"Tahoma"); - hVersionFont = CreateFontIndirect(&lf); - SendDlgItemMessage(hwnd, IDC_VERSION, WM_SETFONT, (WPARAM)hVersionFont, true); + NONCLIENTMETRICSW ncMetrics = {0}; + ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW); + if (SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncMetrics, 0)) + { + if (hVersionFont) { + DeleteObject(hVersionFont); + } + int const verFontSize = ScaleIntByDPI(14, dpi.y); + ncMetrics.lfMessageFont.lfWeight = FW_BOLD; + ncMetrics.lfMessageFont.lfHeight = -MulDiv(verFontSize, GetDeviceCaps(hdc, LOGPIXELSY), 72); + hVersionFont = CreateFontIndirectW(&ncMetrics.lfMessageFont); + SendDlgItemMessage(hwnd, IDC_VERSION, WM_SETFONT, (WPARAM)hVersionFont, true); + } - ReleaseDC(hwnd, hDC); + ReleaseDC(hwnd, hdc); } return 0; @@ -4667,27 +4670,28 @@ static void _GetIconInfo(HICON hIcon, int* width, int* height, WORD* bitsPerPix) // ConvertIconToBitmap() // cx/cy = 0 => use resource width/height // -HBITMAP ConvertIconToBitmap(HWND hwnd, const HICON hIcon, const int cx, const int cy) +HBITMAP ConvertIconToBitmap(const HICON hIcon, const int cx, const int cy) { - UNUSED(hwnd); int wdc = cx; int hdc = cy; if ((cx == 0) || (cy == 0)) { _GetIconInfo(hIcon, &wdc, &hdc, NULL); } - HDC const hScreenDC = GetDC(NULL); + // increase & condense size + wdc <<= 4; hdc <<= 4; + + HDC const hScreenDC = GetDC(NULL); HBITMAP const hbmpTmp = CreateCompatibleBitmap(hScreenDC, wdc, hdc); - HDC const hMemDC = CreateCompatibleDC(hScreenDC); - HBITMAP const hOldBmp = SelectObject(hMemDC, hbmpTmp); - DrawIconEx(hMemDC, 0, 0, hIcon, cx, cy, 0, NULL, DI_NORMAL /*&~DI_DEFAULTSIZE*/ ); + HDC const hMemDC = CreateCompatibleDC(hScreenDC); + HBITMAP const hOldBmp = SelectObject(hMemDC, hbmpTmp); + DrawIconEx(hMemDC, 0, 0, hIcon, wdc, hdc, 0, NULL, DI_NORMAL /*&~DI_DEFAULTSIZE*/); SelectObject(hMemDC, hOldBmp); - HBITMAP const hDibBmp = (HBITMAP)CopyImage((HANDLE)hbmpTmp, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_CREATEDIBSECTION); + UINT const copyFlags = LR_COPYDELETEORG | LR_COPYRETURNORG | LR_DEFAULTSIZE | LR_CREATEDIBSECTION; + HBITMAP const hDibBmp = (HBITMAP)CopyImage((HANDLE)hbmpTmp, IMAGE_BITMAP, cx, cy, copyFlags); - DeleteObject(hbmpTmp); DeleteDC(hMemDC); ReleaseDC(NULL, hScreenDC); - return hDibBmp; } @@ -4697,7 +4701,8 @@ HBITMAP ConvertIconToBitmap(HWND hwnd, const HICON hIcon, const int cx, const in // HBITMAP ResampleIconToBitmap(HWND hwnd, const HICON hIcon, const int cx, const int cy) { - HBITMAP const hBmp = ConvertIconToBitmap(hwnd, hIcon, 0, 0); + //~return ConvertIconToBitmap(hwnd, hIcon, cx, cy); + HBITMAP const hBmp = ConvertIconToBitmap(hIcon, 0, 0); return ResampleImageBitmap(hwnd, hBmp, cx, cy); } @@ -4720,7 +4725,7 @@ void SetUACIcon(HWND hwnd, const HMENU hMenu, const UINT nItem) MENUITEMINFO mii = { 0 }; mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_BITMAP; - mii.hbmpItem = ConvertIconToBitmap(hwnd, Globals.hIconMsgShieldSmall, cx, cy); + mii.hbmpItem = ConvertIconToBitmap(Globals.hIconMsgShieldSmall, cx, cy); SetMenuItemInfo(hMenu, nItem, FALSE, &mii); } bInitialized = true; @@ -4731,32 +4736,37 @@ void SetUACIcon(HWND hwnd, const HMENU hMenu, const UINT nItem) // // UpdateWindowLayoutForDPI() // -void UpdateWindowLayoutForDPI(HWND hwnd, const RECT* pRC, const DPI_T* pDPI) +inline WRCT_T _ConvWinRectW(const RECT* pRC) +{ + WRCT_T wrc; + wrc.left = pRC->left; + wrc.top = pRC->top; + wrc.right = pRC->right; + wrc.bottom = pRC->bottom; + return wrc; +} + +void UpdateWindowLayoutForDPI(HWND hwnd, const RECT* prc, const DPI_T* pdpi) { UINT const uWndFlags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED; //~ SWP_NOMOVE | SWP_NOSIZE | SWP_NOREPOSITION - if (pRC) { - SetWindowPos(hwnd, NULL, pRC->left, pRC->top, (pRC->right - pRC->left), (pRC->bottom - pRC->top), uWndFlags); + + if (prc) { + SetWindowPos(hwnd, NULL, prc->left, prc->top, (prc->right - prc->left), (prc->bottom - prc->top), uWndFlags); return; } - DPI_T const wndDPI = pDPI ? *pDPI : Scintilla_GetWindowDPI(hwnd); + DPI_T const dpi = pdpi ? *pdpi : Scintilla_GetWindowDPI(hwnd); - RECT rc; - GetWindowRect(hwnd, &rc); + RECT rc; GetWindowRect(hwnd, &rc); //~MapWindowPoints(NULL, hWnd, (LPPOINT)&rc, 2); - LONG const width = rc.right - rc.left; - LONG const height = rc.bottom - rc.top; - int const dpiScaledX = MulDiv(rc.left, wndDPI.x, USER_DEFAULT_SCREEN_DPI); - int const dpiScaledY = MulDiv(rc.top, wndDPI.y, USER_DEFAULT_SCREEN_DPI); - int const dpiScaledWidth = MulDiv(width, wndDPI.x, USER_DEFAULT_SCREEN_DPI); - int const dpiScaledHeight = MulDiv(height, wndDPI.y, USER_DEFAULT_SCREEN_DPI); - - SetWindowPos(hwnd, NULL, dpiScaledX, dpiScaledY, dpiScaledWidth, dpiScaledHeight, uWndFlags); + WRCT_T wrc = _ConvWinRectW(prc); + Scintilla_AdjustWindowRectForDpi(&wrc, uWndFlags, 0, dpi); + SetWindowPos(hwnd, NULL, wrc.left, wrc.top, (wrc.right - wrc.left), (wrc.bottom - wrc.top), uWndFlags); } //============================================================================= // -// ResampleImageBitmap() +// ResampleImageBitmap() (resample_delete_orig) // if width|height <= 0 : scale bitmap to current dpi // HBITMAP ResampleImageBitmap(HWND hwnd, HBITMAP hbmp, int width, int height) @@ -4770,12 +4780,12 @@ HBITMAP ResampleImageBitmap(HWND hwnd, HBITMAP hbmp, int width, int height) height = ScaleIntByDPI(bmp.bmHeight, dpi.y); } if (((LONG)width != bmp.bmWidth) || ((LONG)height != bmp.bmHeight)) { -#if FALSE - //HBITMAP hCopy = CopyImage(hbmp, IMAGE_BITMAP, width, height, LR_CREATEDIBSECTION | LR_COPYRETURNORG | LR_COPYDELETEORG); -#else +#if TRUE HDC const hdc = GetDC(hwnd); HBITMAP hCopy = CreateResampledBitmap(hdc, hbmp, width, height, BMP_RESAMPLE_FILTER); ReleaseDC(hwnd, hdc); +#else + HBITMAP hCopy = CopyImage(hbmp, IMAGE_BITMAP, width, height, LR_CREATEDIBSECTION | LR_COPYRETURNORG | LR_COPYDELETEORG); #endif if (hCopy && (hCopy != hbmp)) { DeleteObject(hbmp); @@ -4804,7 +4814,7 @@ LRESULT SendWMSize(HWND hwnd, RECT* rc) //============================================================================= -#if 0 +#if FALSE void Handle_WM_PAINT(HWND hwnd) { static HFONT hVersionFont = NULL; diff --git a/src/Dialogs.h b/src/Dialogs.h index e8313af58..1163ac68d 100644 --- a/src/Dialogs.h +++ b/src/Dialogs.h @@ -152,7 +152,7 @@ inline unsigned LargeIconDPI() { return (unsigned)MulDiv(USER_DEFAULT_SCREEN_DPI // ---------------------------------------------------------------------------- -HBITMAP ConvertIconToBitmap(HWND hwnd, const HICON hIcon, const int cx, const int cy); +HBITMAP ConvertIconToBitmap(const HICON hIcon, const int cx, const int cy); HBITMAP ResampleIconToBitmap(HWND hwnd, const HICON hIcon, const int cx, const int cy); void SetUACIcon(HWND hwnd, const HMENU hMenu, const UINT nItem); void UpdateWindowLayoutForDPI(HWND hwnd, const RECT* pRC, const DPI_T* pDPI); diff --git a/src/Edit.c b/src/Edit.c index 56cc60375..fe137d994 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -7942,37 +7942,56 @@ static INT_PTR CALLBACK EditModifyLinesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam { static PMODLINESDATA pdata; - static int id_hover; - static int id_capture; + static unsigned id_hover = 0; + static unsigned id_capture = 0; + + static HFONT hFontNormal = NULL; + static HFONT hFontHover = NULL; static HCURSOR hCursorNormal; static HCURSOR hCursorHover; switch(umsg) { - static HFONT hFontHover; - case WM_INITDIALOG: { id_hover = 0; id_capture = 0; SetDialogIconNP3(hwnd); + HDC const hdc = GetWindowDC(hwnd); - static HFONT hFontNormal; - if (NULL == (hFontNormal = (HFONT)SendDlgItemMessage(hwnd, 200, WM_GETFONT, 0, 0))) { - hFontNormal = GetStockObject(DEFAULT_GUI_FONT); + hFontNormal = (HFONT)SendDlgItemMessage(hwnd, 200, WM_GETFONT, 0, 0); + if (hFontNormal) { + LOGFONT lf; + GetObject(hFontNormal, sizeof(LOGFONT), &lf); + lf.lfUnderline = true; + //lf.lfWeight = FW_BOLD; + if (hFontHover) { + DeleteObject(hFontHover); + } + hFontHover = CreateFontIndirectW(&lf); + } + else { + NONCLIENTMETRICSW ncMetrics = {0}; + ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW); + if (SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncMetrics, 0)) { + int const hoverFontSize = ScaleIntToDPI_Y(hwnd, 10); + //ncMetrics.lfMessageFont.lfWeight = FW_BOLD; + ncMetrics.lfMessageFont.lfUnderline = true; + ncMetrics.lfMessageFont.lfHeight = -MulDiv(hoverFontSize, GetDeviceCaps(hdc, LOGPIXELSY), 72); + if (hFontHover) { + DeleteObject(hFontHover); + } + hFontHover = CreateFontIndirectW(&ncMetrics.lfMessageFont); + } } - LOGFONT lf; - GetObject(hFontNormal,sizeof(LOGFONT),&lf); - lf.lfUnderline = true; - hFontHover = CreateFontIndirect(&lf); hCursorNormal = LoadCursor(NULL,IDC_ARROW); hCursorHover = LoadCursor(NULL,IDC_HAND); - if (!hCursorHover) + if (!hCursorHover) { hCursorHover = LoadCursor(Globals.hInstance, IDC_ARROW); - + } pdata = (PMODLINESDATA)lParam; SetDlgItemTextW(hwnd,100,pdata->pwsz1); SendDlgItemMessage(hwnd,100,EM_LIMITTEXT,255,0); @@ -7987,9 +8006,21 @@ static INT_PTR CALLBACK EditModifyLinesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam DPI_T dpi; dpi.x = LOWORD(wParam); dpi.y = HIWORD(wParam); + + hFontNormal = (HFONT)SendDlgItemMessage(hwnd, 200, WM_GETFONT, 0, 0); + if (hFontNormal) { + LOGFONT lf; + GetObject(hFontNormal, sizeof(LOGFONT), &lf); + lf.lfUnderline = true; + //lf.lfWeight = FW_BOLD; + if (hFontHover) { + DeleteObject(hFontHover); + } + hFontHover = CreateFontIndirectW(&lf); + } UpdateWindowLayoutForDPI(hwnd, (RECT*)lParam, &dpi); } - return true; + return !0; case WM_DESTROY: DeleteObject(hFontHover); @@ -8003,7 +8034,7 @@ static INT_PTR CALLBACK EditModifyLinesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam id_capture = 0; } } - return false; + return 0; case WM_CTLCOLORSTATIC: { @@ -8018,7 +8049,8 @@ static INT_PTR CALLBACK EditModifyLinesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam else { SetTextColor(hdc, RGB(0, 0, 0xFF)); } - SelectObject(hdc,/*dwId == id_hover?*/hFontHover/*:hFontNormal*/); + SelectObject(hdc,hFontHover); + //SelectObject(hdc, (dwId == id_hover) ? hFontHover : hFontNormal); return (INT_PTR)GetSysColorBrush(COLOR_BTNFACE); } } @@ -8045,7 +8077,7 @@ static INT_PTR CALLBACK EditModifyLinesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam else { id_hover = 0; } - SetCursor(id_hover != 0 ? hCursorHover : hCursorNormal); + SetCursor((id_hover != 0) ? hCursorHover : hCursorNormal); } } break; @@ -8062,7 +8094,7 @@ static INT_PTR CALLBACK EditModifyLinesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam id_hover = dwId; id_capture = dwId; } - SetCursor(id_hover != 0?hCursorHover:hCursorNormal); + SetCursor((id_hover != 0) ? hCursorHover : hCursorNormal); } break; @@ -8086,7 +8118,7 @@ static INT_PTR CALLBACK EditModifyLinesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam } id_capture = 0; } - SetCursor(id_hover != 0?hCursorHover:hCursorNormal); + SetCursor((id_hover != 0) ? hCursorHover : hCursorNormal); } break; @@ -8112,9 +8144,9 @@ static INT_PTR CALLBACK EditModifyLinesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam EndDialog(hwnd,IDCANCEL); break; } - return true; + return !0; } - return false; + return 0; } diff --git a/src/Helpers.h b/src/Helpers.h index c370f6cd6..fb82ff79a 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -585,6 +585,10 @@ inline HRESULT PathCchCanonicalize(PWSTR p,size_t l,PCWSTR a) { UNUSED(l); re inline HRESULT PathCchRenameExtension(PWSTR p,size_t l,PCWSTR a) { UNUSED(l); return (PathRenameExtension(p,a) ? S_OK : E_FAIL); } inline HRESULT PathCchRemoveFileSpec(PWSTR p,size_t l) { UNUSED(l); return (PathRemoveFileSpec(p) ? S_OK : E_FAIL); } +inline bool IsReadOnly(const DWORD dwFileAttr) { + return ((dwFileAttr != INVALID_FILE_ATTRIBUTES) && (dwFileAttr & FILE_ATTRIBUTE_READONLY)); +} + // ---------------------------------------------------------------------------- #endif //_NP3_HELPERS_H_ diff --git a/src/Notepad3.c b/src/Notepad3.c index 4a922c0d5..063a0a741 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -3702,10 +3702,9 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) else { InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_READONLY_MODIFY, PathFindFileName(Globals.CurrentFile)); } - dwFileAttributes = GetFileAttributes(Globals.CurrentFile); - s_bFileReadOnly = (dwFileAttributes == INVALID_FILE_ATTRIBUTES) || (dwFileAttributes & FILE_ATTRIBUTE_READONLY); - + s_bFileReadOnly = IsReadOnly(GetFileAttributes(Globals.CurrentFile)); // ensure setting + if (Flags.bSettingsFileSoftLocked) { Globals.bCanSaveIniFile = CanAccessPath(Globals.IniFile, GENERIC_WRITE); UpdateSaveSettingsCmds(); @@ -9348,9 +9347,8 @@ bool FileIO(bool fLoad,LPWSTR pszFileName, fSuccess = EditSaveFile(Globals.hwndEdit, pszFileName, status, bSaveCopy, bPreserveTimeStamp); } - DWORD const dwFileAttributes = GetFileAttributes(pszFileName); - s_bFileReadOnly = ((dwFileAttributes == INVALID_FILE_ATTRIBUTES) || (dwFileAttributes & FILE_ATTRIBUTE_READONLY)); - + s_bFileReadOnly = IsReadOnly(GetFileAttributes(pszFileName)); + EndWaitCursor(); return(fSuccess); @@ -9951,8 +9949,7 @@ bool FileSave(bool bSaveAlways, bool bAsk, bool bSaveAs, bool bSaveCopy, bool bP // Read only... if (!bSaveAs && !bSaveCopy && StrIsNotEmpty(Globals.CurrentFile)) { - DWORD const dwFileAttributes = GetFileAttributes(Globals.CurrentFile); - s_bFileReadOnly = (dwFileAttributes == INVALID_FILE_ATTRIBUTES) || (dwFileAttributes & FILE_ATTRIBUTE_READONLY); + s_bFileReadOnly = IsReadOnly(GetFileAttributes(Globals.CurrentFile)); if (s_bFileReadOnly) { INT_PTR const answer = (Settings.MuteMessageBeep) ? InfoBoxLng(MB_YESNO | MB_ICONWARNING, NULL, IDS_MUI_READONLY_SAVE, PathFindFileName(Globals.CurrentFile)) : diff --git a/src/Styles.c b/src/Styles.c index 703847deb..3c4c8e237 100644 --- a/src/Styles.c +++ b/src/Styles.c @@ -4104,7 +4104,9 @@ INT_PTR CALLBACK Style_CustomizeSchemesDlgProc(HWND hwnd, UINT umsg, WPARAM wPar case WM_PAINT: { - HDC const hDC = GetWindowDC(hwnd); + HDC const hdc = GetWindowDC(hwnd); + SetMapMode(hdc, MM_TEXT); + DPI_T const dpi = Scintilla_GetWindowDPI(hwnd); int const iconSize = 64; @@ -4113,23 +4115,25 @@ INT_PTR CALLBACK Style_CustomizeSchemesDlgProc(HWND hwnd, UINT umsg, WPARAM wPar HICON const hicon = (dpiHeight > 128) ? Globals.hDlgIconPrefs256 : ((dpiHeight > 64) ? Globals.hDlgIconPrefs128 : Globals.hDlgIconPrefs64); if (hicon) { - DrawIconEx(hDC, ScaleIntByDPI(340, dpi.x), ScaleIntByDPI(62, dpi.x), hicon, dpiWidth, dpiHeight, 0, NULL, DI_NORMAL); + DrawIconEx(hdc, ScaleIntByDPI(340, dpi.x), ScaleIntByDPI(62, dpi.x), hicon, dpiWidth, dpiHeight, 0, NULL, DI_NORMAL); } // Set title font - if (hFontTitle) { DeleteObject(hFontTitle); } - hFontTitle = GetStockObject(DEFAULT_GUI_FONT); - LOGFONT lf; GetObject(hFontTitle, sizeof(LOGFONT), &lf); - int const newWidth = -MulDiv(MulDiv(lf.lfWidth,3,2), GetDeviceCaps(hDC, LOGPIXELSX), 72); - int const newHeight = -MulDiv(MulDiv(lf.lfHeight,3,2), GetDeviceCaps(hDC, LOGPIXELSY), 72); - lf.lfWeight = FW_BOLD; - lf.lfWidth = ScaleIntByDPI(newWidth, dpi.x); // =0: the aspect ratio of the device is matched against the digitization aspect ratio of the available fonts - lf.lfHeight = ScaleIntByDPI(newHeight, dpi.y); - //~StringCchCopy(lf.lfFaceName, LF_FACESIZE, L"Tahoma"); - hFontTitle = CreateFontIndirect(&lf); - SendDlgItemMessage(hwnd, IDC_TITLE, WM_SETFONT, (WPARAM)hFontTitle, true); + NONCLIENTMETRICSW ncMetrics = {0}; + ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW); + if (SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncMetrics, 0)) + { + if (hFontTitle) { + DeleteObject(hFontTitle); + } + int const verFontSize = ScaleIntByDPI(16, dpi.y); + ncMetrics.lfMessageFont.lfWeight = FW_BOLD; + ncMetrics.lfMessageFont.lfHeight = -MulDiv(verFontSize, GetDeviceCaps(hdc, LOGPIXELSY), 72); + hFontTitle = CreateFontIndirectW(&ncMetrics.lfMessageFont); + SendDlgItemMessage(hwnd, IDC_TITLE, WM_SETFONT, (WPARAM)hFontTitle, true); + } - ReleaseDC(hwnd, hDC); + ReleaseDC(hwnd, hdc); } return 0;