找回密码
 加入
搜索
楼主: anythinging

关于gui如何免受系统缩放的影响

[复制链接]
 楼主| 发表于 2023-9-23 17:52:09 | 显示全部楼层
本帖最后由 anythinging 于 2023-9-23 17:54 编辑
w60711 发表于 2023-9-22 20:28
因為我有設置字體大小啊

还想请教下,如何有子窗口的情况下,如何操作? 子窗口不是不显示就是没生效
#Region 編譯資訊
;;使用管理員權限
#RequireAdmin
;;無系統匣圖示
;;#NoTrayIcon
;;https://www.autoitscript.com/wiki/AutoIt3Wrapper_Directives
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Icon=l2.ico
#AutoIt3Wrapper_UseX64=n
;;評論欄
#AutoIt3Wrapper_Res_Comment=
;;描述字段
#AutoIt3Wrapper_Res_Description=
;;文件版本
#AutoIt3Wrapper_Res_Fileversion=3.0.0.0
;;產品版本,默認是使用的 AutoIt3 版本。
;;#AutoIt3Wrapper_Res_ProductVersion=3.0.0.0
;;版權領域
#AutoIt3Wrapper_Res_LegalCopyright=Copyright © 2022
;;資源語言代碼
#AutoIt3Wrapper_Res_Language=1028
;;請求可用的最高權限
#AutoIt3Wrapper_Res_requestedExecutionLevel=highestAvailable
;;Dpi感知
#AutoIt3Wrapper_Res_HiDpi=y
#cs
        #AutoIt3Wrapper_res_Compatibility=Windows7
        #AutoIt3Wrapper_Res_Field=AutoIt 版本|%AutoItVer%
        #AutoIt3Wrapper_Res_Field=短日期格式的 PC 日期|%date%
        #AutoIt3Wrapper_Res_Field=長日期格式的 PC 日期|%longdate%
        #AutoIt3Wrapper_Res_Field=PC 時間格式|%time%
#ce
#EndRegion 編譯資訊

;;原始碼檢錯
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 6 -w 7
;;#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7
#cs
        Au3Check [-q] [-d] [-w[-] n]... [-v[-] n]... [-I dir]... file.au3

        -q : 靜態 (僅輸出錯誤/警告)
        -d : 等價於 Opt("MustDeclareVars", 1)
        -w 1: 已包含檔案 (打開)
        -w 2: 缺少 # comments-end (打開)
        -w 3: 變數已聲明 (關閉)
        -w 4: 局部變數在全域範圍內使用 (關閉)
        -w 5: 局部變數已聲明, 但未使用 (關閉)
        -w 6: 使用 Dim 時警告 (關閉)
        -w 7: 傳遞常數或表示式到 ByRef 時警告 (打開)
        -I dir: 搜尋其他目錄的包含檔案

        -v 1: 顯示包含路徑/檔案 (關閉)
        -v 2: 顯示詞法標記 (關閉)
        -v 3: 顯示未引用 UDF 和全域變數 (關閉)

        退出程式碼:
        0: 成功: 沒有錯誤或警告
        1: 警告
        2: 語法錯誤
        3: 使用或輸入錯誤
#ce


#cs ____________________________________

        Au3版本:3.3.14.5
        SciTE版本:3.6.6
        腳本作者:

        腳本功能:
        參考代碼:

#ce _______________腳本開始_________________


#Region 載入Fuction
#include <WinAPI.au3>
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <WinAPIEx.au3>
#include <TreeViewConstants.au3>


#EndRegion 載入Fuction



#Region 前置工作
;;判斷是否以管理員身份執行
Local $Admin
If IsAdmin() Then
        $Admin = "目前以管理員權限執行"
Else
        $Admin = "目前非管理員權限執行,可能造成部份功能無法使用。"
        MsgBox(262144 + 48, '權限提示', $Admin)
EndIf

;;切換起始目錄工作目錄到腳本所在路徑
FileChangeDir(@ScriptDir)
;;防止重複執行
_Singleton(@ScriptName)
#EndRegion 前置工作


#Region 宣告變數
Global $HiDpi

Global $MainGuiWidth = 700 ;;介面寬
Global $MainGuiLength = 500 ;;介面高

;;全局字體及大小(備用字體:'Comic Sans Ms'、'YaHei Consolas Hybrid')
Global $FontSize = 12, $Font_Xing = 400, $Font_Var = Default, $Font_Quality = 5
;~ Global $Font_Name = 'Microsoft JhengHei'
Global $Font_Name = '微软雅黑'

Global $Title = '最佳程式碼實現 DPI-自適應縮放'
Global $Version = 'v1.2.0.0 2022.11.04'
Global $Author = ''
Global $Copyright = $Author & ' 2022 Unlicense.' ;;版權宣告

