Как вы можете рассчитать соответствующий размер шрифта, если на компьютере развертывания есть другой DPI шрифта? - PullRequest
1 голос
/ 14 марта 2009

Я пытаюсь определить размер DPI шрифта на целевом компьютере с Windows и изменить шрифт нашего приложения так, чтобы он выглядел так же, как если бы у целевого компьютера было то же dpi, что и у устройства dev. (Таким образом, большее целевое DPI означало бы, что мы сделали бы наши шрифты меньше, чем во время разработки).

Мне интересно, есть ли проблемы с приведенным ниже решением и, в частности, является ли LOGPIXELSX = 88 правильным.

Фон

Я изменяю размеры всех элементов управления и шрифтов в наших формах в соответствии с текущим разрешением экрана Windows. Однако, если у кого-то значение Font DPI установлено выше, мы должны учесть это и сделать шрифт меньшим (чтобы он в конечном итоге соответствовал нужному размеру на экране). Наши шрифты уже довольно большие (тем более что мы изменяем их размеры с разрешением экрана). Дополнительный размер из-за более высокого DPI делает текст слишком большим.

Мое решение до сих пор Из того, что я могу сказать, если мы используем GetDeviceCaps, как показано ниже, а затем получаем CurrentFontDPI и делаем это: (Игнорирование изменения размера шрифта из-за нового разрешения экрана):

NewFontSize = CurrentFontSize * (DevelopmentDPI / CurrentFontDPI)

 Function CurrentFontDPI
  Dim hwnd, hDC, logPix, r As Long
  Dim  LOGPIXELSX=88
  hwnd = GetDesktopWindow()
  hDC = GetDC(hwnd)
  logPix = GetDeviceCaps(hDC,LOGPIXELSX )
  r = ReleaseDC(hwnd, hDC)
  CurrentFontDPI= logPix

конечная функция

К вашему сведению, приведенный выше код является частью более широкой подпрограммы в «связанном SO вопросе] [1]. Я пропустил оставшуюся часть кода, так как казалось, что есть хотя бы одна ошибка (в ней был NewFont = OldFont * (NewDPI-OldDPI), который даст вам нулевой размер шрифта, если DPI не изменился)

[1]: http://www.BungalowSoftware.com тест

1 Ответ

2 голосов
/ 14 марта 2009

Вот хорошая статья от Microsoft о написании приложений с поддержкой DPI. (Обратите внимание, что эта статья отличается от статьи, опубликованной на ваш связанный вопрос.)

LOGPIXELSX - это параметр для системного вызова Windows; это не значение DPI.

В VB6 (IIRC) вы можете использовать отношение TwipsPerPixel (X и Y) во время разработки к TwipsPerPixel (X и Y) во время выполнения в качестве другого способа определения того, как масштабировать. То же, что и отношение DPI, но оно использует встроенные свойства VB.

...