Merge pull request #569 from RaiKoHoff/Dev_ChngDPI

DPI Awareness & Fractional Font Size
This commit is contained in:
Derick Payne 2018-08-02 09:57:53 +02:00 committed by GitHub
commit 867e6faa17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 174 additions and 22 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2829,7 +2829,6 @@ BOOL ChangeDirectory(HWND hwnd,LPCWSTR lpszNewDir,BOOL bUpdateHistory)
//
void LoadSettings()
{
WCHAR *pIniSection = LocalAlloc(LPTR,sizeof(WCHAR)*32*1024);
int cbIniSection = (int)LocalSize(pIniSection)/sizeof(WCHAR);
@ -2880,7 +2879,7 @@ void LoadSettings()
if (!IniSectionGetString(pIniSection, L"Favorites", L"",
g_tchFavoritesDir, COUNTOF(g_tchFavoritesDir))) {
// try to fetch Locale Name from Notepad3.ini
// try to fetch Favorites dir from Notepad3.ini
GetPrivateProfileString(L"Settings", L"Favorites", L"",
g_tchFavoritesDir, COUNTOF(g_tchFavoritesDir), g_wchNP3IniFile);
if (lstrlen(g_wchNP3IniFile)) { bNP3sFavoritesSettings = TRUE; }
@ -2902,9 +2901,15 @@ void LoadSettings()
IniSectionGetString(pIniSection,L"QuikviewParams",L"",
szQuickviewParams,COUNTOF(szQuickviewParams));
if (!IniSectionGetString(pIniSection,L"OpenWithDir",L"",
tchOpenWithDir,COUNTOF(tchOpenWithDir)))
SHGetSpecialFolderPath(NULL,tchOpenWithDir,CSIDL_DESKTOPDIRECTORY,TRUE);
if (!IniSectionGetString(pIniSection, L"OpenWithDir", L"",
tchOpenWithDir, COUNTOF(tchOpenWithDir))) {
// try to fetch Open With dir from Notepad3.ini
GetPrivateProfileString(L"Settings", L"OpenWithDir", L"",
tchOpenWithDir, COUNTOF(tchOpenWithDir), g_wchNP3IniFile);
}
if (!lstrlen(tchOpenWithDir))
SHGetSpecialFolderPath(NULL, tchOpenWithDir, CSIDL_DESKTOPDIRECTORY, TRUE);
else
PathAbsoluteFromApp(tchOpenWithDir,NULL,COUNTOF(tchOpenWithDir),TRUE);

View File

@ -31,7 +31,13 @@
</compatibility>
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
<dpiAware>true/PM</dpiAware>
</asmv3:windowsSettings>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
<dpiAwareness>PerMonitorV2,PerMonitor</dpiAwareness>
</asmv3:windowsSettings>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">
<gdiScaling>false</gdiScaling>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>

View File

@ -3,7 +3,7 @@
<assemblyIdentity
name="Notepad3"
processorArchitecture="*"
version="4.18.607.1004"
version="4.18.802.1034"
type="win32"
/>
<description>Notepad3 X_MUI</description>

View File

@ -2239,6 +2239,7 @@ INT_PTR CALLBACK SelectDefEncodingDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPAR
if (g_hDlgIcon) { SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)g_hDlgIcon); }
hbmp = LoadImage(g_hInstance,MAKEINTRESOURCE(IDB_ENCODING),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
hbmp = ResizeImageForCurrentDPI(hbmp);
himl = ImageList_Create(16,16,ILC_COLOR32|ILC_MASK,0,0);
ImageList_AddMasked(himl,hbmp,CLR_DEFAULT);
@ -2364,6 +2365,8 @@ INT_PTR CALLBACK SelectEncodingDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM
hwndLV = GetDlgItem(hwnd,IDC_ENCODINGLIST);
hbmp = LoadImage(g_hInstance,MAKEINTRESOURCE(IDB_ENCODING),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
hbmp = ResizeImageForCurrentDPI(hbmp);
himl = ImageList_Create(16,16,ILC_COLOR32|ILC_MASK,0,0);
ImageList_AddMasked(himl,hbmp,CLR_DEFAULT);
DeleteObject(hbmp);

View File

@ -43,6 +43,7 @@
extern HINSTANCE g_hInstance;
extern HMODULE g_hLngResContainer;
extern LANGID g_iPrefLngLocID;
extern UINT g_uCurrentDPI;
//=============================================================================
//
@ -300,6 +301,70 @@ DWORD GetLastErrorToMsgBox(LPWSTR lpszFunction, DWORD dwErrID)
}
//=============================================================================
//
// GetCurrentDPI()
//
UINT GetCurrentDPI(HWND hwnd) {
UINT dpi = 0;
if (IsWin10()) {
FARPROC pfnGetDpiForWindow = GetProcAddress(GetModuleHandle(L"user32.dll"), "GetDpiForWindow");
if (pfnGetDpiForWindow) {
dpi = (UINT)pfnGetDpiForWindow(hwnd);
}
}
if (dpi == 0 && IsWin81()) {
HMODULE hShcore = LoadLibrary(L"shcore.dll");
if (hShcore) {
FARPROC pfnGetDpiForMonitor = GetProcAddress(hShcore, "GetDpiForMonitor");
if (pfnGetDpiForMonitor) {
HMONITOR hMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
UINT dpiX = 0, dpiY = 0;
if (pfnGetDpiForMonitor(hMonitor, 0 /* MDT_EFFECTIVE_DPI */, &dpiX, &dpiY) == S_OK) {
dpi = dpiX;
}
}
FreeLibrary(hShcore);
}
}
if (dpi == 0) {
// FIXME: seems always get 96
HDC hDC = GetDC(hwnd);
dpi = GetDeviceCaps(hDC, LOGPIXELSX);
ReleaseDC(hwnd, hDC);
}
dpi = max(dpi, USER_DEFAULT_SCREEN_DPI);
return dpi;
}
//=============================================================================
//
// ResizeImageForCurrentDPI()
//
HBITMAP ResizeImageForCurrentDPI(HBITMAP hbmp)
{
if (hbmp) {
BITMAP bmp;
if (g_uCurrentDPI > USER_DEFAULT_SCREEN_DPI && GetObject(hbmp, sizeof(BITMAP), &bmp)) {
int width = MulDiv(bmp.bmWidth, g_uCurrentDPI, USER_DEFAULT_SCREEN_DPI);
int height = MulDiv(bmp.bmHeight, g_uCurrentDPI, USER_DEFAULT_SCREEN_DPI);
HBITMAP hCopy = CopyImage(hbmp, IMAGE_BITMAP, width, height, LR_COPYRETURNORG | LR_COPYDELETEORG);
if (hCopy) {
hbmp = hCopy;
}
}
}
return hbmp;
}
//=============================================================================
//
// PrivateIsAppThemed()
@ -952,6 +1017,7 @@ void MakeBitmapButton(HWND hwnd,int nCtlId,HINSTANCE hInstance,UINT uBmpId)
BITMAP bmp;
BUTTON_IMAGELIST bi;
HBITMAP hBmp = LoadImage(hInstance,MAKEINTRESOURCE(uBmpId),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
hBmp = ResizeImageForCurrentDPI(hBmp);
GetObject(hBmp,sizeof(BITMAP),&bmp);
bi.himl = ImageList_Create(bmp.bmWidth,bmp.bmHeight,ILC_COLOR32|ILC_MASK,1,0);
ImageList_AddMasked(bi.himl,hBmp,CLR_DEFAULT);
@ -962,6 +1028,7 @@ void MakeBitmapButton(HWND hwnd,int nCtlId,HINSTANCE hInstance,UINT uBmpId)
}
//=============================================================================
//
// MakeColorPickButton()
@ -1033,11 +1100,14 @@ void DeleteBitmapButton(HWND hwnd,int nCtlId)
//
// SendWMSize()
//
LRESULT SendWMSize(HWND hwnd)
LRESULT SendWMSize(HWND hwnd, RECT* rc)
{
RECT rc;
GetClientRect(hwnd, &rc);
return (SendMessage(hwnd, WM_SIZE, SIZE_RESTORED, MAKELPARAM(rc.right, rc.bottom)));
if (!rc) {
RECT _rc;
GetClientRect(hwnd, &_rc);
return (SendMessage(hwnd, WM_SIZE, SIZE_RESTORED, MAKELPARAM(_rc.right, _rc.bottom)));
}
return (SendMessage(hwnd, WM_SIZE, SIZE_RESTORED, MAKELPARAM(rc->right, rc->bottom)));
}

View File

@ -28,7 +28,6 @@
extern WCHAR g_wchIniFile[MAX_PATH];
// ============================================================================
#define STRGFY(X) L##(X)
@ -132,6 +131,9 @@ DWORD GetLastErrorToMsgBox(LPWSTR lpszFunction, DWORD dwErrID);
bool SetClipboardTextW(HWND, LPCWSTR);
UINT GetCurrentDPI(HWND hwnd);
HBITMAP ResizeImageForCurrentDPI(HBITMAP hbmp);
bool PrivateIsAppThemed();
HRESULT PrivateSetCurrentProcessExplicitAppUserModelID(PCWSTR);
bool IsElevated();
@ -174,7 +176,7 @@ LONG StatusCalcPaneWidth(HWND,LPCWSTR);
int Toolbar_GetButtons(HWND,int,LPWSTR,int);
int Toolbar_SetButtons(HWND,int,LPCWSTR,void*,int);
LRESULT SendWMSize(HWND);
LRESULT SendWMSize(HWND, RECT*);
bool IsCmdEnabled(HWND, UINT);

View File

@ -67,6 +67,7 @@ HWND g_hwndReBar = NULL;
HWND hwndEditFrame = NULL;
HWND hwndNextCBChain = NULL;
HICON g_hDlgIcon = NULL;
UINT g_uCurrentDPI = USER_DEFAULT_SCREEN_DPI;
bool g_bExternalBitmap = false;
@ -1414,6 +1415,10 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
MsgThemeChanged(hwnd,wParam,lParam);
break;
case WM_DPICHANGED:
MsgDPIChanged(hwnd, wParam, lParam);
break;
// update Scintilla colors
case WM_SYSCOLORCHANGE:
UpdateLineNumberWidth();
@ -1710,6 +1715,8 @@ LRESULT MsgCreate(HWND hwnd,WPARAM wParam,LPARAM lParam)
HINSTANCE hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
g_uCurrentDPI = GetCurrentDPI(hwnd);
// Setup edit control
g_hwndEdit = CreateWindowEx(
WS_EX_CLIENTEDGE,
@ -1870,6 +1877,7 @@ void CreateBars(HWND hwnd,HINSTANCE hInstance)
if (!SearchPath(NULL,g_tchToolbarBitmap,L".bmp",COUNTOF(szTmp),szTmp,NULL))
StringCchCopy(szTmp,COUNTOF(szTmp),g_tchToolbarBitmap);
hbmp = LoadImage(NULL,szTmp,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
hbmp = ResizeImageForCurrentDPI(hbmp);
}
if (hbmp) {
@ -1878,8 +1886,10 @@ void CreateBars(HWND hwnd,HINSTANCE hInstance)
else {
LPWSTR toolBarIntRes = (iHighDpiToolBar > 0) ? MAKEINTRESOURCE(IDR_MAINWNDTB2) : MAKEINTRESOURCE(IDR_MAINWNDTB);
hbmp = LoadImage(hInstance, toolBarIntRes, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
hbmp = ResizeImageForCurrentDPI(hbmp);
hbmpCopy = CopyImage(hbmp, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
}
GetObject(hbmp,sizeof(BITMAP),&bmp);
if (!IsXP())
BitmapMergeAlpha(hbmp,GetSysColor(COLOR_3DFACE));
@ -1896,6 +1906,7 @@ void CreateBars(HWND hwnd,HINSTANCE hInstance)
StringCchCopy(szTmp,COUNTOF(szTmp),g_tchToolbarBitmapHot);
hbmp = LoadImage(NULL, szTmp, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
hbmp = ResizeImageForCurrentDPI(hbmp);
if (hbmp)
{
GetObject(hbmp,sizeof(BITMAP),&bmp);
@ -1914,6 +1925,7 @@ void CreateBars(HWND hwnd,HINSTANCE hInstance)
StringCchCopy(szTmp,COUNTOF(szTmp),g_tchToolbarBitmapDisabled);
hbmp = LoadImage(NULL, szTmp, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
hbmp = ResizeImageForCurrentDPI(hbmp);
if (hbmp)
{
GetObject(hbmp,sizeof(BITMAP),&bmp);
@ -2092,6 +2104,46 @@ void MsgEndSession(HWND hwnd, UINT umsg)
}
//=============================================================================
//
// MsgDPIChanged() - Handle WM_DPICHANGED
//
//
void MsgDPIChanged(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
g_uCurrentDPI = HIWORD(wParam);
DocPos const pos = SciCall_GetCurrentPos();
HINSTANCE hInstance = (HINSTANCE)(INT_PTR)GetWindowLongPtr(hwnd, GWLP_HINSTANCE);
#if 0
char buf[64];
sprintf_s(buf, COUNTOF(buf), "WM_DPICHANGED: dpi=%u\n", g_uCurrentDPI);
SendMessage(g_hwndEdit, SCI_INSERTTEXT, 0, (LPARAM)buf);
#endif
Style_ResetCurrentLexer(g_hwndEdit);
SciCall_GotoPos(pos);
// recreate toolbar and statusbar
Toolbar_GetButtons(g_hwndToolbar, IDT_FILE_NEW, g_tchToolbarButtons, COUNTOF(g_tchToolbarButtons));
DestroyWindow(g_hwndToolbar);
DestroyWindow(g_hwndReBar);
DestroyWindow(g_hwndStatus);
CreateBars(hwnd, hInstance);
RECT* const rc = (RECT*)lParam;
SendWMSize(hwnd, rc);
UpdateUI();
UpdateToolbar();
UpdateStatusbar(true);
UpdateLineNumberWidth();
}
//=============================================================================
//
// MsgThemeChanged() - Handle WM_THEMECHANGED
@ -2147,7 +2199,7 @@ void MsgThemeChanged(HWND hwnd,WPARAM wParam,LPARAM lParam)
DestroyWindow(g_hwndStatus);
CreateBars(hwnd,hInstance);
SendWMSize(hwnd);
SendWMSize(hwnd, NULL);
EditFinalizeStyling(g_hwndEdit, -1);
@ -4816,7 +4868,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
UpdateToolbar();
ShowWindow(g_hwndReBar,SW_SHOW);
}
SendWMSize(hwnd);
SendWMSize(hwnd, NULL);
break;
@ -4840,7 +4892,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
UpdateStatusbar(false);
ShowWindow(g_hwndStatus,SW_SHOW);
}
SendWMSize(hwnd);
SendWMSize(hwnd, NULL);
break;
@ -8225,9 +8277,16 @@ void UpdateLineNumberWidth()
else {
SciCall_SetMarginWidthN(MARGIN_SCI_LINENUM, 0);
}
int const widthBM = g_bShowSelectionMargin ? MulDiv(16, g_uCurrentDPI, USER_DEFAULT_SCREEN_DPI) : 0;
SciCall_SetMarginWidthN(MARGIN_SCI_BOOKMRK, widthBM);
int const widthCF = (g_bCodeFoldingAvailable && g_bShowCodeFolding) ? MulDiv(13, g_uCurrentDPI, USER_DEFAULT_SCREEN_DPI) : 0;
SciCall_SetMarginWidthN(MARGIN_SCI_FOLDING, widthCF);
}
//=============================================================================
//
// UpdateSettingsCmds()

View File

@ -172,6 +172,7 @@ LRESULT MsgCreate(HWND, WPARAM, LPARAM);
void MsgEndSession(HWND, UINT);
void CreateBars(HWND, HINSTANCE);
void MsgThemeChanged(HWND, WPARAM, LPARAM);
void MsgDPIChanged(HWND, WPARAM, LPARAM);
void MsgSize(HWND, WPARAM, LPARAM);
void MsgDropFiles(HWND, WPARAM, LPARAM);
LRESULT MsgCopyData(HWND, WPARAM, LPARAM);

View File

@ -50,6 +50,7 @@ extern HICON g_hDlgIcon;
extern HWND g_hwndMain;
extern HWND g_hwndDlgCustomizeSchemes;
extern EDITFINDREPLACE g_efrData;
extern UINT g_uCurrentDPI;
extern int g_iSciFontQuality;
extern const int FontQuality[4];
@ -5566,6 +5567,14 @@ bool Style_SelectColor(HWND hwnd,bool bForeGround,LPWSTR lpszStyle,int cchStyle,
}
//=============================================================================
inline static int _GetDPIAwareFractFontSize(float fFontSize)
{
return MulDiv((int)(fFontSize + 0.5), (SC_FONT_SIZE_MULTIPLIER * g_uCurrentDPI), USER_DEFAULT_SCREEN_DPI);
}
//=============================================================================
//
// Style_SetStyles()
@ -5631,13 +5640,10 @@ void Style_SetStyles(HWND hwnd, int iStyle, LPCWSTR lpszStyle, bool bInitDefault
}
// Size values are relative to BaseFontSize/CurrentFontSize
POINT dpi = GetSystemDpi();
float fBaseFontSize = _GetCurrentFontSize();
fBaseFontSize = (float)max(0.0, fBaseFontSize);
if (Style_StrGetSize(lpszStyle, &fBaseFontSize)) {
fBaseFontSize = (float)max(0.0, fBaseFontSize);
fBaseFontSize = (float)MulDiv((int)fBaseFontSize, (dpi.x + dpi.y)/2, USER_DEFAULT_SCREEN_DPI);
//SendMessage(hwnd, SCI_STYLESETSIZE, iStyle, (int)fBaseFontSize);
SendMessage(hwnd, SCI_STYLESETSIZEFRACTIONAL, iStyle, (LPARAM)((int)(fBaseFontSize * SC_FONT_SIZE_MULTIPLIER + 0.5)));
SendMessage(hwnd, SCI_STYLESETSIZEFRACTIONAL, iStyle, (LPARAM)_GetDPIAwareFractFontSize(fBaseFontSize));
if (iStyle == STYLE_DEFAULT) {
if (bInitDefault) {
_SetBaseFontSize(fBaseFontSize);
@ -5647,7 +5653,7 @@ void Style_SetStyles(HWND hwnd, int iStyle, LPCWSTR lpszStyle, bool bInitDefault
}
else if (bInitDefault) {
//SendMessage(hwnd, SCI_STYLESETSIZE, STYLE_DEFAULT, (LPARAM)((int)fBaseFontSize));
SendMessage(hwnd, SCI_STYLESETSIZEFRACTIONAL, STYLE_DEFAULT, (LPARAM)((int)(fBaseFontSize * SC_FONT_SIZE_MULTIPLIER + 0.5)));
SendMessage(hwnd, SCI_STYLESETSIZEFRACTIONAL, STYLE_DEFAULT, (LPARAM)_GetDPIAwareFractFontSize(fBaseFontSize));
}
// Character Set