Global Const $FileLogPath = @ScriptDir & '\_Log\' & @YEAR & "_" & @MON & "_" & @MDAY & ".log"
Global $AutoIt_Error = ObjEvent("AutoIt.Error", "_AutoIt_Error") ;;攔截Com錯誤
Global $LogFlag = 'N' ;;啟用Log模式

#EndRegion 宣告變數


#Region Opt模式
Opt("GUIResizeMode", 1) ;;設定GUI默認縮放模式,afan版主提供
Opt("GUIOnEventMode", 1) ;;使用事件模式


#EndRegion Opt模式

;;判斷是否編譯,使用不同策略設定和取得DPI
If @Compiled Then
                If _IsProcessDPIAware() Then
                                $HiDpi = _GetDpi()
                Else
                                $HiDpi = 1
                EndIf
Else
                _SetProcessDPIAware()
                $HiDpi = _GetDpi()
EndIf


Global $MainGUI,$hGuiCSUB
_MainGui()
_SubMainB()

Func _MainGui()
        $MainGUI = GUICreate('test', 565, 570, -1, -1,BitOR($WS_SIZEBOX,$WS_SYSMENU,$WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_BORDER))
        GUISetFont($FontSize, $Font_Xing, $Font_Var, $Font_Name, $MainGUI, $Font_Quality) ;;全局字型
        GUISetOnEvent(-3,'_exit')
        Local $idTreeview = GUICtrlCreateTreeView(0, 0, 150, 430)
        GUICtrlCreateTreeViewItem(" 测试菜单 AAA", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 001   ",$idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 002   ", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 003   ", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 004   ", $idTreeview)
    GUICtrlCreateTreeViewItem(" 测试菜单 005   ", $idTreeview)
        DPI_Zoom($MainGUI, $HiDpi) ;;以Dpi進行視窗調整
        GUISetState(@SW_SHOW,$MainGUI)
EndFunc

Func _SubMainB()
        $hGuiCSUB = GUICreate("子 GUI1", 410, 600, 151, 1, $WS_CHILD, $WS_EX_CLIENTEDGE, $MainGUI)
        GUISetFont($FontSize, $Font_Xing, $Font_Var, $Font_Name, $hGuiCSUB, $Font_Quality) ;;全局字型

        GUICtrlCreateLabel("测 试 文 字", 160, 10, 90, 25)

        GUICtrlCreateLabel("", 260, 17, 50, 32)

        GUICtrlCreateLabel("测 试 文 字", 20, 40, 100, 32)
        GUICtrlCreateLabel("测 试 文 字", 20, 70, 100, 32)
        GUICtrlCreateLabel("测 试 文 字", 20, 100, 100, 32)

        GUICtrlCreateInput('Asaasdasdasdasdsar', 110, 40, 260, 25)
        GUICtrlCreateInput('Asaasdasdasdasdsar', 110, 70, 260, 25)
        GUICtrlCreateInput('Asaasdasdasdasdsar', 110, 100, 260, 25)

        GUICtrlCreateLabel("第一组测试文字", 25, 295, 120, 25)
        GUICtrlCreateInput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 295, 238, 23)
        GUICtrlCreateLabel("第二组测试文字", 25, 325, 120, 25)
        GUICtrlCreateInput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 325, 238, 23)
        GUICtrlCreateLabel("第三组测试文字", 25, 355, 120, 25)
        GUICtrlCreateInput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 355, 238, 23)

        GUICtrlCreateButton('测 试 按 钮',20,385,370,25)
        GUICtrlCreateLabel("测试文字", 25, 427,120,25)
        GUICtrlCreateButton('测试按钮',120,425,80,25)
        GUICtrlCreateButton('测试按钮',215,425,80,25)
        GUICtrlCreateButton('测试按钮',310,425,80,25)
;~         DPI_Zoom($hGuiCSUB, $HiDpi) ;;以Dpi進行視窗調整
        GUISetState(@SW_SHOW,$hGuiCSUB)
EndFunc



;;GUISetState(@SW_LOCK, $MainGUI) ;;鎖定
;;GUISetState(@SW_UNLOCK, $MainGUI) ;;解除鎖定


While 1
        Sleep(500)
WEnd


#Region 基本函式
Func _Exit() ;;離開軟體
                If MsgBox(262144+36, '', '確定要退出嗎?', 0, $MainGUI) = 6 Then
                                Exit
                EndIf
EndFunc

Func _AutoIt_Error($oError)
                If $LogFlag <> 'Y' Then Return

                Local $errinfo = ""
                ;;Do anything here.
                $errinfo = @ScriptName & " (" & $oError.scriptline & ") AutoIt.Error : ==> COM Error intercepted !" & @CRLF & '---------------------' & @CRLF &  _
                                @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
                                @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
                                @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
                                @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
                                @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
                                @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
                                @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
                                @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
                                @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF
                _log($errinfo)
