我的應用程序是用VC++(win32)開發的插件。我能找到的解決方案並不適合我。使用DPI更改非MFC應用程序來擴展UI
我有兩個選擇:
- 要禁用DPI爲我的DLL插件的變化。這意味着我的插件不會受到DPI更改的影響。
- 根據DPI更改縮放所有控件。
請幫忙。
謝謝。
我的應用程序是用VC++(win32)開發的插件。我能找到的解決方案並不適合我。使用DPI更改非MFC應用程序來擴展UI
我有兩個選擇:
請幫忙。
謝謝。
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。
這個問題不是很清楚。你的插件插入什麼應用程序?您不能禁用DPI更改 - 用戶可以隨時更改DPI - 但除非程序聲明它瞭解DPI,否則最新版本的Windows將隱藏應用程序的DPI更改並代表它執行擴展。對於那些尚未完成DPI識別工作的簡單應用程序來說,這可能非常有用,但該設置適用於全過程。你不能只爲你的DLL打開它。如果您的代碼在另一個DPI可識別的應用程序內運行,那麼您唯一的選擇就是支持DPI。 –
問題是什麼? –
對不起,如果我無法表達我的問題。如果解決了兩個選項中的任何一個,我的問題就會解決。 我的問題是: 1.如何限制DPI更改(如果可能)? 2.如何根據DPI更改縮放我的UI元素。 如果有任何更多的輸入需要解決的問題,請讓我知道。我的應用程序是一個DLL或者說一個maya plg-in。 – Sagar