Является ли количество пикселей на дюйм стандартным на всех мониторах ПК с Windows? (LogPixelsX) в вызове GetDeviceCaps WinAPI - PullRequest
7 голосов
/ 14 марта 2009

Под дисплеями Windows PC я не имею в виду Windows CE или портативные устройства и т. Д. Разъяснение
Некоторые люди по ошибке ошибочно подумали, что я спрашиваю, что такое DPI (точки на дюйм) на мониторах. Я запрашиваю значение LogPixelsX в вызове API GetCaps :

LOGPIXELSX Количество пикселей на логический дюйм по ширине экрана.

В примерах, которые я видел, установлено значение 88, независимо от значения DPI экрана. Кажется, что-то вроде магического числа константы.

В связанном Вопросе Я использую GetDeviceCaps для вычисления текущего DPI шрифта экрана. Все примеры кода, которые я нашел, имеют:

Const LOGPIXELSX = 88

Это универсально одинаково для всех мониторов (даже широкоэкранные против обычных мониторов)? И если нет, то как мне найти его для текущего дисплея. (MSDN указывает, что он одинаков для всех мониторов на конкретном компьютере.

В системе с несколькими мониторами это значение одинаково для всех мониторов.

Ответы [ 5 ]

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

Чтобы ответить на ваше уточнение вопроса:

LOGPIXELSX - это параметр, который вы передаете в GetDeviceCaps для получения текущего разрешения монитора (технически это разрешение по горизонтали, но все современные дисплеи имеют одинаковое разрешение по горизонтали и вертикали). Да, это всегда 88 - если вы хотите получить другое значение из GetDeviceCaps, вы должны передать другое значение. Например, чтобы получить число бит на пиксель, вы должны передать константу BITSPIXEL, равную 12. Эти магические константы определены в файле Windows API WINGDI.h.

Примечание в MSDN относится не к параметру, а к возвращаемому значению.

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

Windows всегда будет иметь разрешение 96 DPI, если вы не измените его в настройках дисплея. В XP вы найдете его в диалоговом окне «Дополнительно» в разделе «Свойства экрана» -> «Настройки»; Я не знаю, где он находится в других версиях Windows.

Вы правы, что GetDeviceCaps (LOGPIXELSX) вернет DPI, за исключением одного небольшого предупреждения. Начиная с Vista, Windows может лгать вам о вашем фактическом настроенном разрешении. Вам необходимо настроить приложение на DPI, чтобы получить истинное представление о конфигурации. Вот страница Microsoft, содержащая некоторые детали, с особым акцентом на изменения в Windows 7.

http://msdn.microsoft.com/en-us/library/dd464659(VS.85).aspx

И еще одна ссылка:

http://msdn.microsoft.com/en-us/library/ms701681(VS.85).aspx

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

См. SetProcessDPIAware () (для Vista) и GetDeviceCaps (...) для получения DPI.

XP имеет 96 или 120 точек на дюйм. На самом деле в Vista есть ползунок для настройки «континуума» настроек DPI. В Vista DWM заботится о масштабировании ваших приложений, если вы явно не заявите, что вы поддерживаете DPI. Для XP вы должны планировать как 96, так и 120.

1 голос
/ 16 сентября 2010

Для изображения разрешение изображения (DPIX, DPIY) должно приниматься с другим постоянным разрешением монитора. Преобразование переходов в пиксели для изображения dpi выполняется следующим образом:

    public struct RECT_TAG
    {
        public int iLeft;
        public int iTop;
        public int iHeight;
        public int iWidth;
    }
    public static RECT_TAG ConvertTwipsToPixels(RECT_TAG pobjRect, int plXDPI, int plYDPI)
    {
        pobjRect.iLeft = pobjRect.iLeft * plXDPI / 1440;
        pobjRect.iTop = pobjRect.iTop * plYDPI / 1440;
        pobjRect.iWidth = pobjRect.iWidth * plXDPI / 1440;
        pobjRect.iHeight = pobjRect.iHeight * plYDPI / 1440;
        return pobjRect;

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

Две стандартные настройки DPI в Windows: 96 т / д (обычный размер) и 120 т / д (большой размер) , MSDN может иметь ваш ответ.

edit: Я должен уточнить, что под Windows я имею в виду Windows XP

...