EndFunc   ;==>_AutoIt_Error

Func _log($text)
    _FileWriteLog($FileLogPath, $text)
EndFunc   ;==>_log
#EndRegion 基本函式


#Region DPI函式
Func DPI_Zoom($hGUI, $hDpi) ;;縮放GUI,bfgxp提供
                GUISetState(@SW_HIDE, $hGUI)
                Local $aPos = WinGetPos($hGUI)
                WinMove($hGUI, "", $aPos[0] - ($aPos[2] * $hDpi-$aPos[2])/2, $aPos[1] - ( $aPos[3] * $hDpi- $aPos[3])/2, $aPos[2] * $hDpi, $aPos[3] * $hDpi)
                #cs
                                1.GUICreate建立的窗口大小是不包含邊框的,而WinMove改變窗口大小卻是包含邊框的。所以在WinMove之前,最好用WinGetPos獲取包含邊框的真實窗口大小,以便WinMove按比例放大
                                2.字型放大,經過我在不同DPI中的測試,最佳為 原字號 * (($HiDpi - 1) / 64 + 1)

                                另外提示愛玩的朋友:
                                WinMove之前的GUISetState(@SW_HIDE)很重要,沒有這個窗口中的控制項不會自動調整大小與位置
                #ce
EndFunc

Func _SetProcessDPIAware()
                Local $aRet
                If @OSBuild < 9600 Then ;;判斷系統版本 win8.1(9600)
                                $aRet = DllCall("User32.dll", "BOOL", "IsProcessDPIAware") ;檢查處理程序是否支援DPI感知
                                Return $aRet[0]
                                If $aRet[0] = False Then
                                                $aRet = DllCall('User32.dll', 'BOOL', 'SetProcessDPIAware') ;設定:系統DPI感知
                                                If @error Then Return SetError(@error, 0, False)
                                                Return
                                EndIf
                Else
                        $aRet = DllCall("Shcore.dll", "BOOL", "GetProcessDpiAwareness", "HWND", 0, "int*", 0) ;檢查處理程序是否支援DPI感知
                        If @error Then Return SetError(@error, 0, False)
                        If $aRet[2] <> 2 Then ;;0:不支援DPI感知,1:系統DPI感知,2:監視器DPI感知
                                        $aRet = DllCall("Shcore.dll", "BOOL", "SetProcessDpiAwareness", "int", 2) ;設定:監視器DPI感知
                                        If @error Then Return SetError(@error, 0, False)
                                        Return
                        EndIf
                EndIf
EndFunc   ;==>_SetProcessDPIAware

Func _GetDpi()
                Local $iDPI
                If @OSBuild < 9600 Then ;;判斷系統版本 win8.1(9600)
                                $iDPI = RegRead("HKCU\Control Panel\Desktop\WindowMetrics", "AppliedDPI")
                Else
                                Local $hWnd = _WinAPI_MonitorFromWindow(_WinAPI_GetDesktopWindow())
                                Local $aRet = DllCall("Shcore.dll", "BOOL", "GetDpiForMonitor", "HANDLE", $hWnd, "int", 0, "int*", 0, "int*", 0)
                                If @error Then Return SetError(@error, 0, False)
                                $iDPI = $aRet[3]
                EndIf
                If $iDPI < 96 Or $iDPI > 480 Then $iDPI = 96
                Return $iDPI / 96
EndFunc   ;==>_GetDpi

Func _IsProcessDPIAware()
                Local $aRet, $aDpi = 0
                If @OSBuild < 9600 Then ;;判斷系統版本 win8.1(9600)
                                $aRet = DllCall("User32.dll", "BOOL", "IsProcessDPIAware") ;檢查處理程序是否支援DPI感知
                                If @error Then Return SetError(@error, 0, False)
                                $aDpi = $aRet[0]
                Else
                                $aRet = DllCall("Shcore.dll", "BOOL", "GetProcessDpiAwareness", "HWND", 0, "int*", 0) ;檢查處理程序是否支援DPI感知
                                If @error Then Return SetError(@error, 0, False)
                                $aDpi = $aRet[2]
                EndIf
                Return $aDpi
EndFunc   ;==>_IsProcessDPIAware
#EndRegion DPI函式
发表于 2023-9-23 18:41:57 来自手机 | 显示全部楼层
编译选项里就有接管系统缩放,程序自己控制。不过字体缩放无法避免。自适应缩放控件需要代码中自己实现。
发表于 2023-9-24 03:23:47 | 显示全部楼层
anythinging 发表于 2023-9-23 17:52
还想请教下,如何有子窗口的情况下,如何操作? 子窗口不是不显示就是没生效

