Управление изображением MFC изменяет размер, когда поддержка DPI отключена или работает на Win7

Я сделал приложение MFC для моего друга, используя VS2015 в Win10. Это выглядит примерно так же, как в редакторе ресурсов.

этот,

Но когда он запустил приложение на своем компьютере в Win7, растровое изображение в Picture Control увеличивается и закрывает некоторые текстовые поля ниже, что выглядит следующим образом.

этот,

После того, как я искал и понял, это может быть связано с осведомленностью DPI. Я отключил DPI-Awareness на странице свойств Manifest Tool и перестроил. То же самое произошло, даже когда он работает в Win10.

этот

Может ли кто-нибудь помочь мне объяснить причину этого и найти решение, чтобы исправить размер элемента управления изображением? Благодарю.

2 ответа

Решение

Основная проблема заключается в том, что диалог из ресурса всегда измеряется в DLU.

И DLU рассчитываются из размера шрифта, который используется для диалога.

Посмотрите эту статью, как рассчитываются базовые единицы диалога.

Теперь у вас есть статический элемент управления изображением, размер которого указан в DLU. Растровое изображение просто масштабируется в пикселях и никогда не изменяется, когда вы назначаете его статическому диалоговому элементу управления. А поскольку реальный размер статического элемента управления зависит от используемого шрифта, вы получаете разные макеты для вашего диалога и растрового изображения.

И потому что только шрифт изменяется, когда вы выбираете отсутствие поддержки DPI, и потому что шрифт меняется с версии Windows на версию Windows, ваш диалог всегда выглядит по-другому.

Совет: нарисуйте свою картинку и растяните ее соответственно.

Также этот вопрос stackru - хорошие документы и показывает эффект DLU.

А здесь немного кода для автоматического управления размерами изображения.

  1. Автоматическое изменение размера растрового изображения
  2. Простой класс предварительного просмотра изображений с использованием GDI +
  3. CxImage

Обычно я предпочитаю держать контроль в руке, используя SetWindowPos() установить размер изображения, которое я хочу в разных ситуациях. Вы можете использовать ниже две строки, чтобы контролировать / устанавливать положение и размер вашего изображения.

Предположим, что идентификатор Picture Control равен IDC_STATIC2 тогда вы можете использовать как:

CStatic * pStatic = (CStatic *) GetDlgItem(IDC_STATIC2);
pStatic->SetWindowPos(NULL,20,20,50,50,0);
Другие вопросы по тегам