1、如果你对DPI等知识什么都不懂,也觉得搞这些很烦的话,那你切记不要在manifest还是调用什么API欺骗windows说你可以自己处理DPI,不然就跟chrome一样,在高DPI下搞成屎,处理不好又要欺骗windows说他能处理就是这个下场。如果你想弄清楚,那继续往下看。
2、虽然你想弄清楚,但是你却不想处理,没问题,用WPF,使用WPF那高级的排版来替你整理界面,不要写死任何控件的坐标,这样DPI的问题就全都解决了。如果你还想知道要怎么处理,继续往下看。
3、好了,从现在开始,你可以去看manifest,也可以去看SetProcessDPIAware等资料的介绍了。然后再也不要给按钮啊什么东西写死一个坐标,这些东西都最好根据文字的尺寸计算出来。如果你用的是Windows Forms,那也没问题,因为每一个控件都提供了这样的功能。你只需要在自绘的时候计算好坐标就好了。其实这并不存在什么技术上的困难,只要你坚持所有坐标都不写死,虽然麻烦事麻烦了点,不怕麻烦的话,还是很容易做到的。
关于按钮的那个问题。想象一下窗口右下角的OK和Cancel。写死坐标有一个坏处,就是当你DPI变大的时候,Cancel也会变大,所以文字无法完全显示在按钮里。这个时候你需要变大按钮。但是变大了Cancel按钮需要导致你OK整体向左移动。WPF、Windows Forms还有www.gaclib.net 都有完善的自动排版功能可以帮你完成这些东西。如果你用的是MFC什么的,那你只能人肉计算了。这还是相当麻烦的。
其实DPI无非就是让你保证你的UI能够容纳下你要显示的所有东西,而且不会有奇怪的效果,譬如说Cancel的按钮里面的Cancel字样没有完全显示之类的。不过简单是简单,但是也是一不小心就容易搞错。WPF、Windows Forms还有www.gaclib.net 都有各自的排版机制来帮助你完成这些东西。切记不要写死任何控件的坐标,除了那些代表间距的数值以外。当然如果你愿意的话,间距也要通过DPI算出来,这样整个UI才漂亮。