不確定有沒有效果
有點忙...你先試試看
#Region 編譯資訊
;;使用管理員權限
#RequireAdmin
;;無系統匣圖示
;;#NoTrayIcon
;;https://www.autoitscript.com/wiki/AutoIt3Wrapper_Directives
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Icon=l2.ico
#AutoIt3Wrapper_UseX64=n
;;評論欄
#AutoIt3Wrapper_Res_Comment=
;;描述字段
#AutoIt3Wrapper_Res_Description=
;;文件版本
#AutoIt3Wrapper_Res_Fileversion=3.0.0.0
;;產品版本,默認是使用的 AutoIt3 版本。
;;#AutoIt3Wrapper_Res_ProductVersion=3.0.0.0
;;版權領域
#AutoIt3Wrapper_Res_LegalCopyright=Copyright © 2022
;;資源語言代碼
#AutoIt3Wrapper_Res_Language=1028
;;請求可用的最高權限
#AutoIt3Wrapper_Res_requestedExecutionLevel=highestAvailable
;;Dpi感知
#AutoIt3Wrapper_Res_HiDpi=y
#cs
        #AutoIt3Wrapper_res_Compatibility=Windows7
        #AutoIt3Wrapper_Res_Field=AutoIt 版本|%AutoItVer%
        #AutoIt3Wrapper_Res_Field=短日期格式的 PC 日期|%date%
        #AutoIt3Wrapper_Res_Field=長日期格式的 PC 日期|%longdate%
        #AutoIt3Wrapper_Res_Field=PC 時間格式|%time%
#ce
#EndRegion 編譯資訊

;;原始碼檢錯
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 6 -w 7
;;#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7
#cs
        Au3Check [-q] [-d] [-w[-] n]... [-v[-] n]... [-I dir]... file.au3

        -q : 靜態 (僅輸出錯誤/警告)
        -d : 等價於 Opt("MustDeclareVars", 1)
        -w 1: 已包含檔案 (打開)
        -w 2: 缺少 # comments-end (打開)
        -w 3: 變數已聲明 (關閉)
        -w 4: 局部變數在全域範圍內使用 (關閉)
        -w 5: 局部變數已聲明, 但未使用 (關閉)
        -w 6: 使用 Dim 時警告 (關閉)
        -w 7: 傳遞常數或表示式到 ByRef 時警告 (打開)
        -I dir: 搜尋其他目錄的包含檔案

        -v 1: 顯示包含路徑/檔案 (關閉)
        -v 2: 顯示詞法標記 (關閉)
        -v 3: 顯示未引用 UDF 和全域變數 (關閉)

        退出程式碼:
        0: 成功: 沒有錯誤或警告
        1: 警告
        2: 語法錯誤
        3: 使用或輸入錯誤
#ce


#cs ____________________________________

        Au3版本:3.3.14.5
        SciTE版本:3.6.6
        腳本作者:

        腳本功能:
        參考代碼:

#ce _______________腳本開始_________________


#Region 載入Fuction
#include <WinAPI.au3>
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <WinAPIEx.au3>
#include <TreeViewConstants.au3>


#EndRegion 載入Fuction



#Region 前置工作
;;判斷是否以管理員身份執行
Local $Admin
If IsAdmin() Then
        $Admin = "目前以管理員權限執行"
Else
        $Admin = "目前非管理員權限執行,可能造成部份功能無法使用。"
        MsgBox(262144 + 48, '權限提示', $Admin)
EndIf

;;切換起始目錄工作目錄到腳本所在路徑
FileChangeDir(@ScriptDir)
;;防止重複執行
_Singleton(@ScriptName)
#EndRegion 前置工作


#Region 宣告變數
Global $HiDpi

Global $MainGuiWidth = 700 ;;介面寬
Global $MainGuiLength = 500 ;;介面高

;;全局字體及大小(備用字體:'Comic Sans Ms'、'YaHei Consolas Hybrid')
Global $FontSize = 12, $Font_Xing = 400, $Font_Var = Default, $Font_Quality = 5
;~ Global $Font_Name = 'Microsoft JhengHei'
Global $Font_Name = '微软雅黑'

Global $Title = '最佳程式碼實現 DPI-自適應縮放'
Global $Version = 'v1.2.0.0 2022.11.04'
Global $Author = ''
Global $Copyright = $Author & ' 2022 Unlicense.' ;;版權宣告

Global Const $FileLogPath = @ScriptDir & '\_Log\' & @YEAR & "_" & @MON & "_" & @MDAY & ".log"
Global $AutoIt_Error = ObjEvent("AutoIt.Error", "_AutoIt_Error") ;;攔截Com錯誤
Global $LogFlag = 'N' ;;啟用Log模式

