[Qt6][QML][C++][教程]解决开启屏幕缩放获取鼠标位置不正确问题

上节我们构建了一个较为完整的右键托盘菜单,但当我将软件移动到高分辨率屏幕的时候,出现了一些问题

教程被应用在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和缩放系数有一个对应表:

https://docs.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/dpi-related-apis-and-registry-settings?view=windows-11

然后我们对其进行实现:

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.csdn.net/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.csdn.net/qq_38844263/category_11578713.html

猜你喜欢

转载自blog.csdn.net/qq_38844263/article/details/122618575