Я пытаюсь определить, как определить, когда пользователь изменяет размер шрифта 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 (из графических свойств).