#EndRegion 宣告變數


#Region Opt模式
Opt("GUIResizeMode", 1) ;;設定GUI默認縮放模式,afan版主提供
Opt("GUIOnEventMode", 1) ;;使用事件模式


#EndRegion Opt模式

;;判斷是否編譯,使用不同策略設定和取得DPI
If @Compiled Then
                If _IsProcessDPIAware() Then
                                $HiDpi = _GetDpi()
                Else
                                $HiDpi = 1
                EndIf
Else
                _SetProcessDPIAware()
                $HiDpi = _GetDpi()
EndIf


Global $MainGUI,$hGuiCSUB
_MainGui()
_SubMainB()

Func _MainGui()
        $MainGUI = GUICreate('test', 565, 570, -1, -1,BitOR($WS_SIZEBOX,$WS_SYSMENU,$WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_BORDER))
        GUISetFont($FontSize, $Font_Xing, $Font_Var, $Font_Name, $MainGUI, $Font_Quality) ;;全局字型
        GUISetOnEvent(-3,'_exit')
        Local $idTreeview = GUICtrlCreateTreeView(0, 0, 150, 430)
        GUICtrlCreateTreeViewItem(" 测试菜单 AAA", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 001   ",$idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 002   ", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 003   ", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 004   ", $idTreeview)
            GUICtrlCreateTreeViewItem(" 测试菜单 005   ", $idTreeview)
;                DPI_Zoom($MainGUI, $HiDpi) ;;以Dpi進行視窗調整
;        GUISetState(@SW_SHOW,$MainGUI)
EndFunc

Func _SubMainB()
        $hGuiCSUB = GUICreate("子 GUI1", 710, 600, 151, 1, $WS_CHILD, $WS_EX_CLIENTEDGE, $MainGUI)
        GUISetFont($FontSize, $Font_Xing, $Font_Var, $Font_Name, $hGuiCSUB, $Font_Quality) ;;全局字型

        GUICtrlCreateLabel("测 试 文 字", 160, 10, 90, 25)

        GUICtrlCreateLabel("", 260, 17, 50, 32)

        GUICtrlCreateLabel("测 试 文 字", 20, 40, 100, 32)
        GUICtrlCreateLabel("测 试 文 字", 20, 70, 100, 32)
        GUICtrlCreateLabel("测 试 文 字", 20, 100, 100, 32)

        GUICtrlCreateInput('Asaasdasdasdasdsar', 110, 40, 260, 25)
        GUICtrlCreateInput('Asaasdasdasdasdsar', 110, 70, 260, 25)
        GUICtrlCreateInput('Asaasdasdasdasdsar', 110, 100, 260, 25)

        GUICtrlCreateLabel("第一组测试文字", 25, 295, 120, 25)
        GUICtrlCreateInput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 295, 238, 23)
        GUICtrlCreateLabel("第二组测试文字", 25, 325, 120, 25)
        GUICtrlCreateInput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 325, 238, 23)
        GUICtrlCreateLabel("第三组测试文字", 25, 355, 120, 25)
        GUICtrlCreateInput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 355, 238, 23)

        GUICtrlCreateButton('测 试 按 钮',20,385,370,25)
        GUICtrlCreateLabel("测试文字", 25, 427,120,25)
        GUICtrlCreateButton('测试按钮',120,425,80,25)
        GUICtrlCreateButton('测试按钮',215,425,80,25)
        GUICtrlCreateButton('测试按钮',310,425,80,25)

                        DPI_Zoom($MainGUI, $HiDpi) ;;以Dpi進行視窗調整
;                DPI_Zoom($hGuiCSUB, $HiDpi) ;;以Dpi進行視窗調整

                GUISetState(@SW_SHOW,$hGuiCSUB)
        GUISetState(@SW_SHOW,$MainGUI)
EndFunc



;;GUISetState(@SW_LOCK, $MainGUI) ;;鎖定
;;GUISetState(@SW_UNLOCK, $MainGUI) ;;解除鎖定


While 1
        Sleep(500)
WEnd


#Region 基本函式
Func _Exit() ;;離開軟體
                If MsgBox(262144+36, '', '確定要退出嗎?', 0, $MainGUI) = 6 Then
                                Exit
                EndIf
EndFunc

Func _AutoIt_Error($oError)
                If $LogFlag <> 'Y' Then Return

                Local $errinfo = ""
                ;;Do anything here.
                $errinfo = @ScriptName & " (" & $oError.scriptline & ") AutoIt.Error : ==> COM Error intercepted !" & @CRLF & '---------------------' & @CRLF &  _
                                @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
                                @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
                                @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
                                @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
                                @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
                                @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
                                @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
                                @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
                                @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF
                _log($errinfo)
