找回密码
 加入
搜索
查看: 1142|回复: 12

[GUI管理] win10缩放125%,150%导致获取坐标不准确。

[复制链接]
发表于 2022-9-13 10:57:30 | 显示全部楼层 |阅读模式
win10缩放125%,150%导致获取坐标不准确。100%写好了脚本,系统缩放不是100%了,坐标位置就变动了。如果获取125%,150%的系统状态,多做几遍适配也行。但是找了好久好像没有很好的解决办法
发表于 2022-9-13 18:34:22 | 显示全部楼层
Func get_Desktop_Scale()
        $hDC = _WinAPI_GetDC(0)
        $Scale = _WinAPI_GetDeviceCaps($hDC, 118) / @DesktopWidth
        _WinAPI_ReleaseDC($hGUI, $hDC)
        Return $Scale
EndFunc   ;==>get_Desktop_Scale


;1.获取显示的缩放比例
;2.坐标乘以scale(缩放比率)
发表于 2022-9-13 18:20:59 | 显示全部楼层
获取DPI值 /96得到缩放比例,坐标*比例
 楼主| 发表于 2022-9-14 09:14:40 | 显示全部楼层
afan 发表于 2022-9-13 18:20
获取DPI值 /96得到缩放比例,坐标*比例

试了几个函数,但是都不行,console输出的比例都相同,无论是125% or 150%
发表于 2022-9-14 12:12:00 | 显示全部楼层
使用1楼的代码得到了正确的缩放倍率,现在有个问题,是不是每行代码的   左侧,顶部, 宽度,高度   这4项都要分别乘倍率,示例如下

Func get_Desktop_Scale()
        Local $hDC, $Scale, $hGUI
        $hDC = _WinAPI_GetDC(0)
        $Scale = _WinAPI_GetDeviceCaps($hDC, 118) / @DesktopWidth
        _WinAPI_ReleaseDC($hGUI, $hDC)
        Return $Scale
EndFunc   ;==>get_Desktop_Scale
Local $HiDpi = get_Desktop_Scale()

;GUI窗口和按钮
$GUI = GUICreate("测试", $HiDpi * 322, $HiDpi * 200)
;标签
GUICtrlCreateLabel("系统DPI自适应测试", $HiDpi * 87, $HiDpi * 61, $HiDpi * 230, $HiDpi * 15)

GUISetState(@SW_SHOW)


有没有简单点的代码,不必要每行代码都要乘倍率就能自动全局自适应

发表于 2022-9-14 13:09:55 | 显示全部楼层
h111666b 发表于 2022-9-14 12:12
使用1楼的代码得到了正确的缩放倍率,现在有个问题,是不是每行代码的   左侧,顶部, 宽度,高度   这4项都 ...

在 100% 缩放状态下编写好GUI代码
前面添加 Opt("GUIResizeMode", 1)
获取 DPI 缩放比例
根据比例 WinMove() 缩放窗口大小即可,内部控件均会等比例放大。若有特殊限位再调整控件坐标
发表于 2022-9-14 13:46:44 | 显示全部楼层
刚刚试了下,不会弄,DPI缩放比例是1.25,就是不起效,老大帮忙下

;缩放比例
$DPI = 1.25
;GUI窗口和按钮
$GUI = GUICreate("测试", $HiDpi * 322, $HiDpi * 200)

;这一行不会弄,DPI缩放是1.25
WinMove($GUI, "", Default * $DPI, Default * $DPI, $Width * $DPI, $Height * $DPI)

;标签
GUICtrlCreateLabel("系统DPI自适应测试", $HiDpi * 87, $HiDpi * 61, $HiDpi * 230, $HiDpi * 15)

GUISetState(@SW_SHOW)
发表于 2022-9-14 14:04:43 | 显示全部楼层
本帖最后由 afan 于 2022-9-14 14:16 编辑
h111666b 发表于 2022-9-14 13:46
刚刚试了下,不会弄,DPI缩放比例是1.25,就是不起效,老大帮忙下

;缩放比例

DllCall('User32.dll', 'BOOL', 'SetProcessDPIAware')

Opt("GUIResizeMode", 1)

;GUI窗口和按钮
$GUI = GUICreate("测试", 322, 200)
;标签
GUICtrlCreateLabel("系统DPI自适应测试", 87, 61, 230, 15)
;缩放比例
$DPI = 1.25
WinMove($GUI, "", Default, Default, 322 * $DPI, 200 * $DPI)
GUISetState(@SW_SHOW)
Sleep(2000)

发表于 2022-9-14 15:10:58 | 显示全部楼层
已经完美自动适应,感谢老大,还有个小问题,WinMove执行后GUI窗口在屏幕上居中不了,有点偏右,不能自动居中
发表于 2022-9-14 15:16:48 | 显示全部楼层
居中问题已经解决,善用搜索能解决很多问题,论坛窗口居中贴https://www.autoitx.com/forum.ph ... hlight=%BE%D3%D6%D0
 楼主| 发表于 2022-9-14 22:15:34 | 显示全部楼层
afan 发表于 2022-9-14 13:09
在 100% 缩放状态下编写好GUI代码
前面添加 Opt("GUIResizeMode", 1)
获取 DPI 缩放比例

厉害了,我也成功了。用au3写的窗口没问题。但是想适配第三方的程序不会弄


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2022-9-14 23:09:58 | 显示全部楼层
6053377 发表于 2022-9-14 22:15
厉害了,我也成功了。用au3写的窗口没问题。但是想适配第三方的程序不会弄

如果是标准控件,可以试试
#Include <GuiListView.au3>
_GUICtrlListView_SetColumnWidth(获取的listview句柄, 3, 宽度值)
 楼主| 发表于 2022-9-15 08:59:23 | 显示全部楼层
afan 发表于 2022-9-14 23:09
如果是标准控件,可以试试
#Include
_GUICtrlListView_SetColumnWidth(获取的listview句柄, 3, 宽度值 ...

谢谢老大

字数补丁
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-27 12:06 , Processed in 0.075473 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表