Я пытаюсь определить, как я могу определить, когда пользователь меняет размер шрифта Windows с обычного на сверхбольшие шрифты, размер шрифта выбирается путем выполнения следующих шагов на компьютере с Windows XP:
- Щелкните правой кнопкой мыши на рабочем столе и выберите «Свойства».
- Щелкните вкладку «Внешний вид».
- Выберите размер шрифта: Обычный / Крупный шрифт / Очень крупный шрифт.
Насколько я понимаю, изменение размера шрифта приводит к изменению DPI, поэтому вот что я пробовал до сих пор.
Моя цель:
Я хочу определить, когда размер шрифта Windows изменился с обычного на крупный или очень крупный шрифт, и предпринять некоторые действия в зависимости от этого изменения размера шрифта. Я предполагаю, что при изменении размера шрифта Windows изменится и DPI (особенно, если размер шрифта Extra Large Fonts
Что я пробовал до сих пор:
Я получаю несколько сообщений, в том числе: WM_SETTINGCHANGE, WM_NCCALCSIZE, WM_NCPAINT и т.д., но ни одно из этих сообщений не является уникальным для ситуации, когда размер шрифта изменяется, другими словами, когда я получаю сообщение WM_SETTINGSCHANGE, я хочу знать, что изменилось.
Теоретически, когда я определяю OnSettingChange и Windows вызывает его, lpszSection должен сказать мне, что такое изменяемый раздел, и это работает нормально, но затем я проверяю данный раздел, вызывая SystemParametersInfo, и я передаю действие SPI_GETNONCLIENTMETRICS, и я перехожу через отладчик, и я проверяю данные в возвращенной NONCLIENTMETRICS на предмет каких-либо изменений шрифта, но ничего не происходит.
Даже если это не сработает, я все равно смогу проверить DPI при изменении настроек. Меня действительно не волнуют другие детали, каждый раз, когда я получаю сообщение WM_SETTINGCHANGE, я просто проверяю DPI и выполняю действия, которые меня интересуют, но я также не могу получить системный DPI.
Я попытался получить DPI, вызвав метод GetSystemMetrics, также для каждого DC:
Dekstop DC-> GetDeviceCaps LOGPIXELSX / LOGPIXELSY Окно DC-> GetDeviceCaps LOGPIXELSX / LOGPIXELSY Текущий DC-> GetDeviceCaps LOGPIXELSX / LOGPIXELSY
Даже если я изменю DPI в окне свойств графики, эти значения не возвращают ничего другого, они всегда показывают 96.
Может ли кто-нибудь помочь мне разобраться в этом, пожалуйста? Что я должен искать? Куда мне смотреть?
afx_msg void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
{
int windowDPI = 0;
int deviceDPI = 0;
int systemDPI = 0;
int desktopDPI = 0;
int dpi_00_X = 0;
int dpi_01_X = 0;
int dpi_02_X = 0;
int dpi_03_X = 0;
CDC* windowDC = CWnd::GetWindowDC(); // try with window DC
HDC desktop = ::GetDC(NULL); // try with desktop DC
CDC* device = CWnd::GetDC(); // try with current DC
HDC hDC = *device; // try with HDC
if( windowDC )
{
windowDPI = windowDC->GetDeviceCaps(LOGPIXELSY);
// always 96 regardless if I change the Font
// Size to Extra Large Fonts or keep it at Normal
dpi_00_X = windowDC->GetDeviceCaps(LOGPIXELSX); // 96
}
if( desktop )
{
desktopDPI = ::GetDeviceCaps(desktop, LOGPIXELSY); // 96
dpi_01_X = ::GetDeviceCaps(desktop, LOGPIXELSX); // 96
}
if( device )
{
deviceDPI = device->GetDeviceCaps(LOGPIXELSY); // 96
dpi_02_X = device->GetDeviceCaps(LOGPIXELSX); // 96
}
systemDPI = ::GetDeviceCaps(hDC, LOGPIXELSY); // 96
dpi_03_X = ::GetDeviceCaps(hDC, LOGPIXELSX); // 96
CWnd::ReleaseDC(device);
CWnd::ReleaseDC(windowDC);
::ReleaseDC(NULL, desktop);
::ReleaseDC(NULL, hDC);
CWnd::OnWinSettingChange(uFlags, lpszSection);
}
DPI всегда возвращает 96, но изменения настроек ДЕЙСТВИТЕЛЬНО вступают в силу, когда я изменяю размер шрифта на Extra Large Fonts или если я изменяю DPI на 120 (в свойствах графики).