前のセクションでは、比較的完全な右クリック トレイ メニューを作成しましたが、ソフトウェアを高解像度画面に移動すると、いくつかの問題が発生しました。
チュートリアルは 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.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 コレクションを参照してください。. 次のセクションを書くのが本当に面倒です。