2017-06-22 55 views
0

我正在修改我的应用程序以支持高DPI值(高于100%/ 96dpi)。Windows 10 DPI处理和标准对话框

我修改了应用程序的清单文件包括:

<dpiAware>true/PM</dpiAware> 

我能够处理所有的DPI缩放为自己的应用程序的形式,但如何处理标准的Windows对话框(字体选择,打开的文件,文件夹浏览器等)通过WinAPI。有没有办法手动通知窗口,我只希望这些对话框自动缩放为更高的DPI?

*更新*

使用“SetThreadDpiAwarenessContext” WinAPI的功能后,窗户似乎处理缩放,但它通过缩放图像(文字模糊),在这样做的,而不是缩放控件(请记住,这些是标准的Windows控件,就像通过调用“GetOpenFileNameW”生成的那样)。

任何想法如何让窗口正确地绘制开放文件对话框缩放没有模糊的文字?

+1

[This answer](https://stackoverflow.com/a/41305062/7571258)可以帮助。 – zett42

回答

0

谢谢@ zett42,总结未来访问者的联系答案,Win 10 Aniv。版本引入了一个新的“SetThreadDpiAwarenessContext()”函数来设置每个线程的DPI意识,允许您从单独的线程打开标准窗口对话框,并让Windows DPI设置自动处理对话框上的缩放比例。

+2

您在问题中提到的系统对话框通常用作拥有的对话框,可以是模式对话框,也可以是非模式对话框。将它们卸载到另一个线程将产生与其他UI的跨线程窗口层次结构。这不安全。请参阅[跨进程父/子或拥有者/拥有的窗口关系是否合法?](https://blogs.msdn.microsoft.com/oldnewthing/20130412-00/?p=4683)。 – IInspectable

+0

@IInspectable你是对的,用主线程调用hwndOwner句柄(设置模态对话框)的“GetOpenFileNameW”会触发冻结。有没有一个优雅的解决方案(不必禁用在调用窗口上的所有键盘和鼠标输入)? – bLight

+0

我认为你不需要另一个线程。从链接的答案:线程创建的窗口的_DPI意识将取决于窗口创建时的调用线程的DPI意识......如果我正确地理解了这一点,则只需在调用SetThreadDpiAwarenessContext()之前在*主线程中创建一个通用对话框,并在对话框关闭后将其恢复到先前的设置。 – zett42