В Win81+ процес без dpi, разберете коефициента на мащаба

Имам проблем, тъй като кодирам за процес, който не е запознат с dpi, докато не се появи корекция на грешка.

Така че засега трябва да свърша работа. Мисълта ми е следната: изчислете коефициента на мащабиране и дайте ширината/височината на моите елементи намалени с толкова.

Така че точно сега рисувам платно, което е с пълна ширина и височина на втория монитор, то е 1920 x 1080 (ШxВ). Но визуално (както е измерено от Photoshop след екранна снимка) излиза, че е 2880 x 1620. Това е коефициент на увеличение от 1,5 (2880 делено на 1920 или 1620 делено на 1080).

Опитах се да получа dpi с методи на GetDeviceCaps и EnumDisplaysettings, но всички те върнаха това на основния монитор (забележка: EnumDisplaySettings задава dmLogPixels, което според мен е DPI на 0, ако направя EnumDisplaySettings с constnat на ENUM_REGISTRY_SETTINGS, така че трябваше да използвам ENUM_CURRENT_SETTINGS).

Единственият метод, който открих, че връща по различен начин, е GetDpiForMonitor с MONITOR_DPI_TYPE constnat от MDT_Angular_DPI или MDT_Raw_DPI, ако използвам MDT_Effective_DPI, той дава това на основния монитор.

И така, това са моите резултати от изпълнението на GetDpiForMonitor:

Нито една от вторичните стойности, разделени на първичните, не ми дава фактор на мащабиране 1,5. Има ли все пак този коефициент на мащабиране?

Благодаря


person Noitidart    schedule 20.07.2015    source източник
comment
msdn.microsoft.com/ en-us/library/windows/desktop/   -  person Hans Passant    schedule 20.07.2015
comment
Благодаря @HansPassant!   -  person Noitidart    schedule 20.07.2015
comment
@HansPassant моят начин да използвам EnumDisplaySettings беше готин, ако DPI беше зададен по подразбиране. Ако потребителят отиде в панела и направи текст по-голям, той няма да работи правилно. Така че исках да използвам вашата LogicalToPhysicalPointForPerMonitorDPI функция, но за това тя се нуждае от hwnd към прозорец. Има ли начин да му предам hmon на монитор?   -  person Noitidart    schedule 30.10.2015


Отговори (1)


Току-що имах идея и работи. Получавам мащабираната височина/широчина с някой от трите метода, посочени във въпроса ми тук: Неправилна ширина и височина за втори монитор от GetMonitorInfo и GetDeviceCaps

  • GetDeviceCaps on hdcScreen or
  • GetMonitorInfo or
  • EnumDisplayMonitors

След това го разделям на ширината/височината от EnumDisplaySettings.

Това е единственият начин, по който открих, има ли друг начин? Могат ли експертите да проверят.

person Noitidart    schedule 20.07.2015