EndFunc   ;==>_AutoIt_Error

Func _log($text)
    _FileWriteLog($FileLogPath, $text)
EndFunc   ;==>_log
#EndRegion 基本函式


#Region DPI函式
Func DPI_Zoom($hGUI, $hDpi) ;;縮放GUI,bfgxp提供
                GUISetState(@SW_HIDE, $hGUI)
                Local $aPos = WinGetPos($hGUI)
                WinMove($hGUI, "", $aPos[0] - ($aPos[2] * $hDpi-$aPos[2])/2, $aPos[1] - ( $aPos[3] * $hDpi- $aPos[3])/2, $aPos[2] * $hDpi, $aPos[3] * $hDpi)
                #cs
                                1.GUICreate建立的窗口大小是不包含邊框的,而WinMove改變窗口大小卻是包含邊框的。所以在WinMove之前,最好用WinGetPos獲取包含邊框的真實窗口大小,以便WinMove按比例放大
                                2.字型放大,經過我在不同DPI中的測試,最佳為 原字號 * (($HiDpi - 1) / 64 + 1)

                                另外提示愛玩的朋友:
                                WinMove之前的GUISetState(@SW_HIDE)很重要,沒有這個窗口中的控制項不會自動調整大小與位置
                #ce
EndFunc

Func _SetProcessDPIAware()
                Local $aRet
                If @OSBuild < 9600 Then ;;判斷系統版本 win8.1(9600)
                                $aRet = DllCall("User32.dll", "BOOL", "IsProcessDPIAware") ;檢查處理程序是否支援DPI感知
                                Return $aRet[0]
                                If $aRet[0] = False Then
                                                $aRet = DllCall('User32.dll', 'BOOL', 'SetProcessDPIAware') ;設定:系統DPI感知
                                                If @error Then Return SetError(@error, 0, False)
                                                Return
                                EndIf
                Else
                        $aRet = DllCall("Shcore.dll", "BOOL", "GetProcessDpiAwareness", "HWND", 0, "int*", 0) ;檢查處理程序是否支援DPI感知
                        If @error Then Return SetError(@error, 0, False)
                        If $aRet[2] <> 2 Then ;;0:不支援DPI感知,1:系統DPI感知,2:監視器DPI感知
                                        $aRet = DllCall("Shcore.dll", "BOOL", "SetProcessDpiAwareness", "int", 2) ;設定:監視器DPI感知
                                        If @error Then Return SetError(@error, 0, False)
                                        Return
                        EndIf
                EndIf
EndFunc   ;==>_SetProcessDPIAware

Func _GetDpi()
                Local $iDPI
                If @OSBuild < 9600 Then ;;判斷系統版本 win8.1(9600)
                                $iDPI = RegRead("HKCU\Control Panel\Desktop\WindowMetrics", "AppliedDPI")
                Else
                                Local $hWnd = _WinAPI_MonitorFromWindow(_WinAPI_GetDesktopWindow())
                                Local $aRet = DllCall("Shcore.dll", "BOOL", "GetDpiForMonitor", "HANDLE", $hWnd, "int", 0, "int*", 0, "int*", 0)
                                If @error Then Return SetError(@error, 0, False)
                                $iDPI = $aRet[3]
                EndIf
                If $iDPI < 96 Or $iDPI > 480 Then $iDPI = 96
                Return $iDPI / 96
EndFunc   ;==>_GetDpi

Func _IsProcessDPIAware()
                Local $aRet, $aDpi = 0
                If @OSBuild < 9600 Then ;;判斷系統版本 win8.1(9600)
                                $aRet = DllCall("User32.dll", "BOOL", "IsProcessDPIAware") ;檢查處理程序是否支援DPI感知
                                If @error Then Return SetError(@error, 0, False)
                                $aDpi = $aRet[0]
                Else
                                $aRet = DllCall("Shcore.dll", "BOOL", "GetProcessDpiAwareness", "HWND", 0, "int*", 0) ;檢查處理程序是否支援DPI感知
                                If @error Then Return SetError(@error, 0, False)
                                $aDpi = $aRet[2]
                EndIf
                Return $aDpi
EndFunc   ;==>_IsProcessDPIAware
#EndRegion DPI函式
 楼主| 发表于 2023-9-24 10:11:14 | 显示全部楼层
w60711 发表于 2023-9-24 03:23
不確定有沒有效果
有點忙...你先試試看

感谢答复,尝试后没有效果。
发表于 2023-9-24 10:48:13 | 显示全部楼层
anythinging 发表于 2023-9-23 17:52
还想请教下,如何有子窗口的情况下,如何操作? 子窗口不是不显示就是没生效


