Соответствие между пикселем и мм - PullRequest
0 голосов
/ 12 августа 2011

Я делаю:

        PhysicalParameters()
    {
        IntPtr DeskTopHWND = GetDesktopWindow();
        IntPtr HDC = GetDC(DeskTopHWND);
        int mmX = GetDeviceCaps(HDC, HORZSIZE);
        int mmY = GetDeviceCaps(HDC, VERTSIZE);
        int pxX = GetDeviceCaps(HDC, HORZRES);
        int pxY = GetDeviceCaps(HDC, VERTRES);
        ReleaseDC(DeskTopHWND, HDC);
        double CoeffPIX_MM_X = 1.0 * mmX / pxX;
        double CoeffPIX_MM_Y = 1.0 * mmY / pxY;
    }

Результат для обоих равен 0,25

Но то, что я вижу (MS Word 'WysiWyg), должно быть около 0,27

Пожалуйста, объясните предмет.

Ответы [ 3 ]

2 голосов
/ 12 августа 2011

Типичные ЖК-мониторы имеют плотность 96 пикселей на дюйм. Это соответствует размеру пикселя 0,0104167 дюймов или 0,265 мм.

Однако методы производства сильно различаются, и поэтому размеры пикселей не являются фиксированными. Различные мониторы и устройства будут иметь разную высоту и плотность. Таким образом, короткий ответ - , между пикселями и единицей измерения нет никакой корреляции. Пиксель - это тот размер, который вы (или производитель устройства) хотите иметь.

Ссылки:

0 голосов
/ 12 августа 2011

При вызове GetDeviceCaps для HORZSIZE фактически не получается горизонтальный размер вашего монитора - он получает размер , равный , если бы это был монитор 96 DPI с текущим разрешением.

Конечно, по умолчанию используется значение 96 DPI - пользователи могут установить системное DPI, и если они установят его точно, вы вернете правильное значение для размера монитора. Однако вряд ли кто-то так поступит - поэтому вы почти всегда будете возвращать значения при условии 96 DPI.

0 голосов
/ 12 августа 2011

Каждое устройство будет иметь несколько разные значения HORZSIZE, HORZRES, VERTSIZE и VERTRES.

...