还想请教下,如何有子窗口的情况下,如何操作? 子窗口不是不显示就是没生效
不確定有沒有效果
有點忙...你先試試看
- #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_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
- #include
- #include
- #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 $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函式
复制代码 |