2013-05-15 3 views
-2

Мое приложение - плагин, разработанный в VC++ (win32). Решения, которые я мог найти, не помогли мне.Масштабирование пользовательского интерфейса с изменением DPI приложения без MFC

У меня есть два варианта:

  1. Чтобы отключить DPI изменения моей DLL плагин. Это означает, что мои плагины не будут затронуты изменениями DPI.
  2. Чтобы масштабировать все элементы управления в соответствии с изменением DPI.

Пожалуйста, помогите.

Спасибо.

+3

Вопрос не очень ясен. В какое приложение подключается плагин? Вы не можете отключить изменения DPI - пользователь может изменить DPI в любое время, но если программа заявляет, что она понимает DPI, последние версии Windows будут скрывать изменения DPI от приложения и делать масштабирование от его имени. Это может быть полезно для простых приложений, которые не работали с DPI, но эта настройка применяется в широком масштабе. Вы не можете включить его только для своей DLL. Если ваш код работает внутри другого приложения, которое поддерживает DPI, то ваш единственный выбор - это DPI-aware. –

+1

И в чем вопрос? –

+0

Извините, если я не могу выразить свой вопрос. Моя проблема будет решена, если будет разрешен какой-либо из двух вариантов. Мой вопрос: 1. Как я могу ограничить свой интерфейс пользователя от изменения DPI (если возможно)? 2. Как я могу масштабировать элементы пользовательского интерфейса в соответствии с изменением DPI. Если вам требуется дополнительная информация, пожалуйста, сообщите мне об этом. Мое приложение представляет собой DLL или скажет майя plg-in. – Sagar

ответ

1

1. Отключить влияние DPI на пользовательском интерфейсе приложения, если какой-либо один повторно настроит DPI. Необходимая помощь: если это возможно, как это сделать программно.

Это невозможно. Адриан уже тебе это сказал. DPI - это настройка , а не настройка приложения. Если пользователь хочет изменить свой DPI, они могут это сделать. Они также могут применять хакеры с обратной совместимостью, которые отключают высокий DPI для конкретного приложения, но эта функциональность недоступна для приложений. Как разработчик, вы должны убедиться, что поддерживаете высокую среду DPI, а не отключите ее.

Единственное, что вы можете сделать в качестве разработчика приложения, - это не указать, что ваше приложение поддерживает DPI. Это примерно эквивалентно ходьбе с знаком «IDIOT», прикрепленным к вашему лбу. Возможно, вы обнаружите, что люди немного более восприимчивы к вашим недостаткам, но они не будут очень уважать вас и, вероятно, не будут часто болтаться с вами. Windows будет делать то же самое: он скроет от вас правду о фактических настройках DPI пользователя (вы не можете справиться с правдой), и вместо этого он автоматически расширит ваш интерфейс, чтобы соответствовать. Эффект уродливый.

Конечно, вы также говорите, что вы создаете подключаемую DLL-версию, которая меняет ситуацию. DLL не могут изменить DPI-осведомленность всего процесса, поскольку это определяется хост-приложением. Если хост-приложение указывает, что это высокий уровень информированности DPI, ваша DLL также должна быть высокой. Это все или ничего, как знак «IDIOT».

2. Масштабируйте пользовательский интерфейс моего приложения в соответствии с изменением DPI. Необходимая помощь: как определить текущий DPI и как масштабировать интерфейс? Нужно ли масштабировать каждый компонент или любой другой способ автоматически их масштабировать.

Для того, чтобы правильно определить текущие настройки DPI, необходимо указать Windows, что вы не идиот вашего приложения высокий DPI известно. Как обсуждалось выше, если вы этого не сделаете, Windows предположит, что вы не можете справиться с правдой и лгать вам. Но, как мы также установили выше, это, вероятно, не относится к вам, потому что вы создаете DLL, которая работает в контексте другого процесса, который уже устанавливает себя как высокий уровень DPI.

Итак, вам нужно определить масштабный коэффициент DPI. Это необходимо для масштабирования элементов пользовательского интерфейса при работе в средах с высоким уровнем DPI. Базовая установка DPI принимается равной 96.Следующий код масштабирует SIZE структуру (которая определяет ширину и высоту) по отношению к базовой линии:

void ScaleDpi(SIZE& size) 
{ 
    // Determine the current screen DPI. 
    const HDC hDC = GetDC(NULL); 
    const int dpiX = GetDeviceCaps(hDC, LOGPIXELSX); 
    const int dpiY = GetDeviceCaps(hDC, LOGPIXELSY); 
    ReleaseDC(NULL, hDC); 

    // Perform the scaling. 
    size.cx = MulDiv(size.cx, dpiX, 96); 
    size.cy = MulDiv(size.cy, dpiY, 96); 
} 

Однако, если вы будете следовать надлежащей практике проектирования, вы не можете масштабировать каждое управление вручную. При определении окон и диалогов в файле ресурсов (например, с помощью редактора диалоговых окон Visual Studio) вы указываете макет в логических единицах (известных как DLU или диалоговые блоки). Эти блоки не зависят от какой-либо конкретной настройки DPI и поэтому предпочтительнее использовать что-то вроде пикселей. Поэтому простой диалог с несколькими элементами управления не требует особых усилий по масштабированию. Вам нужно всего лишь выполнить ручное масштабирование, если вы создаете и/или устанавливаете элементы управления во время выполнения.

В статье Writing High-DPI Win32 Applications вы найдете больше советов и методик написания приложений с высоким разрешением DPI в MSDN. И я не связываю это просто, чтобы сказать RTFM - это действительно очень полезно, и я настоятельно рекомендую прочитать все это.

Люди, которые делают Редактор иконок и курсоров RealWorld также содержат полезную статью на своем сайте: DPI-aware applications in Windows Vista and Windows 7.

Смежные вопросы