+ try: fix AboutBox's RichEdit control DPI scale behavior

This commit is contained in:
Rainer Kottenhoff 2020-03-09 18:36:45 +01:00
parent 9cc4469f44
commit eaadd5efee
8 changed files with 66 additions and 58 deletions

View File

@ -1 +1 @@
2
3

View File

@ -3,7 +3,7 @@
<assemblyIdentity
name="Notepad3"
processorArchitecture="*"
version="5.20.309.2"
version="5.20.309.3"
type="win32"
/>
<description>Notepad3 RC3</description>

View File

@ -685,53 +685,65 @@ 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
pAboutInfo = pAboutResource;
EDITSTREAM editStreamIn = { (DWORD_PTR)&pAboutInfo, 0, _LoadRtfCallback };
SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_STREAMIN, SF_RTF, (LPARAM)&editStreamIn);
CenterDlgInParent(hwnd, NULL);
}
// fall-through
break;
case WM_DPICHANGED:
{
// get current richedit box format
CHARFORMAT2 currentFormat; ZeroMemory(&currentFormat, 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)&currentFormat);
UpdateWindowLayoutForDPI(hwnd, 0, 0, 0, 0);
// --- keep original font size ---
CHARFORMAT dpiCharFmt; ZeroMemory(&dpiCharFmt, sizeof(CHARFORMAT)); dpiCharFmt.cbSize = sizeof(CHARFORMAT);
dpiCharFmt.dwMask = CFM_SIZE; //~ | CFM_FACE;
dpiCharFmt.yHeight = currentFormat.yHeight; // keep size
//~StringCchCopy(dpiCharFmt.szFaceName, COUNTOF(dpiCharFmt.szFaceName), L"Consolas");
SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&dpiCharFmt);
DPI_T const dpi = GetCurrentDPI(hwnd);
SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETZOOM, (WPARAM)dpi.y, (LPARAM)USER_DEFAULT_SCREEN_DPI);
// --- larger bold version string
//~~// get current richedit box format
//~~CHARFORMAT2 currentFormat; ZeroMemory(&currentFormat, 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)&currentFormat);
//~~
//~~//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);
}
break;
case WM_PAINT:
{
if (Globals.hIcon128) {
int const iconSize = 128;
int const dpiScaledWidth = ScaleIntToDPI_X(hwnd, iconSize);
int const dpiScaledHeight = ScaleIntToDPI_Y(hwnd, iconSize);
HDC const hdc = GetWindowDC(hwnd);
DrawIconEx(hdc, ScaleIntToDPI_X(hwnd, 22), ScaleIntToDPI_Y(hwnd, 44),
Globals.hIcon128, dpiScaledWidth, dpiScaledHeight, 0, NULL, DI_NORMAL);
ReleaseDC(hwnd, hdc);
}
// --- larger bold condensed version string
if (hVersionFont) { DeleteObject(hVersionFont); }
if ((hVersionFont = (HFONT)SendDlgItemMessage(hwnd, IDC_VERSION, WM_GETFONT, 0, 0)) == NULL) {
hVersionFont = GetStockObject(DEFAULT_GUI_FONT);
}
LOGFONT lf; GetObject(hVersionFont, sizeof(LOGFONT), &lf);
lf.lfWeight = FW_BOLD;
lf.lfWidth = ScaleIntFontSizeW(hwnd, 8);
lf.lfHeight = ScaleIntFontSizeH(hwnd, 22);
// lf.lfQuality = ANTIALIASED_QUALITY;
lf.lfWidth = ScaleIntToDPI_X(hwnd, 8);
lf.lfHeight = ScaleIntToDPI_Y(hwnd, 22);
//StringCchCopy(lf.lfFaceName, LF_FACESIZE, L"Segoe UI");
hVersionFont = CreateFontIndirect(&lf);
SendDlgItemMessage(hwnd, IDC_VERSION, WM_SETFONT, (WPARAM)hVersionFont, true);
}
return true;
case WM_PAINT:
if (Globals.hIcon128) {
RECT rt;
GetWindowRect(hwnd, &rt);
HDC hdc = GetWindowDC(hwnd);
DrawIconEx(hdc, 22, 44, Globals.hIcon128, 128, 128, 0, NULL, DI_NORMAL);
ReleaseDC(hwnd, hdc);
// rich edit control
SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETZOOM, 0, 0);
}
return false;
@ -833,7 +845,7 @@ INT_PTR CALLBACK AboutDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam
StringCchCat(wchVerInfo, COUNTOF(wchVerInfo), wchBuf);
DPI_T dpi = GetCurrentDPI(hwnd);
StringCchPrintf(wchBuf, COUNTOF(wchBuf), L"\n- Display-DPI = %i x %i (Scale: %i%%).", dpi.x, dpi.y, ScaleIntToCurrentDPIX(hwnd, 100));
StringCchPrintf(wchBuf, COUNTOF(wchBuf), L"\n- Display-DPI = %i x %i (Scale: %i%%).", dpi.x, dpi.y, ScaleIntToDPI_X(hwnd, 100));
StringCchCat(wchVerInfo, COUNTOF(wchVerInfo), wchBuf);
StringCchPrintf(wchBuf, COUNTOF(wchBuf), L"\n- Rendering-Technology = '%s'", Settings.RenderingTechnology ? L"DIRECT-WRITE" : L"GDI");
@ -3963,8 +3975,6 @@ void StatusSetText(HWND hwnd, UINT nPart, LPCWSTR lpszText)
}
}
//=============================================================================
//
// StatusSetTextID()

