2013-05-15 58 views
-2

我的應用程序是用VC++(win32)開發的插件。我能找到的解決方案並不適合我。使用DPI更改非MFC應用程序來擴展UI

我有兩個選擇:

  1. 要禁用DPI爲我的DLL插件的變化。這意味着我的插件不會受到DPI更改的影響。
  2. 根據DPI更改縮放所有控件。

請幫忙。

謝謝。

+3

這個問題不是很清楚。你的插件插入什麼應用程序?您不能禁用DPI更改 - 用戶可以隨時更改DPI - 但除非程序聲明它瞭解DPI,否則最新版本的Windows將隱藏應用程序的DPI更改並代表它執行擴展。對於那些尚未完成DPI識別工作的簡單應用程序來說,這可能非常有用,但該設置適用於全過程。你不能只爲你的DLL打開它。如果您的代碼在另一個DPI可識別的應用程序內運行,那麼您唯一的選擇就是支持DPI。 –

+1

問題是什麼? –

+0

對不起,如果我無法表達我的問題。如果解決了兩個選項中的任何一個,我的問題就會解決。 我的問題是: 1.如何限制DPI更改(如果可能)? 2.如何根據DPI更改縮放我的UI元素。 如果有任何更多的輸入需要解決的問題,請讓我知道。我的應用程序是一個DLL或者說一個maya plg-in。 – Sagar

回答

1

1.當某個人重新配置DPI時,禁用DPI對我的應用程序UI的影響。需要幫助:如果可能,如何在程序上做到這一點。

這是不可能的。阿德里安已經告訴過你。 DPI是用戶設置,而不是應用程序設置。如果用戶想要改變他們的DPI,他們可以這樣做。他們也可以應用向後兼容性的黑客來關閉特定應用程序的高DPI,但該功能不適用於應用程序。作爲開發人員,您需要確保您支持高DPI環境,而不是禁用它。

作爲應用程序開發人員,您唯一能做的就是無法指出您的應用程序支持DPI。這大致相當於用粘貼在前額上的「IDIOT」標誌四處走動。你可能會發現人們稍微適應你的缺點,但他們不會很尊重你,並且可能不會經常和你一起出去玩。 Windows將做同樣的事情:它會隱藏關於用戶的實際DPI設置的事實(你無法處理事實),相反它會自動擴展你的界面以匹配。效果是醜陋的。

當然,你也說你正在創建一個插件DLL,它改變了一些東西。 DLL不能改變整個過程的DPI意識,因爲這是由主機應用程序決定的。如果主機應用程序指出它的DPI感知能力很高,那麼您的DLL也必須具備較高的DPI感知能力。這是全部或全部設置,就像「IDIOT」標誌一樣。

2.根據DPI更改縮放我的應用程序的UI。需要幫助:如何確定當前的DPI以及如何相應地縮放用戶界面?是否需要縮放每個組件或其他方式來自動縮放它們。

爲了正確確定當前的DPI設置,您需要指示窗口 你是不是白癡 你的應用是高DPI知道。如上所述,如果你不這樣做,Windows會認爲你無法處理真相併騙你。但是,正如我們上面所建立的,這可能不適用於您,因爲您正在創建一個運行在另一個進程中的DLL,該進程已經將自身建立爲高DPI感知。

因此,您需要做的是確定DPI比例因子。您需要在高DPI環境中運行時相應地擴展您的用戶界面元素。基準DPI設置取爲96。下面的代碼擴展一個SIZE結構(定義的寬度和高度)相對於基準:

void ScaleDpi(SIZE& size) 
{ 
    // Determine the current screen DPI. 
    const HDC hDC = GetDC(NULL); 
    const int dpiX = GetDeviceCaps(hDC, LOGPIXELSX); 
    const int dpiY = GetDeviceCaps(hDC, LOGPIXELSY); 
    ReleaseDC(NULL, hDC); 

    // Perform the scaling. 
    size.cx = MulDiv(size.cx, dpiX, 96); 
    size.cy = MulDiv(size.cy, dpiY, 96); 
} 

然而,如果你遵循良好的設計實踐,你可能不需要手動縮放每個控件。在資源文件中定義窗口和對話框時(例如,使用Visual Studio對話框編輯器),可以用邏輯單位(稱爲DLU或對話框單位)指定佈局。這些單元獨立於任何特定的DPI設置,因此最好使用像素之類的東西。因此,只需幾個控件的簡單對話就不需要特殊的縮放工作。如果您在運行時創建和/或佈置控件,則只需執行手動縮放。

有關如何在MSDN上編寫高DPI感知應用程序的更多提示和技巧,請參閱Writing High-DPI Win32 Applications文章。我並沒有把這只是說RTFM,它實際上非常有幫助,我強烈建議閱讀它。

製作RealWorld圖標和光標編輯的人也在他們的網站上維護一篇有用的文章:DPI-aware applications in Windows Vista and Windows 7

相關問題