簡體   English   中英

C#縮放UserControl內容以匹配用戶Dpi /字體大小

[英]C# Scaling UserControl content to match users Dpi/Font Size

如何讓OwnerDrawn UserControl尊重用戶dpi(96/120 / xxx)和/或font-size(正常,大,超大)?

有些人建議在Graphics對象上使用DpiX和DpiY屬性,但這似乎對我控制中的任何東西都沒有(即它們總是設置為96,無論我選擇哪種字體大小或dpi)。

StackOverflow上還有另一個類似的問題,它建議使用AutoScale屬性,但建議的解決方案也沒有做任何事情。

除了依賴WPF之外,在.NET中沒有辦法做到這一點嗎?

您需要將UserControl的AutoScaleMode屬性設置為AutoScaleMode.Dpi,而不是將AutoScale屬性設置為true。 如果這樣做,它會將AutoScaleMode重置為None。 AutoScale屬性已過時,僅用於向后兼容(請參閱本MSDN文章中重要說明 )。

此外,在Windows Vista / 7中,除非明確指定應用程序支持DPI,否則Windows將模擬默認DPI環境,以便應用程序使用96 DPI進行渲染,然后將生成的位圖縮放到適當的大小。 為了避免這種情況,你可以改變你的應用程序清單,以通知Windows您實際上DPI知道-請參閱使用清單申報新聞部認識部分這篇文章

我有同樣的問題,我嘗試使用GetDC + GetDeviceCaps + ReleaseDC,除了使用Graphics工作,至少在Vista32上。 我對DPI沒有經驗,但沒有人回答這個問題,至少這可能對其他人有幫助。

查看創建DPI感知應用程序 這提到為什么它可能總是返回96,無論實際的DPI設置如何。

從上面鏈接引用:

Win32應用程序中的DPI擴展

在Win32應用程序中,執行以下操作:

  • 使用SetProcessDPIAware函數取消dpi縮放。
  • 在調整繪制的界面元素大小時,請使用物理測量,例如厘米。 通過使用物理尺寸而不是像素,可以確保在所有類型的顯示器上保持一致的尺寸。
  • 要獲得系統dpi設置,請使用帶有LOGPIXELSX標志的CDC :: GetDeviceCaps函數。 如果不取消dpi縮放,則此調用將返回默認值96 dpi。
  • 使用GetSystemMetrics函數獲取用戶界面元素的首選大小,例如窗口邊框。 禁用dpi縮放時,為界面元素返回的測量值將縮放為所選的dpi設置。 如果dpi縮放處於活動狀態,則無論系統dpi設置如何,該函數都將根據96 dpi返回測量值。

回答: 關於DPI問題

使用 -statement( 原始源 )重寫的示例代碼:

float dpiX = 96, dpiY = 96;
using(Graphics graphics = this.CreateGraphics())
{
    dpiX = graphics.DpiX;
    dpiY = graphics.DpiY;
}

暫無
暫無

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

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