mirror of
https://github.com/quantum5/MusicKeyboard.git
synced 2025-04-24 05:01:58 -04:00
Use DPI-aware font handling
This commit is contained in:
parent
c9865a2efc
commit
bc8d1c9af3
2
Makefile
2
Makefile
|
@ -3,7 +3,7 @@ INCDIR=include
|
||||||
|
|
||||||
CXX=cl /nologo
|
CXX=cl /nologo
|
||||||
LD=link /nologo
|
LD=link /nologo
|
||||||
CXXFLAGS=/c /O1 /I$(INCDIR) /W4 /DWIN32_LEAN_AND_MEAN /DWINVER=0x0601 /D_WIN32_WINNT=0x0601 /DUNICODE /D_UNICODE
|
CXXFLAGS=/c /O1 /I$(INCDIR) /W4 /DWIN32_LEAN_AND_MEAN /DWINVER=0x0603 /D_WIN32_WINNT=0x0603 /DUNICODE /D_UNICODE
|
||||||
LDFLAGS=/subsystem:windows /incremental:no /opt:REF
|
LDFLAGS=/subsystem:windows /incremental:no /opt:REF
|
||||||
RC=rc /nologo
|
RC=rc /nologo
|
||||||
RCFLAGS=/i$(INCDIR)
|
RCFLAGS=/i$(INCDIR)
|
||||||
|
|
|
@ -76,6 +76,7 @@ protected:
|
||||||
|
|
||||||
void UpdateScale();
|
void UpdateScale();
|
||||||
int scale(int unscaled) { return static_cast<int>(m_scale * unscaled); }
|
int scale(int unscaled) { return static_cast<int>(m_scale * unscaled); }
|
||||||
|
void UpdateFont();
|
||||||
|
|
||||||
int active[128];
|
int active[128];
|
||||||
bool capsDown;
|
bool capsDown;
|
||||||
|
@ -119,8 +120,6 @@ protected:
|
||||||
static void UnhookWindow(MainWindow *window);
|
static void UnhookWindow(MainWindow *window);
|
||||||
static MainWindow *activeHookWindow;
|
static MainWindow *activeHookWindow;
|
||||||
static HHOOK activeHook;
|
static HHOOK activeHook;
|
||||||
private:
|
|
||||||
HFONT hFont;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -144,22 +144,28 @@ BOOL MainWindow::WinRegisterClass(WNDCLASS *pwc)
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef HRESULT (WINAPI *FN_GETDPIFORMONITOR)(HMONITOR, MONITOR_DPI_TYPE, UINT*, UINT*);
|
typedef HRESULT (WINAPI *FN_GETDPIFORMONITOR)(HMONITOR, MONITOR_DPI_TYPE, UINT*, UINT*);
|
||||||
|
typedef UINT (WINAPI *FN_GETDPIFORWINDOW)(HWND);
|
||||||
|
typedef BOOL (WINAPI *FN_SYSTEMPARAMETERSINFOFORDPI)(UINT, UINT, PVOID, UINT, UINT);
|
||||||
|
|
||||||
void MainWindow::UpdateScale()
|
void MainWindow::UpdateScale()
|
||||||
{
|
{
|
||||||
HMONITOR hMonitor = MonitorFromWindow(m_hwnd, MONITOR_DEFAULTTONEAREST);
|
|
||||||
HMODULE hShCore;
|
|
||||||
|
|
||||||
m_scale = 1;
|
m_scale = 1;
|
||||||
|
|
||||||
hShCore = LoadLibrary(L"ShCore.dll");
|
FN_GETDPIFORWINDOW GetDpiForWindow = (FN_GETDPIFORWINDOW) GetProcAddress(
|
||||||
if (hShCore) {
|
GetModuleHandle(L"user32.dll"), "GetDpiForWindow");
|
||||||
FN_GETDPIFORMONITOR GetDpiForMonitor =
|
if (GetDpiForWindow) {
|
||||||
(FN_GETDPIFORMONITOR) GetProcAddress(hShCore, "GetDpiForMonitor");
|
m_scale = GetDpiForWindow(m_hwnd) / 96.0;
|
||||||
if (GetDpiForMonitor) {
|
} else {
|
||||||
UINT dpiX, dpiY;
|
HMONITOR hMonitor = MonitorFromWindow(m_hwnd, MONITOR_DEFAULTTONEAREST);
|
||||||
GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY);
|
HMODULE hShCore = LoadLibrary(L"ShCore.dll");
|
||||||
m_scale = dpiX / 96.0;
|
if (hShCore) {
|
||||||
|
FN_GETDPIFORMONITOR GetDpiForMonitor =
|
||||||
|
(FN_GETDPIFORMONITOR) GetProcAddress(hShCore, "GetDpiForMonitor");
|
||||||
|
if (GetDpiForMonitor) {
|
||||||
|
UINT dpiX, dpiY;
|
||||||
|
GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY);
|
||||||
|
m_scale = dpiX / 96.0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -173,12 +179,6 @@ LRESULT MainWindow::OnCreate()
|
||||||
SetWindowPos(m_hwnd, NULL, 0, 0, client.right - client.left,
|
SetWindowPos(m_hwnd, NULL, 0, 0, client.right - client.left,
|
||||||
client.bottom - client.top, SWP_NOMOVE | SWP_NOZORDER);
|
client.bottom - client.top, SWP_NOMOVE | SWP_NOZORDER);
|
||||||
|
|
||||||
NONCLIENTMETRICS ncmMetrics = { sizeof(NONCLIENTMETRICS) };
|
|
||||||
|
|
||||||
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncmMetrics, 0);
|
|
||||||
|
|
||||||
hFont = CreateFontIndirect(&ncmMetrics.lfMessageFont);
|
|
||||||
|
|
||||||
// For debugging
|
// For debugging
|
||||||
/*AllocConsole();
|
/*AllocConsole();
|
||||||
freopen("CONOUT$", "w", stdout);*/
|
freopen("CONOUT$", "w", stdout);*/
|
||||||
|
@ -280,6 +280,8 @@ LRESULT MainWindow::OnCreate()
|
||||||
SendMessage(m_octaveUpDown, UDM_SETRANGE32, (WPARAM) -3, 3);
|
SendMessage(m_octaveUpDown, UDM_SETRANGE32, (WPARAM) -3, 3);
|
||||||
SendMessage(m_octaveUpDown, UDM_SETPOS32, 0, 0);
|
SendMessage(m_octaveUpDown, UDM_SETPOS32, 0, 0);
|
||||||
|
|
||||||
|
UpdateFont();
|
||||||
|
|
||||||
m_force = 64;
|
m_force = 64;
|
||||||
m_volume = 0xFFFF;
|
m_volume = 0xFFFF;
|
||||||
m_midifile = NULL;
|
m_midifile = NULL;
|
||||||
|
@ -304,33 +306,6 @@ LRESULT MainWindow::OnCreate()
|
||||||
m_keymap[VK_OEM_5] = 76;
|
m_keymap[VK_OEM_5] = 76;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SETFONT(hwnd) SendMessage(hwnd, WM_SETFONT, (WPARAM) hFont, (LPARAM) TRUE)
|
|
||||||
SETFONT(m_volumeLabel);
|
|
||||||
SETFONT(m_volumeBar);
|
|
||||||
SETFONT(m_forceLabel);
|
|
||||||
SETFONT(m_forceBar);
|
|
||||||
SETFONT(m_instruLabel);
|
|
||||||
SETFONT(m_instruSelect);
|
|
||||||
SETFONT(m_deviceLabel);
|
|
||||||
SETFONT(m_deviceSelect);
|
|
||||||
SETFONT(m_adjustLabel);
|
|
||||||
SETFONT(m_semitoneSelect);
|
|
||||||
SETFONT(m_semitoneLabel);
|
|
||||||
SETFONT(m_octaveSelect);
|
|
||||||
SETFONT(m_octaveLabel);
|
|
||||||
SETFONT(m_keySelect);
|
|
||||||
SETFONT(m_keyLabel);
|
|
||||||
SETFONT(m_pipeAboveRadio);
|
|
||||||
SETFONT(m_pipeLeftRadio);
|
|
||||||
SETFONT(m_beepCheck);
|
|
||||||
SETFONT(m_saveCheck);
|
|
||||||
SETFONT(m_saveLabel);
|
|
||||||
SETFONT(m_saveFile);
|
|
||||||
SETFONT(m_saveBrowse);
|
|
||||||
SETFONT(m_reopen);
|
|
||||||
SETFONT(m_closeFile);
|
|
||||||
#undef SETFONT
|
|
||||||
|
|
||||||
SendMessage(m_keySelect, CB_INITSTORAGE, 12, 128);
|
SendMessage(m_keySelect, CB_INITSTORAGE, 12, 128);
|
||||||
for (int i = 0; i < 12; ++i)
|
for (int i = 0; i < 12; ++i)
|
||||||
SendMessage(m_keySelect, CB_ADDSTRING, 0, (LPARAM) majorKeys[i]);
|
SendMessage(m_keySelect, CB_ADDSTRING, 0, (LPARAM) majorKeys[i]);
|
||||||
|
@ -386,6 +361,53 @@ LRESULT MainWindow::OnCreate()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::UpdateFont()
|
||||||
|
{
|
||||||
|
NONCLIENTMETRICSW ncmMetrics = { sizeof(NONCLIENTMETRICSW) };
|
||||||
|
HMODULE hmUser32 = GetModuleHandle(L"user32.dll");
|
||||||
|
FN_GETDPIFORWINDOW GetDpiForWindow =
|
||||||
|
(FN_GETDPIFORWINDOW) GetProcAddress(hmUser32, "GetDpiForWindow");
|
||||||
|
FN_SYSTEMPARAMETERSINFOFORDPI SystemParametersInfoForDpi =
|
||||||
|
(FN_SYSTEMPARAMETERSINFOFORDPI) GetProcAddress(hmUser32, "SystemParametersInfoForDpi");
|
||||||
|
|
||||||
|
if (GetDpiForWindow && SystemParametersInfoForDpi) {
|
||||||
|
UINT dpi = GetDpiForWindow(m_hwnd);
|
||||||
|
SystemParametersInfoForDpi(SPI_GETNONCLIENTMETRICS, sizeof ncmMetrics, &ncmMetrics, 0, dpi);
|
||||||
|
} else {
|
||||||
|
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncmMetrics, 0);
|
||||||
|
ncmMetrics.lfMessageFont.lfHeight = scale(-12);
|
||||||
|
}
|
||||||
|
|
||||||
|
HFONT hFont = CreateFontIndirect(&ncmMetrics.lfMessageFont);
|
||||||
|
|
||||||
|
#define SETFONT(hwnd) SendMessage(hwnd, WM_SETFONT, (WPARAM) hFont, (LPARAM) TRUE)
|
||||||
|
SETFONT(m_volumeLabel);
|
||||||
|
SETFONT(m_volumeBar);
|
||||||
|
SETFONT(m_forceLabel);
|
||||||
|
SETFONT(m_forceBar);
|
||||||
|
SETFONT(m_instruLabel);
|
||||||
|
SETFONT(m_instruSelect);
|
||||||
|
SETFONT(m_deviceLabel);
|
||||||
|
SETFONT(m_deviceSelect);
|
||||||
|
SETFONT(m_adjustLabel);
|
||||||
|
SETFONT(m_semitoneSelect);
|
||||||
|
SETFONT(m_semitoneLabel);
|
||||||
|
SETFONT(m_octaveSelect);
|
||||||
|
SETFONT(m_octaveLabel);
|
||||||
|
SETFONT(m_keySelect);
|
||||||
|
SETFONT(m_keyLabel);
|
||||||
|
SETFONT(m_pipeAboveRadio);
|
||||||
|
SETFONT(m_pipeLeftRadio);
|
||||||
|
SETFONT(m_beepCheck);
|
||||||
|
SETFONT(m_saveCheck);
|
||||||
|
SETFONT(m_saveLabel);
|
||||||
|
SETFONT(m_saveFile);
|
||||||
|
SETFONT(m_saveBrowse);
|
||||||
|
SETFONT(m_reopen);
|
||||||
|
SETFONT(m_closeFile);
|
||||||
|
#undef SETFONT
|
||||||
|
}
|
||||||
|
|
||||||
LRESULT MainWindow::OnDestroy()
|
LRESULT MainWindow::OnDestroy()
|
||||||
{
|
{
|
||||||
midiOutClose(m_midi);
|
midiOutClose(m_midi);
|
||||||
|
@ -737,6 +759,7 @@ LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
case WM_DPICHANGED: {
|
case WM_DPICHANGED: {
|
||||||
LPRECT lpBox = (LPRECT) lParam;
|
LPRECT lpBox = (LPRECT) lParam;
|
||||||
m_scale = LOWORD(wParam) / 96.0;
|
m_scale = LOWORD(wParam) / 96.0;
|
||||||
|
UpdateFont();
|
||||||
SetWindowPos(m_hwnd, NULL, lpBox->left, lpBox->top, lpBox->right - lpBox->left,
|
SetWindowPos(m_hwnd, NULL, lpBox->left, lpBox->top, lpBox->right - lpBox->left,
|
||||||
lpBox->bottom - lpBox->top, SWP_NOZORDER | SWP_NOACTIVATE);
|
lpBox->bottom - lpBox->top, SWP_NOZORDER | SWP_NOACTIVATE);
|
||||||
RedrawWindow(m_hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
|
RedrawWindow(m_hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
|
||||||
|
|
Loading…
Reference in a new issue