本帖子中包含更多资源

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

×
 楼主| 发表于 2023-9-24 11:13:06 | 显示全部楼层

100%与125%,150%等缩放情况下的显示效果
发表于 2023-9-24 11:14:30 | 显示全部楼层
anythinging 发表于 2023-9-24 10:11
感谢答复,尝试后没有效果。

先判断屏幕分辩率是多少,然后设置窗口控件的长度。
但这样还是有差别,是个累活
 楼主| 发表于 2023-9-24 11:26:54 | 显示全部楼层
chzj589 发表于 2023-9-24 11:14
先判断屏幕分辩率是多少,然后设置窗口控件的长度。
但这样还是有差别,是个累活

主要是字体控制好就能省不少事,用w60711的方法实现了主窗口,但子窗口没能实现。
发表于 2023-9-24 11:32:38 | 显示全部楼层
anythinging 发表于 2023-9-24 11:26
主要是字体控制好就能省不少事,用w60711的方法实现了主窗口,但子窗口没能实现。

#Region 載入Fuction
#include <WinAPI.au3>
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <WinAPIEx.au3>
#include <TreeViewConstants.au3>


#EndRegion 載入Fuction



#Region 前置工作
;;判斷是否以管理員身份執行
Local $Admin
If IsAdmin() Then
        $Admin = "目前以管理員權限執行"
Else
        $Admin = "目前非管理員權限執行,可能造成部份功能無法使用。"
        MsgBox(262144 + 48, '權限提示', $Admin)
EndIf

;;切換起始目錄工作目錄到腳本所在路徑
FileChangeDir(@ScriptDir)
;;防止重複執行
_Singleton(@ScriptName)
#EndRegion 前置工作


#Region 宣告變數
Global $HiDpi

Global $MainGuiWidth = 700 ;;介面寬
Global $MainGuiLength = 500 ;;介面高

;;全局字體及大小(備用字體:'Comic Sans Ms'、'YaHei Consolas Hybrid')
Global $FontSize = 12, $Font_Xing = 400, $Font_Var = Default, $Font_Quality = 5
;~ Global $Font_Name = 'Microsoft JhengHei'
Global $Font_Name = '微软雅黑'

Global $Title = '最佳程式碼實現 DPI-自適應縮放'
Global $Version = 'v1.2.0.0 2022.11.04'
Global $Author = ''
Global $Copyright = $Author & ' 2022 Unlicense.' ;;版權宣告

Global Const $FileLogPath = @ScriptDir & '\_Log\' & @YEAR & "_" & @MON & "_" & @MDAY & ".log"
Global $AutoIt_Error = ObjEvent("AutoIt.Error", "_AutoIt_Error") ;;攔截Com錯誤
Global $LogFlag = 'N' ;;啟用Log模式

#EndRegion 宣告變數


#Region Opt模式
Opt("GUIResizeMode", 1) ;;設定GUI默認縮放模式,afan版主提供
Opt("GUIOnEventMode", 1) ;;使用事件模式


#EndRegion Opt模式

;;判斷是否編譯,使用不同策略設定和取得DPI
If @Compiled Then
        If _IsProcessDPIAware() Then
                $HiDpi = _GetDpi()
        Else
                $HiDpi = 1
        EndIf
Else
        _SetProcessDPIAware()
        $HiDpi = _GetDpi()
EndIf


Global $MainGUI, $hGuiCSUB
_MainGui()
_SubMainB()

Func _MainGui()
        $MainGUI = GUICreate('test', $MainGuiWidth, $MainGuiLength, -1, -1, BitOR($WS_SIZEBOX, $WS_SYSMENU, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_BORDER))
        GUISetFont($FontSize, $Font_Xing, $Font_Var, $Font_Name, $MainGUI, $Font_Quality) ;;全局字型
        GUISetOnEvent(-3, '_exit')
        Local $idTreeview = GUICtrlCreateTreeView(0, 0, 150, 430)
        GUICtrlCreateTreeViewItem(" 测试菜单 AAA", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 001   ", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 002   ", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 003   ", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 004   ", $idTreeview)
        GUICtrlCreateTreeViewItem(" 测试菜单 005   ", $idTreeview)
        ;                DPI_Zoom($MainGUI, $HiDpi) ;;以Dpi進行視窗調整
        ;        GUISetState(@SW_SHOW,$MainGUI)
EndFunc   ;==>_MainGui