View File

@ -400,7 +400,7 @@ if (!bSucceed) {
//
int GetSystemMetricsEx(HWND hwnd, int nValue) {
return ScaleIntToCurrentDPIY(hwnd, GetSystemMetrics(nValue));
return ScaleIntToDPI_Y(hwnd, GetSystemMetrics(nValue));
}

View File

@ -223,8 +223,9 @@ DPI_T GetCurrentPPI(HWND hwnd);
void UpdateWindowLayoutForDPI(HWND hWnd, int x_96dpi, int y_96dpi, int w_96dpi, int h_96dpi);
HBITMAP ResizeImageForCurrentDPI(HWND hwnd, HBITMAP hbmp);
inline int ScaleIntToCurrentDPIX(HWND hwnd, int val) { DPI_T const dpi = GetCurrentDPI(hwnd); return MulDiv((val), dpi.x, USER_DEFAULT_SCREEN_DPI); }
inline int ScaleIntToCurrentDPIY(HWND hwnd, int val) { DPI_T const dpi = GetCurrentDPI(hwnd); return MulDiv((val), dpi.y, USER_DEFAULT_SCREEN_DPI); }
inline int ScaleIntToDPI_X(HWND hwnd, int val) { DPI_T const dpi = GetCurrentDPI(hwnd); return MulDiv((val), dpi.x, USER_DEFAULT_SCREEN_DPI); }
inline int ScaleIntToDPI_Y(HWND hwnd, int val) { DPI_T const dpi = GetCurrentDPI(hwnd); return MulDiv((val), dpi.y, USER_DEFAULT_SCREEN_DPI); }
inline int ScaleToCurrentDPIX(HWND hwnd, float fVal) { DPI_T const dpi = GetCurrentDPI(hwnd); return float2int((fVal * dpi.x) / (float)USER_DEFAULT_SCREEN_DPI); }
inline int ScaleToCurrentDPIY(HWND hwnd, float fVal) { DPI_T const dpi = GetCurrentDPI(hwnd); return float2int((fVal * dpi.y) / (float)USER_DEFAULT_SCREEN_DPI); }
inline int ScaleIntFontSizeW(HWND hwnd, int val) { DPI_T const dpi = GetCurrentDPI(hwnd); DPI_T const ppi = GetCurrentPPI(hwnd); return MulDiv((val), dpi.x, ppi.x); }

View File

@ -155,8 +155,6 @@ static int s_iExprError = -1;
static WIN32_FIND_DATA s_fdCurFile;
static HMODULE s_hRichEdit = INVALID_HANDLE_VALUE;
static int const INISECTIONBUFCNT = 32; // .ini file load buffer in KB
static TBBUTTON s_tbbMainWnd[] = {
@ -765,11 +763,6 @@ static void _CleanUpResources(const HWND hwnd, bool bIsInitialized)
FreeLanguageResources();
if (s_hRichEdit) {
FreeLibrary(s_hRichEdit);
s_hRichEdit = INVALID_HANDLE_VALUE;
}
if (bIsInitialized) {
UnregisterClass(s_wchWndClass, Globals.hInstance);
}
@ -862,6 +855,9 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
Scintilla_RegisterClasses(hInstance);
//SetProcessDPIAware(); -> .manifest
//SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);
// ----------------------------------------------------
// MultiLingual
//
@ -869,11 +865,6 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
// ----------------------------------------------------
if (s_hRichEdit == INVALID_HANDLE_VALUE) {
//s_hRichEdit = LoadLibrary(L"RICHED20.DLL"); // Use RICHEDIT_CONTROL_VER for control in common_res.h
s_hRichEdit = LoadLibrary(L"MSFTEDIT.DLL"); // Use "RichEdit50W" for control in common_res.h
}
int const cxs = GetSystemMetrics(SM_CXSMICON);
int const cys = GetSystemMetrics(SM_CYSMICON);
@ -1223,7 +1214,7 @@ HWND InitInstance(HINSTANCE hInstance,LPCWSTR pszCmdLine,int nCmdShow)
if ((Settings.AlwaysOnTop || s_flagAlwaysOnTop == 2) && s_flagAlwaysOnTop != 1) {
SetWindowPos(Globals.hwndMain, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
//UpdateWindowLayoutForDPI(Globals.hwndMain, 0, 0, 0, 0);
//~UpdateWindowLayoutForDPI(Globals.hwndMain, 0, 0, 0, 0);
if (Globals.hIcon128) {
SendMessage(Globals.hwndMain, WM_SETICON, ICON_BIG, (LPARAM)Globals.hIcon128);
@ -2188,7 +2179,7 @@ static HIMAGELIST CreateScaledImageListFromBitmap(HWND hWnd, HBITMAP hBmp)
int const cx = (bmp.bmWidth - mod) / NUMTOOLBITMAPS;
int const cy = bmp.bmHeight;
HIMAGELIST himl = ImageList_Create(cx, cy, ILC_COLOR32 | ILC_MASK, 0, 0);
HIMAGELIST himl = ImageList_Create(cx, cy, ILC_COLOR32 | ILC_MASK, NUMTOOLBITMAPS, NUMTOOLBITMAPS);
ImageList_AddMasked(himl, hBmp, CLR_DEFAULT);
DPI_T dpi = GetCurrentDPI(hWnd);
@ -2200,10 +2191,10 @@ static HIMAGELIST CreateScaledImageListFromBitmap(HWND hWnd, HBITMAP hBmp)
// Scale button icons/images
int const scx = ScaleIntToCurrentDPIX(hWnd, cx);
int const scy = ScaleIntToCurrentDPIX(hWnd, cy);
int const scx = ScaleIntToDPI_X(hWnd, cx);
int const scy = ScaleIntToDPI_Y(hWnd, cy);
HIMAGELIST hsciml = ImageList_Create(scx, scy, ILC_COLOR32 | ILC_MASK | ILC_HIGHQUALITYSCALE, 0, 0);
HIMAGELIST hsciml = ImageList_Create(scx, scy, ILC_COLOR32 | ILC_MASK | ILC_HIGHQUALITYSCALE, NUMTOOLBITMAPS, NUMTOOLBITMAPS);
for (int i = 0; i < NUMTOOLBITMAPS; ++i)
{
@ -3375,7 +3366,6 @@ LRESULT MsgInitMenu(HWND hwnd, WPARAM wParam, LPARAM lParam)
CheckCmd(hmenu, IDM_VIEW_STATUSBAR, Settings.ShowStatusbar);
CheckCmd(hmenu, IDM_VIEW_DPISCALETB, Settings.DpiScaleToolBar);
//i = SciCall_GetLexer();
//EnableCmd(hmenu,IDM_VIEW_AUTOCLOSETAGS,(i == SCLEX_HTML || i == SCLEX_XML));
CheckCmd(hmenu, IDM_VIEW_AUTOCLOSETAGS, Settings.AutoCloseTags /*&& (i == SCLEX_HTML || i == SCLEX_XML)*/);
@ -3543,7 +3533,6 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
MarkAllOccurrences(Settings2.UpdateDelayMarkAllOccurrences, false);
break;
case IDT_TIMER_UPDATE_STATUSBAR:
_UpdateStatusbarDelayed((bool)lParam);
break;
@ -5604,7 +5593,14 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
break;
case IDM_HELP_ABOUT:
{
//~HMODULE hRichEdit = LoadLibrary(L"RICHED20.DLL"); // Use RICHEDIT_CONTROL_VER for control in common_res.h
HMODULE hRichEdit = LoadLibrary(L"MSFTEDIT.DLL"); // Use "RichEdit50W" for control in common_res.h;
if (hRichEdit != INVALID_HANDLE_VALUE) {
ThemedDialogBox(Globals.hLngResContainer, MAKEINTRESOURCE(IDD_MUI_ABOUT), hwnd, AboutDlgProc);
FreeLibrary(hRichEdit);
}
}
break;
case IDM_SETPASS:
@ -8824,7 +8820,6 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw)
StatusSetText(Globals.hwndStatus, cnt++, tchStatusBar[id]);
}
}
//InvalidateRect(Globals.hwndStatus,NULL,true);
}
// --------------------------------------------------------------------------
@ -9336,9 +9331,10 @@ bool FileIO(bool fLoad,LPWSTR pszFileName,
{
WCHAR tch[MAX_PATH + 40];
FormatLngStringW(tch, COUNTOF(tch), (fLoad) ? IDS_MUI_LOADFILE : IDS_MUI_SAVEFILE, PathFindFileName(pszFileName));
bool fSuccess = false;
BeginWaitCursor(tch);
bool fSuccess = false;
if (fLoad) {
fSuccess = EditLoadFile(Globals.hwndEdit,pszFileName,bSkipUnicodeDetect,bSkipANSICPDetection,bForceEncDetection,bSetSavePoint,status);
}
@ -9689,6 +9685,7 @@ bool FileLoad(bool bDontSave, bool bNew, bool bReload,
}
EndWaitCursor();
UpdateAllBars(true);
return fSuccess;

View File

@ -1639,7 +1639,7 @@ void Style_HighlightCurrentLine(HWND hwnd, int iHiLitCurLn)
if (!Style_StrGetSizeInt(szValue, &iFrameSize)) {
iFrameSize = 2;
}
iFrameSize = max_i(1, ScaleIntToCurrentDPIY(hwnd, iFrameSize));
iFrameSize = max_i(1, ScaleIntToDPI_Y(hwnd, iFrameSize));
SendMessage(hwnd, SCI_SETCARETLINEFRAME, iFrameSize, 0);
}

View File

@ -9,11 +9,11 @@
#define VERSION_MAJOR 5
#define VERSION_MINOR 20
#define VERSION_REV 309
#define VERSION_BUILD 2
#define VERSION_BUILD 3
#define SCINTILLA_VER 432
#define ONIGURUMA_REGEX_VER 6.9.4
#define UCHARDET_VER 2018.09.27
#define TINYEXPR_VER 2018.05.11
#define UTHASH_VER 2.1.0
#define VERSION_PATCH RC3
#define VERSION_COMMIT_ID dkt1-amr
#define VERSION_COMMIT_ID nebukadn