不知道 OP 用不用分辨率缩放。如果用到了缩放,那么 OP 要考虑清楚这一点。
先说事前准备。对于使用了分辨率缩放的应用,只要是用 C 、C++开发的,在开发时需要把这里提到的 XML 保存成 .manifest 文件,嵌入到 vcproject 当中。
https://learn.microsoft.com/en-us/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process做法很简单,我是保存成 dpi_adjust.manifest 文件,直接拖入 Visual Studio 当前项目里面。使用 manifest 文件的好处是不用每次都手动调用 SetProcessDpiAwarenessContext 这个 API 。
不做这个准备的话,程序运行后在高 DPI 环境下是一片模糊的。
准备完成后,麻烦的地方来了。
使用纯 Win32API 来做的话(无论是纯 C 还是 C++),那就要自行调整缩放后的 UI 坐标。UI 内的每个图标、每个文本框等等都要手动调整。
Rufus 的源码就是这样干的,对于每个 UI 资源都要手动调用 GetWindowRect 、MapWindowPoints 调整位置。
像 OP 这种单纯的托盘类应用,其实使用 wxWidgets 都足够了,程序启动后的内存占用 4M 上下,并没有比 Delphi 、VB6 多很多。最重要的是,如果使用了 wxWidgets 之类的 UI 框架,框架自身已经包含了缩放所需的计算,无须使用者操心。