Func _SubMainB()
        $hGuiCSUB = GUICreate("子 GUI1", $MainGuiWidth+10, $MainGuiLength+100, 151, 1, $WS_CHILD, $WS_EX_CLIENTEDGE, $MainGUI)
        GUISetFont($FontSize, $Font_Xing, $Font_Var, $Font_Name, $hGuiCSUB, $Font_Quality) ;;全局字型

        GUICtrlCreateLabel("测 试 文 字", 160, 10, 90, 25)

        GUICtrlCreateLabel("", $MainGuiWidth/2.7, 17, 50, 32)

        GUICtrlCreateLabel("测 试 文 字", 20, 40, $MainGuiWidth/7, 32)
        GUICtrlCreateLabel("测 试 文 字", 20, 70, $MainGuiWidth/7, 32)
        GUICtrlCreateLabel("测 试 文 字", 20, 100, $MainGuiWidth/7, 32)

        GUICtrlCreateInput('Asaasdasdasdasdsar', 110, 40, $MainGuiWidth/1.7, 25)
        GUICtrlCreateInput('Asaasdasdasdasdsar', 110, 70, $MainGuiWidth/1.7, 25)
        GUICtrlCreateInput('Asaasdasdasdasdsar', 110, 100, $MainGuiWidth/1.7, 25)

        GUICtrlCreateLabel("第一组测试文字", 25, 295, 120, 25)
        GUICtrlCreateInput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 295, $MainGuiWidth/1.8, 23)
        GUICtrlCreateLabel("第二组测试文字", 25, 325, 120, 25)
        GUICtrlCreateInput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 325, $MainGuiWidth/1.8, 23)
        GUICtrlCreateLabel("第三组测试文字", 25, 355, 120, 25)
        GUICtrlCreateInput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 355, $MainGuiWidth/1.8, 23)

        GUICtrlCreateButton('测 试 按 钮', 20, 385, $MainGuiWidth/1.4, 25)
        GUICtrlSetOnEvent(-1, "_Button0")
        GUICtrlCreateLabel("测试文字", 25, 427, 120, 25)
        GUICtrlCreateButton('测试按钮', 120, 425, 80, 25)
        GUICtrlCreateButton('测试按钮', 215, 425, 80, 25)
        GUICtrlCreateButton('测试按钮', 310, 425, 80, 25)

        DPI_Zoom($MainGUI, $HiDpi) ;;以Dpi進行視窗調整
        ;                DPI_Zoom($hGuiCSUB, $HiDpi) ;;以Dpi進行視窗調整

        GUISetState(@SW_SHOW, $hGuiCSUB)
        GUISetState(@SW_SHOW, $MainGUI)
EndFunc   ;==>_SubMainB



;;GUISetState(@SW_LOCK, $MainGUI) ;;鎖定
;;GUISetState(@SW_UNLOCK, $MainGUI) ;;解除鎖定


While 1
        Sleep(500)
WEnd

Func _Button0()
        MsgBox(0, "提示", "不知在测试什么?")
EndFunc   ;==>
#Region 基本函式
Func _Exit() ;;離開軟體
        If MsgBox(262144 + 36, '', '確定要退出嗎?', 0, $MainGUI) = 6 Then
                Exit
        EndIf
EndFunc   ;==>_Exit




本帖子中包含更多资源

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

×
 楼主| 发表于 2023-9-24 14:35:36 | 显示全部楼层
chzj589 发表于 2023-9-24 11:32
#Region 載入Fuction
#include
#include

目前的问题是这个对子窗口不生效
发表于 2023-9-25 12:39:34 | 显示全部楼层
给你官方的关于DPI的看看吧
也许能用得到

本帖子中包含更多资源

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

×
 楼主| 发表于 2023-9-26 16:50:44 | 显示全部楼层
本帖最后由 anythinging 于 2023-9-26 17:28 编辑
风过无痕 发表于 2023-9-25 12:39
给你官方的关于DPI的看看吧
也许能用得到

感谢回复,看起来复杂,实际一点都不简单。win7好象是不能工作。
发表于 2023-9-28 08:24:13 | 显示全部楼层
最好不要禁用缩放,我有老花眼,用的85电视机做显示器,经常使用250缩放比例,不能缩放的软件上那些个控制太小用鼠标很难点选,感觉要用放大镜来看才行
发表于 2023-9-28 09:32:21 | 显示全部楼层
anythinging 发表于 2023-9-23 17:52
还想请教下,如何有子窗口的情况下,如何操作? 子窗口不是不显示就是没生效

是子窗口不能随主窗口缩放?
$hGuiCSUB = GUICreate("子 GUI1", 410, 600, 151, 1, $WS_CHILD, $WS_EX_CLIENTEDGE, $MainGUI)
去掉$WS_EX_CLIENTEDGE
$hGuiCSUB = GUICreate("子 GUI1", 410, 600, 151, 1, $WS_CHILD, $MainGUI)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-2 00:40 , Processed in 0.073990 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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