[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);
}

ここのスケールは、前回の高解像度画面に合わせたスケールです。.

ズーム倍率がわかれば、ウィンドウを作成するときに必要な座標を自然に取得できます。

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&false&false&ステータス表示=ledone&s)]

上のセクションと下のセクションの他の記事については、私の Qt コレクションを参照してください。. 次のセクションを書くのが本当に面倒です。

https://blog.csdn.net/qq_38844263/category_11578713.html

おすすめ

転載: blog.csdn.net/qq_38844263/article/details/122618575