上节我们构建了一个较为完整的右键托盘菜单,但当我将软件移动到高分辨率屏幕的时候,出现了一些问题
教程被应用在MediaStateT中
MediaStateT Github项目地址: https://github.com/taxue-alfred/MediaStateT
MediaStateT Gitee项目地址: https://gitee.com/MediaState/MediaStateT
问题引出
Windows对于高分辨率屏幕默认开启了屏幕缩放。如下:
Windows对于鼠标坐标的采集有好几个API,这里就拿GetDesktopWindow
来说
这个API获取的是鼠标在真实分辨率上的位置。也就是未经过缩放的。
但是程序在创建窗口的时候使用的是缩放后的分辨率大小。如果直接调用此API,那么在开启缩放的屏幕上就会出现窗口偏移的情况,鼠标位置越靠右下角偏移的位置也就会越大。
问题解决
这时候就需要另一个API了,GetDpiForWindow
这个函数会返回当前DPI,在Windows中,DPI和缩放系数有一个对应表:
然后我们对其进行实现:
oid MtMediaInfo::get_mouse_cursor() {
//参考:https://docs.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/dpi-related-apis-and-registry-settings?view=windows-11
//https://blog.youkuaiyun.com/qq_21743659/article/details/114312564
POINT p;
GetCursorPos(&p);
HWND hd = GetDesktopWindow();
int zoom = GetDpiForWindow(hd);
float scale = 0;
switch(zoom){
//百分比对应DPI
case 96:
scale = 1.0;
break;
case 120:
scale = 1.25;
break;
case 150:
scale = 1.5;
break;
case 192:
scale = 2.0;
break;
default:
scale = 1;
break;
}
emit got_mouse_cursor(p.x, p.y, scale);
}
这里的scale就是上次讲过的为了适配高分屏的scale了。。
那么知道缩放系数,我们自然可以求得窗口创建的时候所需要的坐标了。
onGot_mouse_cursor:
//Qt6用法。qt5可忽略function
function(x,y,scale){
//这里就是转换后的坐标,直接带入窗口x,y即可
//C++或者其他语言同理。
menu_right.menu_x = x / scale
menu_right.menu_y = y / scale
menu_right.show()
//展现在最上层
menu_right.raise()
}
以上,解决!
看看1080P和3.2K屏幕对比的效果:矢量图在高分辨率表现就是优秀啊
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EKULrlRy-1673854101189)(https://s2.loli.net/2022/01/21/Lgdj3PNxWeM6pam.png#crop=0&crop=0&crop=1&crop=1&id=ixPdm&originHeight=451&originWidth=343&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)]
其他的上下节的文章看我的这个Qt收录吧,。。实在是懒得写上下节了。
https://blog.youkuaiyun.com/qq_38844263/category_11578713.html