2012-05-04 1 views
5

Я работаю над тем, чтобы сделать мое приложение DPI чувствительным, используя this MSDN guide, где техника масштабирования использует логические пиксели X и Y из контекста устройства.Являются ли пикселы когда-либо квадратом на мониторе?

int _dpiX = 96, _pdiY = 96; 
HDC hdc = GetDC(NULL); 
if (hdc) 
{ 
    _dpiX = GetDeviceCaps(hdc, LOGPIXELSX); 
    _dpiY = GetDeviceCaps(hdc, LOGPIXELSY); 
    ReleaseDC(NULL, hdc); 
} 

Тогда вы можете масштабировать X и Y координаты, используя

int ScaleX(int x) { return MulDiv(x, _dpiX, 96); } 
int ScaleY(int y) { return MulDiv(y, _dpiY, 96); } 

Есть ли когда-нибудь ситуация, когда GetDeviceCaps(hdc, LOGPIXELSX) и GetDeviceCaps(hdc, LOGPIXELSY) бы возвращать разные номера для монитора. Единственное устройство, о котором я действительно беспокоюсь, - это монитор, поэтому мне нужно иметь отдельные функции ScaleX(int x) и ScaleY(int y)? Могу ли я использовать только одну функцию Scale(int px)? Будет ли недостаток в этом?

Заранее благодарим за помощь.

ответ

7

Теоретически это возможно, но я не знаю ни одного недавнего монитора, который использует неквадратные пиксели. Есть так много преимуществ для квадратов пикселей, и многие существующие программы предполагают квадратные пиксели, что маловероятно, чтобы основной монитор вышел с неквадратичным пиксельным режимом.

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

Это, как правило, для принтеров, чтобы иметь не квадратные единицы устройства. Многие из них имеют гораздо более высокое разрешение в одном измерении, чем в другом. Некоторые драйверы делают это разрешение доступным для вызывающего. Другие будут казаться, что они имеют квадратные пиксели. Если вы когда-либо захотите повторно использовать свой код для печати, я бы посоветовал вам не ограничивать горизонтальное и вертикальное масштабирование.

+0

Есть много плазменных дисплеев (в основном телевизоров), которые имеют внутреннее разрешение 1024x768, но являются 16: 9. Google "Плазма 1024x768 16: 9" для примеров ". Очень редко это можно найти на мониторе компьютера, но если ее легко запрограммировать, было бы здорово поддержать этот случай! – Chris

+0

@ Крис: Я подозреваю, что аппаратное обеспечение для широкоэкранного дисплея 1024x768 будет применяться преобразование на низком уровне. На уровне драйвера вам будет представлена ​​иллюзия квадратных пикселей, возможно, с помощью виртуального экрана 1280x720 в компоновке 16x9, а аппаратное обеспечение под драйвер будет перепрограммировать квадратные виртуальные пиксели для создания собственных неквадратных пикселей. Я сомневаюсь, что вы сможете адресовать неквадратные нативные пиксели непосредственно на уровне WinAPI. –

2

Аппаратные пиксели ЖК-панелей всегда квадратные. Используя CRT, вы можете иметь прямоугольный квадрат, например, используя разрешение 320x200 или 320x400 на мониторе 4:3 (это разрешение было актуальным). На ЖК-дисплее вы можете получить прямоугольные пиксели, используя неродное разрешение на мониторе - широкоэкранное разрешение на мониторе 5:4 и наоборот.

+0

Неверно. Например, https: // pcmonitors .info/рецензии/Филипс-bdm4065uc / –