From 424d6b799b2514456888f9adebdb1c58be2dda7b Mon Sep 17 00:00:00 2001 From: RaiKoHoff Date: Wed, 29 Jul 2020 19:36:06 +0200 Subject: [PATCH] + chg: DPI-Aware About & Custom.Scheme dialog --- language/np3_de_de/dialogs_de_de.rc | 53 +++++------ language/np3_en_us/dialogs_en_us.rc | 51 +++++------ res/rizonesoft.bmp | Bin 18272 -> 108054 bytes src/Dialogs.c | 133 +++++++++++++++++++++------- src/Dialogs.h | 6 +- src/Edit.c | 25 ++++-- src/Notepad3.c | 2 +- src/Styles.c | 80 +++++++++-------- 8 files changed, 221 insertions(+), 129 deletions(-) diff --git a/language/np3_de_de/dialogs_de_de.rc b/language/np3_de_de/dialogs_de_de.rc index c67b248a2..c083a0aa7 100644 --- a/language/np3_de_de/dialogs_de_de.rc +++ b/language/np3_de_de/dialogs_de_de.rc @@ -53,22 +53,23 @@ END // Dialog // -IDD_MUI_ABOUT DIALOGEX 0, 0, 400, 274 +IDD_MUI_ABOUT DIALOGEX 0, 0, 400, 284 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_NOFAILCREATE | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Über Notepad3" FONT 9, "Segoe UI", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",IDOK,330,256,50,14 - EDITTEXT IDC_VERSION,80,7,220,14,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Scintilla Bibliothek Ver:",IDC_SCI_VERSION,80,24,219,8 - LTEXT "Kompiliert mit:",IDC_COMPILER,80,35,218,8 - LTEXT "IDC_COPYRIGHT",IDC_COPYRIGHT,80,52,218,8 - LTEXT "IDC_TRANSL_AUTH",IDC_TRANSL_AUTH,80,64,218,8 - LTEXT "",IDC_WEBPAGE2,190,55,100,8,NOT WS_VISIBLE | WS_DISABLED - CONTROL "",IDC_WEBPAGE,"SysLink",WS_TABSTOP,200,52,100,10 - CONTROL IDR_RIZBITMAP,IDC_RIZONEBMP,"Static",SS_BITMAP | SS_NOTIFY | SS_CENTERIMAGE | SS_REALSIZECONTROL,300,7,84,24,WS_EX_TRANSPARENT - PUSHBUTTON "Kopiere Versions Text",IDC_COPYVERSTRG,304,35,76,14,BS_FLAT - CONTROL "",IDC_RICHEDITABOUT,RICHEDIT_CONTROL_VER,WS_VSCROLL | WS_HSCROLL | WS_TABSTOP | 0x29c4,20,80,360,170 + DEFPUSHBUTTON "OK",IDOK,330,266,50,14 + EDITTEXT IDC_VERSION,80,10,220,24,ES_CENTER | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + LTEXT "Scintilla Bibliothek Ver:",IDC_SCI_VERSION,80,34,219,8 + LTEXT "Kompiliert mit:",IDC_COMPILER,80,45,218,8 + LTEXT "IDC_COPYRIGHT",IDC_COPYRIGHT,80,62,218,8 + LTEXT "IDC_TRANSL_AUTH",IDC_TRANSL_AUTH,80,74,218,8 + LTEXT "",IDC_WEBPAGE2,190,65,100,8,NOT WS_VISIBLE | WS_DISABLED + CONTROL "",IDC_WEBPAGE,"SysLink",WS_TABSTOP,200,62,100,10 + //CONTROL IDR_RIZBITMAP,IDC_RIZONEBMP,"Static",SS_BITMAP | SS_NOTIFY,304,10,0,0,WS_EX_TRANSPARENT + CONTROL IDR_RIZBITMAP,IDC_RIZONEBMP,"Static",SS_BITMAP | SS_NOTIFY | SS_REALSIZECONTROL,304,10,78,23,WS_EX_TRANSPARENT + PUSHBUTTON "Kopiere Versions Text",IDC_COPYVERSTRG,304,45,76,14,BS_FLAT + CONTROL "",IDC_RICHEDITABOUT,RICHEDIT_CONTROL_VER,WS_VSCROLL | WS_HSCROLL | WS_TABSTOP | 0x29c4,20,90,360,170 END IDD_MUI_CMDLINEHELP DIALOGEX 0, 0, 300, 210 @@ -307,19 +308,19 @@ BEGIN EDITTEXT IDC_STYLEEDIT_ROOT,181,152,279,12,ES_AUTOHSCROLL LTEXT "",IDC_STYLELABEL,181,171,279,8 EDITTEXT IDC_STYLEEDIT,181,183,279,12,ES_AUTOHSCROLL - PUSHBUTTON "&Farbe...",IDC_STYLEFORE,181,201,41,14 - PUSHBUTTON "&Grund...",IDC_STYLEBACK,227,201,41,14 - PUSHBUTTON "&Schriftart...",IDC_STYLEFONT,273,201,52,14 + PUSHBUTTON "&Farbe...",IDC_STYLEFORE,181,201,46,14 + PUSHBUTTON "&Grund...",IDC_STYLEBACK,232,201,46,14 + PUSHBUTTON "&Schriftart...",IDC_STYLEFONT,283,201,52,14 PUSHBUTTON "&Vorschau",IDC_PREVIEW,330,201,42,14 PUSHBUTTON "&Standard",IDC_STYLEDEFAULT,377,201,42,14 PUSHBUTTON "",IDC_PREVSTYLE,426,201,15,14 PUSHBUTTON "",IDC_NEXTSTYLE,445,201,15,14 - PUSHBUTTON "&Importieren...",IDC_IMPORT,181,233,60,14 - PUSHBUTTON "E&xportieren...",IDC_EXPORT,246,233,60,14 - DEFPUSHBUTTON "OK",IDOK,355,233,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,410,233,50,14 - GROUPBOX "Information",IDC_INFO_GROUPBOX,180,7,280,127 - LTEXT "Syntax Schemata anpassen",IDC_TITLE,264,25,180,12 + PUSHBUTTON "&Importieren...",IDC_IMPORT,181,232,60,14 + PUSHBUTTON "E&xportieren...",IDC_EXPORT,246,232,60,14 + DEFPUSHBUTTON "OK",IDOK,355,232,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,410,232,50,14 + GROUPBOX "Information",IDC_INFO_GROUPBOX,181,7,280,127 + LTEXT "Syntax Schemata anpassen",IDC_TITLE,240,20,180,24,SS_CENTERIMAGE EDITTEXT IDC_STYLEEDIT_HELP,197,54,252,74,ES_MULTILINE | ES_READONLY | NOT WS_BORDER END @@ -710,11 +711,11 @@ GUIDELINES DESIGNINFO BEGIN IDD_MUI_ABOUT, DIALOG BEGIN - LEFTMARGIN, 4 - VERTGUIDE, 19 - VERTGUIDE, 340 + LEFTMARGIN, 7 + RIGHTMARGIN, 386 + VERTGUIDE, 7 TOPMARGIN, 7 - BOTTOMMARGIN, 270 + BOTTOMMARGIN, 277 END IDD_MUI_FIND, DIALOG @@ -811,7 +812,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 460 TOPMARGIN, 7 - BOTTOMMARGIN, 247 + BOTTOMMARGIN, 246 END IDD_MUI_TABSETTINGS, DIALOG diff --git a/language/np3_en_us/dialogs_en_us.rc b/language/np3_en_us/dialogs_en_us.rc index 54572daab..c50919c7c 100644 --- a/language/np3_en_us/dialogs_en_us.rc +++ b/language/np3_en_us/dialogs_en_us.rc @@ -53,22 +53,23 @@ END // Dialog // -IDD_MUI_ABOUT DIALOGEX 0, 0, 400, 274 +IDD_MUI_ABOUT DIALOGEX 0, 0, 400, 284 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_NOFAILCREATE | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Notepad3" FONT 9, "Segoe UI", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",IDOK,330,256,50,14 - EDITTEXT IDC_VERSION,80,7,220,14,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "Scintilla Library Version:",IDC_SCI_VERSION,80,24,219,8 - LTEXT "Build with:",IDC_COMPILER,80,35,218,8 - LTEXT "IDC_COPYRIGHT",IDC_COPYRIGHT,80,52,218,8 - LTEXT "IDC_TRANSL_AUTH",IDC_TRANSL_AUTH,80,64,218,8 - LTEXT "",IDC_WEBPAGE2,190,55,100,8,NOT WS_VISIBLE | WS_DISABLED - CONTROL "",IDC_WEBPAGE,"SysLink",WS_TABSTOP,200,52,100,10 - CONTROL IDR_RIZBITMAP,IDC_RIZONEBMP,"Static",SS_BITMAP | SS_NOTIFY | SS_CENTERIMAGE | SS_REALSIZECONTROL,300,7,84,24,WS_EX_TRANSPARENT - PUSHBUTTON "Copy Version Text",IDC_COPYVERSTRG,304,35,76,14,BS_FLAT - CONTROL "",IDC_RICHEDITABOUT,RICHEDIT_CONTROL_VER,WS_VSCROLL | WS_HSCROLL | WS_TABSTOP | 0x29c4,20,80,360,170 + DEFPUSHBUTTON "OK",IDOK,330,266,50,14 + EDITTEXT IDC_VERSION,80,10,220,24, ES_CENTER | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + LTEXT "Scintilla Library Version:",IDC_SCI_VERSION,80,34,219,8 + LTEXT "Build with:",IDC_COMPILER,80,45,218,8 + LTEXT "IDC_COPYRIGHT",IDC_COPYRIGHT,80,62,218,8 + LTEXT "IDC_TRANSL_AUTH",IDC_TRANSL_AUTH,80,74,218,8 + LTEXT "",IDC_WEBPAGE2,190,65,100,8,NOT WS_VISIBLE | WS_DISABLED + CONTROL "",IDC_WEBPAGE,"SysLink",WS_TABSTOP,200,62,100,10 + //CONTROL IDR_RIZBITMAP,IDC_RIZONEBMP,"Static",SS_BITMAP | SS_NOTIFY,304,10,0,0,WS_EX_TRANSPARENT + CONTROL IDR_RIZBITMAP,IDC_RIZONEBMP,"Static",SS_BITMAP | SS_NOTIFY | SS_REALSIZECONTROL,304,10,78,23,WS_EX_TRANSPARENT + PUSHBUTTON "Copy Version Text",IDC_COPYVERSTRG,304,45,76,14,BS_FLAT + CONTROL "",IDC_RICHEDITABOUT,RICHEDIT_CONTROL_VER,WS_VSCROLL | WS_HSCROLL | WS_TABSTOP | 0x29c4,20,90,360,170 END IDD_MUI_CMDLINEHELP DIALOGEX 0, 0, 300, 210 @@ -298,11 +299,11 @@ BEGIN END IDD_MUI_STYLECONFIG DIALOGEX 0, 0, 467, 254 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Customize Schemes" FONT 9, "Segoe UI", 400, 0, 0x1 BEGIN - CONTROL "",IDC_STYLELIST,"SysTreeView32",TVS_SHOWSELALWAYS | TVS_SINGLEEXPAND | WS_BORDER | WS_HSCROLL | WS_TABSTOP,7,7,164,240 + CONTROL "",IDC_STYLELIST,"SysTreeView32",TVS_SHOWSELALWAYS | TVS_SINGLEEXPAND | WS_BORDER | WS_HSCROLL | WS_TABSTOP,7,7,164,239 LTEXT "",IDC_STYLELABEL_ROOT,181,141,279,8 EDITTEXT IDC_STYLEEDIT_ROOT,181,152,279,12,ES_AUTOHSCROLL LTEXT "",IDC_STYLELABEL,181,171,279,8 @@ -314,12 +315,12 @@ BEGIN PUSHBUTTON "&Reset",IDC_STYLEDEFAULT,377,201,42,14 PUSHBUTTON "",IDC_PREVSTYLE,426,201,15,14 PUSHBUTTON "",IDC_NEXTSTYLE,445,201,15,14 - PUSHBUTTON "&Import...",IDC_IMPORT,181,233,50,14 - PUSHBUTTON "E&xport...",IDC_EXPORT,237,233,50,14 - DEFPUSHBUTTON "OK",IDOK,355,233,50,14 - PUSHBUTTON "Cancel",IDCANCEL,410,233,50,14 + PUSHBUTTON "&Import...",IDC_IMPORT,181,232,50,14 + PUSHBUTTON "E&xport...",IDC_EXPORT,237,232,50,14 + DEFPUSHBUTTON "OK",IDOK,355,232,50,14 + PUSHBUTTON "Cancel",IDCANCEL,410,232,50,14 GROUPBOX "Info",IDC_INFO_GROUPBOX,181,7,280,127 - LTEXT "Customize Schemes",IDC_TITLE,264,25,180,12 + CTEXT "Customize Schemes",IDC_TITLE,240,20,180,24,SS_CENTERIMAGE EDITTEXT IDC_STYLEEDIT_HELP,197,54,252,74,ES_MULTILINE | ES_READONLY | NOT WS_BORDER END @@ -688,7 +689,7 @@ CAPTION "Font Chooser" FONT 9, "Segoe UI", 400, 0, 0x0 BEGIN LTEXT "&Font:",IDC_STATIC,7,7,127,8 - COMBOBOX IDC_FONT_FAMILY_NAMES,7,16,138,84,CBS_SIMPLE | CBS_AUTOHSCROLL | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FONT_FAMILY_NAMES,7,16,138,84,CBS_SIMPLE | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP LTEXT "F&ont Style:",IDC_STATIC,154,7,72,8 COMBOBOX IDC_FONT_FACE_NAMES,154,16,84,84,CBS_SIMPLE | WS_VSCROLL | WS_TABSTOP LTEXT "&Size:",IDC_STATIC,247,7,40,8 @@ -710,11 +711,11 @@ GUIDELINES DESIGNINFO BEGIN IDD_MUI_ABOUT, DIALOG BEGIN - LEFTMARGIN, 4 - VERTGUIDE, 19 - VERTGUIDE, 340 + LEFTMARGIN, 7 + RIGHTMARGIN, 386 + VERTGUIDE, 7 TOPMARGIN, 7 - BOTTOMMARGIN, 270 + BOTTOMMARGIN, 277 END IDD_MUI_FIND, DIALOG @@ -811,7 +812,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 460 TOPMARGIN, 7 - BOTTOMMARGIN, 247 + BOTTOMMARGIN, 246 END IDD_MUI_TABSETTINGS, DIALOG diff --git a/res/rizonesoft.bmp b/res/rizonesoft.bmp index fe4e34d9cdd909b3f179d808f82dbc8cfa268ac2..63927ed289fee6ff48dd9b83972c719987f94d5a 100644 GIT binary patch literal 108054 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 VzH|5fe=hDQgq{!2$(+F9{1X?mTJZn? diff --git a/src/Dialogs.c b/src/Dialogs.c index e23e101d2..18bdcf519 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -715,13 +715,22 @@ INT_PTR CALLBACK AboutDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam GetLngStringA(IDS_MUI_ABOUT_RTF_6, pAboutRes, COUNTOF(pAboutRes)); StringCchCatA(pAboutResource, COUNTOF(pAboutResource), pAboutRes); - // paint richedit box + // paint rich-edit box pAboutInfo = pAboutResource; EDITSTREAM editStreamIn = { (DWORD_PTR)&pAboutInfo, 0, _LoadRtfCallback }; SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_STREAMIN, SF_RTF, (LPARAM)&editStreamIn); + DPI_T const dpi = Scintilla_GetWindowDPI(hwnd); + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETZOOM, (WPARAM)dpi.y, (LPARAM)USER_DEFAULT_SCREEN_DPI); + CenterDlgInParent(hwnd, NULL); + // TODO: Handle initial DPI-Aware Bitmap drawing + //HWND const hCtrlBmp = GetDlgItem(hwnd, IDC_RIZONEBMP); + //if (hCtrlBmp) { + // UpdateWindowLayoutForDPI(hCtrlBmp, NULL, &dpi); + //} + //PostMessage(hwnd, WM_DPICHANGED, (WPARAM)NULL, (LPARAM)NULL); } break; @@ -733,27 +742,16 @@ INT_PTR CALLBACK AboutDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam { UpdateWindowLayoutForDPI(hwnd, (RECT*)lParam, NULL); - DPI_T dpi; + DPI_T dpi; dpi.x = LOWORD(wParam); dpi.y = HIWORD(wParam); - - SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETZOOM, (WPARAM)dpi.y, (LPARAM)USER_DEFAULT_SCREEN_DPI); - - //~~// get current richedit box format - //~~CHARFORMAT2 currentFormat; ZeroMemory(¤tFormat, sizeof(CHARFORMAT2)); currentFormat.cbSize = sizeof(CHARFORMAT2); - //~~currentFormat.dwMask = CFM_ALL2; // CFM_SIZE | CFM_FACE | CFM_CHARSET | CFM_LCID; CFM_ALL; CFM_ALL2; - //~~SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_GETCHARFORMAT, SCF_DEFAULT, (LPARAM)¤tFormat); - //~~ - //~~//CHARFORMAT dpiCharFmt; ZeroMemory(&dpiCharFmt, sizeof(CHARFORMAT)); dpiCharFmt.cbSize = sizeof(CHARFORMAT); - //~~//dpiCharFmt.dwMask = CFM_ALL; CFM_SIZE; //~ | CFM_FACE; - //~~CHARFORMAT2 dpiCharFmt = currentFormat; - //~~dpiCharFmt.yHeight = (currentFormat.yHeight == 180) ? ScaleIntToDPI_Y(hwnd, 180) : currentFormat.yHeight; // keep size - //~~//~StringCchCopy(dpiCharFmt.szFaceName, COUNTOF(dpiCharFmt.szFaceName), L"Segoe UI"); - //~~SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&dpiCharFmt); + if ((dpi.x == USER_DEFAULT_SCREEN_DPI) || (dpi.y == USER_DEFAULT_SCREEN_DPI)) { + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETZOOM, 0, 0); // rich edit problem + } } break; - +#if TRUE case WM_PAINT: { HDC const hDC = GetWindowDC(hwnd); @@ -767,24 +765,99 @@ INT_PTR CALLBACK AboutDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam } // --- larger bold condensed version string - int const height = -MulDiv(12, GetDeviceCaps(hDC, LOGPIXELSY), 72); if (hVersionFont) { DeleteObject(hVersionFont); } hVersionFont = GetStockObject(DEFAULT_GUI_FONT); LOGFONT lf; GetObject(hVersionFont, sizeof(LOGFONT), &lf); + int const newHeight = -MulDiv(MulDiv(lf.lfHeight, 3, 2), GetDeviceCaps(hDC, LOGPIXELSY), 72); lf.lfWeight = FW_BOLD; - lf.lfHeight = ScaleIntToDPI_Y(hwnd, height); - lf.lfWidth = 0; // the aspect ratio of the device is matched against the digitization aspect ratio of the available fonts - //StringCchCopy(lf.lfFaceName, LF_FACESIZE, L"Segoe UI"); + lf.lfHeight = ScaleIntToDPI_Y(hwnd, newHeight); + lf.lfWidth = ScaleIntToDPI_X(hwnd, 8); // =0: the aspect ratio of the device is matched against the digitization aspect ratio of the available fonts + StringCchCopy(lf.lfFaceName, LF_FACESIZE, L"Tahoma"); hVersionFont = CreateFontIndirect(&lf); SendDlgItemMessage(hwnd, IDC_VERSION, WM_SETFONT, (WPARAM)hVersionFont, true); ReleaseDC(hwnd, hDC); - - // rich edit control - SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETZOOM, 0, 0); } return 0; +#else + case WM_PAINT: + { + PAINTSTRUCT ps; + // Get a paint DC for current window. + // Paint DC contains the right scaling to match + // the monitor DPI where the window is located. + HDC hdc = BeginPaint(hwnd, &ps); + + RECT rect; + GetClientRect(hwnd, &rect); + + UINT cx = (rect.right - rect.left); + UINT cy = (rect.bottom - rect.top); + + // Create a compatible bitmap using paint DC. + // Compatible bitmap will be properly scaled in size internally and + // transparently to the app to match current monitor DPI where + // the window is located. + HBITMAP memBitmap = CreateCompatibleBitmap(hdc, cx, cy); + + // Create a compatible DC, even without a bitmap selected, + // compatible DC will inherit the paint DC GDI scaling + // matching the window monitor DPI. + HDC memDC = CreateCompatibleDC(hdc); + + // Selecting GDI scaled compatible bitmap in the + // GDI scaled compatible DC. + HBITMAP oldBitmap = (HBITMAP)SelectObject(memDC, memBitmap); + + // Setting some properties in the compatible GDI scaled DC. + if (hVersionFont) { + DeleteObject(hVersionFont); + } + hVersionFont = GetStockObject(DEFAULT_GUI_FONT); + + SetTextColor(memDC, GetSysColor(COLOR_INFOTEXT)); + SetBkMode(memDC, TRANSPARENT); + SelectObject(memDC, hVersionFont); + + // Drawing content on the compatible GDI scaled DC. + // If the monitor DPI was 150% or 200%, text internally will + // be draw at next integral scaling value, in current example + // 200%. + DrawText(memDC, ctx.balloonText, -1, &rect, + DT_NOCLIP | DT_LEFT | DT_NOPREFIX | DT_WORDBREAK); + + // Copying the content back from compatible DC to paint DC. + // Since both compatible DC and paint DC are GDI scaled, + // content is copied without any stretching thus preserving + // the quality of the rendering. + BitBlt(hdc, 0, 0, cx, cy, memDC, 0, 0); + + // Cleanup. + SelectObject(memDC, oldBitmap); + DeleteObject(memBitmap); + DeleteDC(memDC); + + // At this time the content is presented to the screen. + // DWM (Desktop Window Manager) will scale down if required the + // content to actual monitor DPI. + // If the monitor DPI is already an integral one, for example 200%, + // there would be no DWM down scaling. + // If the monitor DPI is 150%, DWM will scale down rendered content + // from 200% to 150%. + // While not a perfect solution, it's better to scale-down content + // instead of scaling-up since a lot of the details will be preserved + // during scale-down. + // The end result is that with GDI Scaling enabled, the content will + // look less blurry on screen and in case of monitors with DPI setting + // set to an integral value (200%, 300%) the vector based and text + // content will be rendered natively at the monitor DPI looking crisp + // on screen. + + EndPaint(hwnd, &ps); + } break; + +#endif case WM_NOTIFY: { @@ -4592,7 +4665,7 @@ void SetUACIcon(const HMENU hMenu, const UINT nItem) // // UpdateWindowLayoutForDPI() // -void UpdateWindowLayoutForDPI(HWND hWnd, RECT* pRC, DPI_T* pDPI) +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) { @@ -4604,13 +4677,13 @@ void UpdateWindowLayoutForDPI(HWND hWnd, RECT* pRC, DPI_T* pDPI) RECT rc; GetWindowRect(hWnd, &rc); - //MapWindowPoints(NULL, hWnd, (LPPOINT)&rc, 2); + //~MapWindowPoints(NULL, hWnd, (LPPOINT)&rc, 2); LONG const width = rc.right - rc.left; LONG const height = rc.bottom - rc.top; - int dpiScaledX = MulDiv(rc.left, wndDPI.x, USER_DEFAULT_SCREEN_DPI); - int dpiScaledY = MulDiv(rc.top, wndDPI.y, USER_DEFAULT_SCREEN_DPI); - int dpiScaledWidth = MulDiv(width, wndDPI.x, USER_DEFAULT_SCREEN_DPI); - int dpiScaledHeight = MulDiv(height, wndDPI.y, USER_DEFAULT_SCREEN_DPI); + 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); } diff --git a/src/Dialogs.h b/src/Dialogs.h index 4d25de86d..cf50ff0a0 100644 --- a/src/Dialogs.h +++ b/src/Dialogs.h @@ -129,9 +129,9 @@ inline int ScaleFloatToDPI_Y(HWND hwnd, float fVal) { DPI_T const dpi = Scintill HBITMAP ConvertIconToBitmap(const HICON hIcon, const int cx, const int cy); void SetUACIcon(const HMENU hMenu, const UINT nItem); -void UpdateWindowLayoutForDPI(HWND hWnd, RECT* pRC, DPI_T* pDPI); -//#define HandleDpiChangedMessage(hW, wP,lP) { DPI_T dpi; dpi.x = LOWORD(wP); dpi.y = HIWORD(wP); \ -// UpdateWindowLayoutForDPI(hW, (RECT*)lP, pRC, DPI_T* pDPI); } +void UpdateWindowLayoutForDPI(HWND hWnd, const RECT* pRC, const DPI_T* pDPI); +//#define HandleDpiChangedMessage(hW,wP,lP) { DPI_T dpi; dpi.x = LOWORD(wP); dpi.y = HIWORD(wP); \ +// UpdateWindowLayoutForDPI(hW, (RECT*)lP, &dpi); } HBITMAP ResizeImageForCurrentDPI(HWND hwnd, HBITMAP hbmp); LRESULT SendWMSize(HWND hwnd, RECT* rc); diff --git a/src/Edit.c b/src/Edit.c index 00bfcabac..907e41aeb 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -5891,8 +5891,13 @@ static INT_PTR CALLBACK EditFindReplaceDlgProc(HWND hwnd,UINT umsg,WPARAM wParam case WM_DPICHANGED: - UpdateWindowLayoutForDPI(hwnd, (RECT*)lParam, NULL); - return !0; // further processing + { + DPI_T dpi; + dpi.x = LOWORD(wParam); + dpi.y = HIWORD(wParam); + UpdateWindowLayoutForDPI(hwnd, (RECT*)lParam, &dpi); + } + return !0; // further processing case WM_ACTIVATE: @@ -7848,7 +7853,12 @@ static INT_PTR CALLBACK EditLinenumDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPA case WM_DPICHANGED: - UpdateWindowLayoutForDPI(hwnd, (RECT*)lParam, NULL); + { + DPI_T dpi; + dpi.x = LOWORD(wParam); + dpi.y = HIWORD(wParam); + UpdateWindowLayoutForDPI(hwnd, (RECT*)lParam, &dpi); + } return true; @@ -7993,8 +8003,13 @@ static INT_PTR CALLBACK EditModifyLinesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam return true; case WM_DPICHANGED: - UpdateWindowLayoutForDPI(hwnd, (RECT*)lParam, NULL); - return true; + { + DPI_T dpi; + dpi.x = LOWORD(wParam); + dpi.y = HIWORD(wParam); + UpdateWindowLayoutForDPI(hwnd, (RECT*)lParam, &dpi); + } + return true; case WM_DESTROY: DeleteObject(hFontHover); diff --git a/src/Notepad3.c b/src/Notepad3.c index 7ddf15092..51a2d726a 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -1216,7 +1216,7 @@ bool InitApplication(HINSTANCE hInstance) wc.hInstance = hInstance; wc.hIcon = Globals.hDlgIcon256; wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MUI_MAINMENU); wc.lpszClassName = s_wchWndClass; diff --git a/src/Styles.c b/src/Styles.c index 074439c1a..34ada71cb 100644 --- a/src/Styles.c +++ b/src/Styles.c @@ -3967,6 +3967,7 @@ static bool _ApplyDialogItemText(HWND hwnd, INT_PTR CALLBACK Style_CustomizeSchemesDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) { static HWND hwndTV; + static HFONT hFontTitle = NULL; static bool fDragging; static PEDITLEXER pCurrentLexer = NULL; static PEDITSTYLE pCurrentStyle = NULL; @@ -4070,15 +4071,11 @@ INT_PTR CALLBACK Style_CustomizeSchemesDlgProc(HWND hwnd, UINT umsg, WPARAM wPar bWarnedNoIniFile = false; - //UpdateWindowLayoutForDPI(hwnd, NULL, NULL); + //~UpdateWindowLayoutForDPI(hwnd, NULL, NULL); + PostMessage(hwnd, WM_DPICHANGED, (WPARAM)NULL, (LPARAM)NULL); } return !0; - case WM_ENABLE: - // modal child dialog should disable main window too - EnableWindow(Globals.hwndMain, (BOOL)wParam); - return !0; - case WM_PAINT: { HDC const hDC = GetWindowDC(hwnd); @@ -4093,48 +4090,40 @@ INT_PTR CALLBACK Style_CustomizeSchemesDlgProc(HWND hwnd, UINT umsg, WPARAM wPar } // Set title font - static HFONT hFontTitle = NULL; - int const height = -MulDiv(12, GetDeviceCaps(hDC, LOGPIXELSY), 72); - if (hFontTitle) - { - DeleteObject(hFontTitle); - } + if (hFontTitle) { DeleteObject(hFontTitle); } hFontTitle = GetStockObject(DEFAULT_GUI_FONT); - LOGFONT lf; - GetObject(hFontTitle, sizeof(LOGFONT), &lf); + LOGFONT lf; GetObject(hFontTitle, sizeof(LOGFONT), &lf); + int const newHeight = -MulDiv(MulDiv(lf.lfHeight,3,2), GetDeviceCaps(hDC, LOGPIXELSY), 72); lf.lfWeight = FW_BOLD; - lf.lfHeight = ScaleIntToDPI_Y(hwnd, height); - lf.lfWidth = 0; // the aspect ratio of the device is matched against the digitization aspect ratio of the available fonts - hFontTitle = CreateFontIndirect(&lf); + lf.lfHeight = ScaleIntToDPI_Y(hwnd, newHeight); + lf.lfWidth = ScaleIntToDPI_X(hwnd, 8); // =0: the aspect ratio of the device is matched against the digitization aspect ratio of the available fonts + StringCchCopy(lf.lfFaceName, LF_FACESIZE, L"Tahoma"); + hFontTitle = CreateFontIndirect(&lf); SendDlgItemMessage(hwnd, IDC_TITLE, WM_SETFONT, (WPARAM)hFontTitle, true); ReleaseDC(hwnd, hDC); } return 0; + case WM_ENABLE: + // modal child dialog should disable main window too + EnableWindow(Globals.hwndMain, (BOOL)wParam); + return !0; + case WM_ACTIVATE: DialogEnableControl(hwnd, IDC_PREVIEW, ((pCurrentLexer == s_pLexCurrent) || (pCurrentLexer == GetCurrentStdLexer()))); return !0; case WM_DESTROY: - { - DeleteBitmapButton(hwnd, IDC_STYLEFORE); - DeleteBitmapButton(hwnd, IDC_STYLEBACK); - DeleteBitmapButton(hwnd, IDC_PREVSTYLE); - DeleteBitmapButton(hwnd, IDC_NEXTSTYLE); - - // free old backup - int cnt = 0; - for (int iLexer = 0; iLexer < COUNTOF(g_pLexArray); ++iLexer) { - if (Style_StylesBackup[cnt]) - { - LocalFree(Style_StylesBackup[cnt]); // StrDup() - Style_StylesBackup[cnt] = NULL; - } - ++cnt; - int i = 0; - while (g_pLexArray[iLexer]->Styles[i].iStyle != -1) + DeleteBitmapButton(hwnd, IDC_STYLEFORE); + DeleteBitmapButton(hwnd, IDC_STYLEBACK); + DeleteBitmapButton(hwnd, IDC_PREVSTYLE); + DeleteBitmapButton(hwnd, IDC_NEXTSTYLE); + + // free old backup + int cnt = 0; + for (int iLexer = 0; iLexer < COUNTOF(g_pLexArray); ++iLexer) { if (Style_StylesBackup[cnt]) { @@ -4142,13 +4131,26 @@ INT_PTR CALLBACK Style_CustomizeSchemesDlgProc(HWND hwnd, UINT umsg, WPARAM wPar Style_StylesBackup[cnt] = NULL; } ++cnt; - ++i; + int i = 0; + while (g_pLexArray[iLexer]->Styles[i].iStyle != -1) + { + if (Style_StylesBackup[cnt]) + { + LocalFree(Style_StylesBackup[cnt]); // StrDup() + Style_StylesBackup[cnt] = NULL; + } + ++cnt; + ++i; + } } + if (hFontTitle) { + DeleteObject(hFontTitle); + hFontTitle = NULL; + } + pCurrentLexer = NULL; + pCurrentStyle = NULL; + iCurStyleIdx = -1; } - pCurrentLexer = NULL; - pCurrentStyle = NULL; - iCurStyleIdx = -1; - } return false; case WM_DPICHANGED: