【易语言】强行兼容高DPI
兼容高DPI是个困难的活儿,除非你是用的WPF写界面,其他编程语言都很麻烦(特别是易语言,原生窗体基本别想兼容了。。)
如果自己的程序不针对高DPI做修改,轻则出现界面显示模糊,重则界面显示错乱、文字超出边界。为了让自己的程序能凑合用,我才搞了这个“强行兼容”高DPI。
什么叫“强行兼容”呢?如果是正常兼容,那界面尺寸应该有所放大,放大后依然能正常显示。我这个,只是告诉系统:“我自己能处理高DPI,你别插手捣乱”,但是实际上啥也没做。实际效果就是,界面尺寸跟96DPI(100%缩放)时一样,几乎所有界面都能正常显示(已知简单超文本框有问题)。弊端就是界面显示略小,如果用户屏幕分辨率太高(如2K、4K分辨率),则可能会看不清界面。
毕竟强行兼容嘛,先保证能用,至于用得舒服不舒服,那以后再慢慢说~(等我有高清显示屏再说。。。)
我这个代码就是做了两件事:
- hook GetStockObject,如果参数为DEFAULT_GUI_FONT,就返回固定的9号宋体(避免xp风格的字体缩放导致文字显示溢出)
- 调用SetProcessDPIAware告诉系统我自己能处理高DPI(禁用DPI虚拟化)
由于SetProcessDPIAware需要在所有界面显示前调用,所以我直接做到了模块的“_启动子程序”里,只要引入模块就会自动调用。
是的,使用方法就是如此简单,只要引入模块即可,不需要调用任何模块函数(模块里也没有能调用的函数)。
效果如下:
最后,下载在这儿。
引用的strawhat模块出自“草帽变速齿轮”,很早之前在易语言论坛下载的,抱歉时间太久找不到原帖地址了。也可以用其他任意hook模块代替。
不用这么困难的啊,亲。
直接顶栏 [工具]->[系统配置]->[存根]->[自定义用户清单] 这里加上下面代码就行:
true
此操作对大部分支持“自定义应用程序清单[app.manifest]”的语言均有效。
请看我这个文是什么时候写的,那时候易语言有“自定义用户清单”功能么?
然后你知道xp风格的字体缩放么?它并不受DPI感知影响,但会导致文字显示溢出。
最后还是不推荐用这种方式“强行兼容”,高分屏显示效果很差。
为什么被转义了…
true