感谢回复,我把这段代码放到你的代码里,好象没什么效果。
guictrlcreatelabel('',55,0,1,300)
guictrl ...
因為我有設置字體大小啊
正確用法為:你在目前的模式下,就應該要調整好文字、控件大小了
編譯以後,會隨著縮放~
如一開始不正確,縮放後還是不會正常的...
- #region 編譯資訊
- ;;使用管理員權限
- #requireadmin
- ;;無系統匣圖示
- ;;#notrayicon
- ;;[url]https://www.autoitscript.com/wiki/autoit3wrapper_directives[/url]
- #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_legal爱体育 copyright=爱体育 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 日期|�te%
- #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
- #include
- #include
- #include
- #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 $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 = guicreate($title & ' ' & $version, $mainguiwidth, $mainguilength, -1, -1)
- guisetonevent($gui_event_close, "_exit")
- guisetfont($fontsize, $font_xing, $font_var, $font_name, $maingui, $font_quality) ;;全局字型
- guisetbkcolor(0xe6e6e6) ;;將變更背景色彩
- guictrlcreatelabel('最佳程式碼實現 dpi-自適應縮放', 10, 10)
- guictrlcreatelabel('', 75, 30, 1, 300)
- guictrlsetbkcolor(-1, 0x003366)
- guictrlcreatebutton('按钮1', 10, 30)
- guictrlcreatebutton('按钮2', 100, 30, 100, 30)
- guictrlcreatecheckbox('选择1', 10, 100)
- guictrlcreatecheckbox('选择2', 100, 100, 100, 30)
- dpi_zoom($maingui, $hidpi) ;;以dpi進行視窗調整
- guisetstate(@sw_show, $maingui)
- ;;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函式
复制代码 |