簡體   English   中英

真正需要DPI意識嗎?

[英]DPI-awareness is really needed?

我正在學習如何使用GDI / GDI +繪制GUI,我發現了這個http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd756596(v=vs.85).aspx#step_2__declare_that_the_application_is_dpi-aware是否可以每個應用程序都執行該計算,以便可以正確顯示它還是什么?

有人可以解釋如何計算窗口上的按鈕,圖像和所有控件的客戶端坐標,以便它們在不同分辨率下具有相同的對齊方式嗎?

提前致謝。

使用GDI,您可以將GetDeviceCaps函數與LOGPIXELSXLOGPIXELSY一起使用來查找DPI,並使用這些值來縮放大小:

HDC hdc = GetDC(hwnd);
int ppix = GetDeviceCaps(hdc, LOGPIXELSX);
int ppiy = GetDeviceCaps(hdc, LOGPIXELSY);
ReleaseDC(hdc);

// for a control that is 1.5 inches wide and 0.5 inches high.

int ctrl_width = int(1.5 * ppix + 0.5);
int ctrl_height = int(0.5 * ppiy + 0.5);

// for a button that conforms to Microsoft's UI guidelines of 75x23 @ 96dpi.

int btn_width = (75 * ppix + 48) / 96;
int btn_height = (23 * ppiy + 48) / 96;

GDI +使這一過程變得相當簡單:

Graphics g;
g.SetPageUnit(UnitInch);

// now you can specify draw coordinates in inches
// and it'll figure out DPI for you.

請注意,GDI +解決方案僅會影響GDI +繪圖調用,而不會影響GDI調用或控件坐標。

忽視dpi意識開始變得非常痛苦。 顯示技術已經很長一段時間被卡在96 dpi上了,已經20年了。 Vista具有自動dpi縮放功能和易於訪問的“規則”小程序,這改變了游戲規則。 蘋果推動“視網膜”顯示器的推動力才是真正的推動力。 接下來的Apple MacBook擁有2880 x 1800的顯示屏,典型的1024x768窗口將像這樣的顯示屏上的郵票。

基於XAML的類庫(WPF,Silverlight,Metro)完全獨立於分辨率,因此可以輕松實現使其自動化的工具。 HTML和Winforms可以很好地自動縮放。 但是,當然對於GDI幾乎沒有幫助。 在User32中,沒有任何東西牢牢地卡在像素區域中。 您當然可以編寫代碼,但這不是編寫愉快的代碼。 如果出於遺留原因仍在對原始API進行編程,則內置於Vista及更高版本中的自動縮放功能將很有吸引力。 好吧,為了減少工作量,它看起來不會很有吸引力:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM