Не может обнаружить, когда Windows Font Size изменил C++ MFC

Как и другие уже упомянутые ответы, Observable еще не определена в конструкторе. Конструктор должен использоваться только для DI или присвоений imho.

Я бы предложил не передавать наблюдаемое как входные данные вашим дочерним компонентам, а передавать его как «просто» массив. Это сделает ваше приложение быстрее, проще в работе и проще в тестировании. Чтобы передать его как массив, используйте канал async.

<pv-family-list [planMembers]="planMembers$ | async"><pv-family-list/>
8
задан Kiril 17 October 2008 в 14:18
поделиться

6 ответов

[РЕДАКТИРОВАНИЕ, после того, как перечитано] я почти положителен, что изменение на "Большие шрифты" не вызывает изменение DPI, скорее это - установка темы. Необходимо смочь проверить путем применения "Больших шрифтов" изменение и затем открытия усовершенствованных свойств дисплея, где установка DPI живет, это должно было остаться на уровне 96 точек на дюйм.


Изменение DPI, как предполагается, требует перезагрузки. Возможно, установка не распространила к месту, где GetDeviceCaps может получить ее?

Возможно, попытайтесь изменить non-reboot-requiring настройки (разрешение, возможно) и затем посмотрите, можно ли обнаружить изменение. Если Вы можете, Ваш ответ быть, вероятно, что Вы не можете обнаружить изменение DPI до окончания перезагрузки.

4
ответ дан 5 December 2019 в 19:04
поделиться

При вызове GetDeviceCaps () на Настольном DC Вы, возможно, используете DC, который мог бы кэшироваться MFC и поэтому содержит устаревшую информацию? Вы делаете GetDeviceCaps () вызовом синхронно из Вашего обработчика OnSettingsChange? Я видел, как или или обе из этих вещей мог бы получить Вас устаревшее версия DPI.

Raymond Chen записал об этом, и его решение было похоже на это (Обратите внимание, что я добавил:: операторы, чтобы не называть обертки MFC API):

int GetScreenDPI()
{
  HDC hdcScreen = ::GetDC(NULL);
  int iDPI = -1; // assume failure
  if (hdcScreen) {
    iDPI = ::GetDeviceCaps(hdcScreen, LOGPIXELSX);
    ::ReleaseDC(NULL, hdcScreen);
  }
  return iDPI;
}
2
ответ дан 5 December 2019 в 19:04
поделиться

У меня есть догадка, WM_THEMECHANGED будет заботиться о Вас. Это не имеет никакого вывода подсказок о том, что изменилось, все же. Необходимо будет использовать OpenThemeData и начальные установки кэша, затем выдержать сравнение каждый раз, когда Вы получаете сообщение.

Вы, вероятно, не должны заботиться о том, что изменилось, хотя, разве у Вас не может быть стандартной программы расположения общего назначения, которая корректирует Ваш form/dialog/whatever путем принятия всего во внимание и принимает запуск с нуля?

Какую проблему Вы пытаетесь решить?

2
ответ дан 5 December 2019 в 19:04
поделиться

См. http://msdn.microsoft.com/en-us/library/ms701681 (По сравнению с 85) .aspx, это объяснено там (кавычка: "Если Вы не отменяете масштабирование точек на дюйм, этот вызов возвращает значение по умолчанию 96 точек на дюйм".)

1
ответ дан 5 December 2019 в 19:04
поделиться

Я не думаю дисплей изменения DPI, когда размер шрифта изменяется. Windows, вероятно, просто отправляет WM_PAINT и WM_NCPAINT сообщения ко всем открытым окнам, и они перерисовывают себя с помощью тока (теперь большой) системный шрифт.

0
ответ дан 5 December 2019 в 19:04
поделиться

Посмотрите на эти значения в реестре:

Тема Windows XP HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ ThemeManager \ SizeName Возможные значения: NormalSize, LargeFonts и ExtraLargeFonts. Эти значения не зависят от языка .

Классическая тема Windows HKCU \ Панель управления \ Внешний вид \ Текущий Возможные значения: Windows Classic, Windows Classic (большой), Windows Classic (очень большой), Windows Standard, Windows Standard (большой), Windows Standard (очень большой). Обратите внимание, что эти значения зависят от языка .

Windows Vista не поддерживает эту функцию. Если нам нужен более крупный шрифт, просто измените параметр DPI. В этом случае GetDeviceCaps должен работать.

Надеюсь, это поможет.

0
ответ дан 5 December 2019 в 19:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: