爱体育

 
 加入
12
返回列表
楼主: anythinging

关于gui如何免受系统缩放的影响-爱体育

[复制链接]
 楼主| 发表于 2023-9-23 17:52:09 | 显示全部楼层
本帖最后由 anythinging 于 2023-9-23 17:54 编辑

因為我有設置字體大小啊

还想请教下,如何有子窗口的情况下,如何操作? 子窗口不是不显示就是没生效
  1. #region 編譯資訊
  2. ;;使用管理員權限
  3. #requireadmin
  4. ;;無系統匣圖示
  5. ;;#notrayicon
  6. ;;https://www.autoitscript.com/wiki/autoit3wrapper_directives
  7. #autoit3wrapper_compression=4
  8. #autoit3wrapper_icon=l2.ico
  9. #autoit3wrapper_usex64=n
  10. ;;評論欄
  11. #autoit3wrapper_res_comment=
  12. ;;描述字段
  13. #autoit3wrapper_res_description=
  14. ;;文件版本
  15. #autoit3wrapper_res_fileversion=3.0.0.0
  16. ;;產品版本,默認是使用的 autoit3 版本。
  17. ;;#autoit3wrapper_res_productversion=3.0.0.0
  18. ;;版權領域
  19. #autoit3wrapper_res_legal爱体育 copyright=爱体育 copyright © 2022
  20. ;;資源語言代碼
  21. #autoit3wrapper_res_language=1028
  22. ;;請求可用的最高權限
  23. #autoit3wrapper_res_requestedexecutionlevel=highestavailable
  24. ;;dpi感知
  25. #autoit3wrapper_res_hidpi=y
  26. #cs
  27.         #autoit3wrapper_res_compatibility=windows7
  28.         #autoit3wrapper_res_field=autoit 版本|%autoitver%
  29.         #autoit3wrapper_res_field=短日期格式的 pc 日期|�te%
  30.         #autoit3wrapper_res_field=長日期格式的 pc 日期|%longdate%
  31.         #autoit3wrapper_res_field=pc 時間格式|%time%
  32. #ce
  33. #endregion 編譯資訊

  34. ;;原始碼檢錯
  35. #autoit3wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 6 -w 7
  36. ;;#autoit3wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7
  37. #cs
  38.         au3check [-q] [-d] [-w[-] n]... [-v[-] n]... [-i dir]... file.au3

  39.         -q : 靜態 (僅輸出錯誤/警告)
  40.         -d : 等價於 opt("mustdeclarevars", 1)
  41.         -w 1: 已包含檔案 (打開)
  42.         -w 2: 缺少 # comments-end (打開)
  43.         -w 3: 變數已聲明 (關閉)
  44.         -w 4: 局部變數在全域範圍內使用 (關閉)
  45.         -w 5: 局部變數已聲明, 但未使用 (關閉)
  46.         -w 6: 使用 dim 時警告 (關閉)
  47.         -w 7: 傳遞常數或表示式到 byref 時警告 (打開)
  48.         -i dir: 搜尋其他目錄的包含檔案

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

  52.         退出程式碼:
  53.         0: 成功: 沒有錯誤或警告
  54.         1: 警告
  55.         2: 語法錯誤
  56.         3: 使用或輸入錯誤
  57. #ce


  58. #cs ____________________________________

  59.         au3版本:3.3.14.5
  60.         scite版本:3.6.6
  61.         腳本作者:

  62.         腳本功能:
  63.         參考代碼:

  64. #ce _______________腳本開始_________________


  65. #region 載入fuction
  66. #include
  67. #include
  68. #include
  69. #include
  70. #include
  71. #include
  72. #include
  73. #include
  74. #include
  75. #include


  76. #endregion 載入fuction



  77. #region 前置工作
  78. ;;判斷是否以管理員身份執行
  79. local $admin
  80. if isadmin() then
  81.         $admin = "目前以管理員權限執行"
  82. else
  83.         $admin = "目前非管理員權限執行,可能造成部份功能無法使用。"
  84.         msgbox(262144 48, '權限提示', $admin)
  85. endif

  86. ;;切換起始目錄工作目錄到腳本所在路徑
  87. filechangedir(@scriptdir)
  88. ;;防止重複執行
  89. _singleton(@scriptname)
  90. #endregion 前置工作


  91. #region 宣告變數
  92. global $hidpi

  93. global $mainguiwidth = 700 ;;介面寬
  94. global $mainguilength = 500 ;;介面高

  95. ;;全局字體及大小(備用字體:'comic sans ms'、'yahei consolas hybrid')
  96. global $fontsize = 12, $font_xing = 400, $font_var = default, $font_quality = 5
  97. ;~ global $font_name = 'microsoft jhenghei'
  98. global $font_name = '微软雅黑'

  99. global $title = '最佳程式碼實現 dpi-自適應縮放'
  100. global $version = 'v1.2.0.0 2022.11.04'
  101. global $author = ''
  102. global $爱体育 copyright = $author & ' 2022 unlicense.' ;;版權宣告

  103. global const $filelogpath = @scriptdir & '\_log\' & @year & "_" & @mon & "_" & @mday & ".log"
  104. global $autoit_error = objevent("autoit.error", "_autoit_error") ;;攔截com錯誤
  105. global $logflag = 'n' ;;啟用log模式

  106. #endregion 宣告變數


  107. #region opt模式
  108. opt("guiresizemode", 1) ;;設定gui默認縮放模式,afan版主提供
  109. opt("guioneventmode", 1) ;;使用事件模式


  110. #endregion opt模式

  111. ;;判斷是否編譯,使用不同策略設定和取得dpi
  112. if @compiled then
  113.                 if _isprocessdpiaware() then
  114.                                 $hidpi = _getdpi()
  115.                 else
  116.                                 $hidpi = 1
  117.                 endif
  118. else
  119.                 _setprocessdpiaware()
  120.                 $hidpi = _getdpi()
  121. endif


  122. global $maingui,$hguicsub
  123. _maingui()
  124. _submainb()

  125. func _maingui()
  126.         $maingui = guicreate('test', 565, 570, -1, -1,bitor($ws_sizebox,$ws_sysmenu,$ws_maximizebox,$ws_minimizebox,$ws_border))
  127.         guisetfont($fontsize, $font_xing, $font_var, $font_name, $maingui, $font_quality) ;;全局字型
  128.         guisetonevent(-3,'_exit')
  129.         local $idtreeview = guictrlcreatetreeview(0, 0, 150, 430)
  130.         guictrlcreatetreeviewitem(" 测试菜单 aaa", $idtreeview)
  131.         guictrlcreatetreeviewitem(" 测试菜单 001   ",$idtreeview)
  132.         guictrlcreatetreeviewitem(" 测试菜单 002   ", $idtreeview)
  133.         guictrlcreatetreeviewitem(" 测试菜单 003   ", $idtreeview)
  134.         guictrlcreatetreeviewitem(" 测试菜单 004   ", $idtreeview)
  135.     guictrlcreatetreeviewitem(" 测试菜单 005   ", $idtreeview)
  136.         dpi_zoom($maingui, $hidpi) ;;以dpi進行視窗調整
  137.         guisetstate(@sw_show,$maingui)
  138. endfunc

  139. func _submainb()
  140.         $hguicsub = guicreate("子 gui1", 410, 600, 151, 1, $ws_child, $ws_ex_clientedge, $maingui)
  141.         guisetfont($fontsize, $font_xing, $font_var, $font_name, $hguicsub, $font_quality) ;;全局字型

  142.         guictrlcreatelabel("测 试 文 字", 160, 10, 90, 25)

  143.         guictrlcreatelabel("", 260, 17, 50, 32)

  144.         guictrlcreatelabel("测 试 文 字", 20, 40, 100, 32)
  145.         guictrlcreatelabel("测 试 文 字", 20, 70, 100, 32)
  146.         guictrlcreatelabel("测 试 文 字", 20, 100, 100, 32)

  147.         guictrlcreateinput('asaasdasdasdasdsar', 110, 40, 260, 25)
  148.         guictrlcreateinput('asaasdasdasdasdsar', 110, 70, 260, 25)
  149.         guictrlcreateinput('asaasdasdasdasdsar', 110, 100, 260, 25)

  150.         guictrlcreatelabel("第一组测试文字", 25, 295, 120, 25)
  151.         guictrlcreateinput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 295, 238, 23)
  152.         guictrlcreatelabel("第二组测试文字", 25, 325, 120, 25)
  153.         guictrlcreateinput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 325, 238, 23)
  154.         guictrlcreatelabel("第三组测试文字", 25, 355, 120, 25)
  155.         guictrlcreateinput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 355, 238, 23)

  156.         guictrlcreatebutton('测 试 按 钮',20,385,370,25)
  157.         guictrlcreatelabel("测试文字", 25, 427,120,25)
  158.         guictrlcreatebutton('测试按钮',120,425,80,25)
  159.         guictrlcreatebutton('测试按钮',215,425,80,25)
  160.         guictrlcreatebutton('测试按钮',310,425,80,25)
  161. ;~         dpi_zoom($hguicsub, $hidpi) ;;以dpi進行視窗調整
  162.         guisetstate(@sw_show,$hguicsub)
  163. endfunc



  164. ;;guisetstate(@sw_lock, $maingui) ;;鎖定
  165. ;;guisetstate(@sw_unlock, $maingui) ;;解除鎖定


  166. while 1
  167.         sleep(500)
  168. wend


  169. #region 基本函式
  170. func _exit() ;;離開軟體
  171.                 if msgbox(262144 36, '', '確定要退出嗎?', 0, $maingui) = 6 then
  172.                                 exit
  173.                 endif
  174. endfunc

  175. func _autoit_error($oerror)
  176.                 if $logflag <> 'y' then return

  177.                 local $errinfo = ""
  178.                 ;;do anything here.
  179.                 $errinfo = @scriptname & " (" & $oerror.scriptline & ") autoit.error : ==> com error intercepted !" & @crlf & '---------------------' & @crlf &  _
  180.                                 @tab & "err.number is: " & @tab & @tab & "0x" & hex($oerror.number) & @crlf & _
  181.                                 @tab & "err.windescription:" & @tab & $oerror.windescription & @crlf & _
  182.                                 @tab & "err.description is: " & @tab & $oerror.description & @crlf & _
  183.                                 @tab & "err.source is: " & @tab & @tab & $oerror.source & @crlf & _
  184.                                 @tab & "err.helpfile is: " & @tab & $oerror.helpfile & @crlf & _
  185.                                 @tab & "err.helpcontext is: " & @tab & $oerror.helpcontext & @crlf & _
  186.                                 @tab & "err.lastdllerror is: " & @tab & $oerror.lastdllerror & @crlf & _
  187.                                 @tab & "err.scriptline is: " & @tab & $oerror.scriptline & @crlf & _
  188.                                 @tab & "err.retcode is: " & @tab & "0x" & hex($oerror.retcode) & @crlf & @crlf
  189.                 _log($errinfo)
  190. endfunc   ;==>_autoit_error

  191. func _log($text)
  192.     _filewritelog($filelogpath, $text)
  193. endfunc   ;==>_log
  194. #endregion 基本函式


  195. #region dpi函式
  196. func dpi_zoom($hgui, $hdpi) ;;縮放gui,bfgxp提供
  197.                 guisetstate(@sw_hide, $hgui)
  198.                 local $apos = wingetpos($hgui)
  199.                 winmove($hgui, "", $apos[0] - ($apos[2] * $hdpi-$apos[2])/2, $apos[1] - ( $apos[3] * $hdpi- $apos[3])/2, $apos[2] * $hdpi, $apos[3] * $hdpi)
  200.                 #cs
  201.                                 1.guicreate建立的窗口大小是不包含邊框的,而winmove改變窗口大小卻是包含邊框的。所以在winmove之前,最好用wingetpos獲取包含邊框的真實窗口大小,以便winmove按比例放大
  202.                                 2.字型放大,經過我在不同dpi中的測試,最佳為 原字號 * (($hidpi - 1) / 64 1)

  203.                                 另外提示愛玩的朋友:
  204.                                 winmove之前的guisetstate(@sw_hide)很重要,沒有這個窗口中的控制項不會自動調整大小與位置
  205.                 #ce
  206. endfunc

  207. func _setprocessdpiaware()
  208.                 local $aret
  209.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  210.                                 $aret = dllcall("user32.dll", "bool", "isprocessdpiaware") ;檢查處理程序是否支援dpi感知
  211.                                 return $aret[0]
  212.                                 if $aret[0] = false then
  213.                                                 $aret = dllcall('user32.dll', 'bool', 'setprocessdpiaware') ;設定:系統dpi感知
  214.                                                 if @error then return seterror(@error, 0, false)
  215.                                                 return
  216.                                 endif
  217.                 else
  218.                         $aret = dllcall("shcore.dll", "bool", "getprocessdpiawareness", "hwnd", 0, "int*", 0) ;檢查處理程序是否支援dpi感知
  219.                         if @error then return seterror(@error, 0, false)
  220.                         if $aret[2] <> 2 then ;;0:不支援dpi感知,1:系統dpi感知,2:監視器dpi感知
  221.                                         $aret = dllcall("shcore.dll", "bool", "setprocessdpiawareness", "int", 2) ;設定:監視器dpi感知
  222.                                         if @error then return seterror(@error, 0, false)
  223.                                         return
  224.                         endif
  225.                 endif
  226. endfunc   ;==>_setprocessdpiaware

  227. func _getdpi()
  228.                 local $idpi
  229.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  230.                                 $idpi = regread("hkcu\control panel\desktop\windowmetrics", "applieddpi")
  231.                 else
  232.                                 local $hwnd = _winapi_monitorfromwindow(_winapi_getdesktopwindow())
  233.                                 local $aret = dllcall("shcore.dll", "bool", "getdpiformonitor", "handle", $hwnd, "int", 0, "int*", 0, "int*", 0)
  234.                                 if @error then return seterror(@error, 0, false)
  235.                                 $idpi = $aret[3]
  236.                 endif
  237.                 if $idpi < 96 or $idpi > 480 then $idpi = 96
  238.                 return $idpi / 96
  239. endfunc   ;==>_getdpi

  240. func _isprocessdpiaware()
  241.                 local $aret, $adpi = 0
  242.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  243.                                 $aret = dllcall("user32.dll", "bool", "isprocessdpiaware") ;檢查處理程序是否支援dpi感知
  244.                                 if @error then return seterror(@error, 0, false)
  245.                                 $adpi = $aret[0]
  246.                 else
  247.                                 $aret = dllcall("shcore.dll", "bool", "getprocessdpiawareness", "hwnd", 0, "int*", 0) ;檢查處理程序是否支援dpi感知
  248.                                 if @error then return seterror(@error, 0, false)
  249.                                 $adpi = $aret[2]
  250.                 endif
  251.                 return $adpi
  252. endfunc   ;==>_isprocessdpiaware
  253. #endregion dpi函式
复制代码
发表于 2023-9-23 18:41:57 来自手机 | 显示全部楼层
编译选项里就有接管系统缩放,程序自己控制。不过字体缩放无法避免。自适应缩放控件需要代码中自己实现。
发表于 2023-9-24 03:23:47 | 显示全部楼层

还想请教下,如何有子窗口的情况下,如何操作? 子窗口不是不显示就是没生效

不確定有沒有效果
有點忙...你先試試看
  1. #region 編譯資訊
  2. ;;使用管理員權限
  3. #requireadmin
  4. ;;無系統匣圖示
  5. ;;#notrayicon
  6. ;;https://www.autoitscript.com/wiki/autoit3wrapper_directives
  7. #autoit3wrapper_compression=4
  8. #autoit3wrapper_icon=l2.ico
  9. #autoit3wrapper_usex64=n
  10. ;;評論欄
  11. #autoit3wrapper_res_comment=
  12. ;;描述字段
  13. #autoit3wrapper_res_description=
  14. ;;文件版本
  15. #autoit3wrapper_res_fileversion=3.0.0.0
  16. ;;產品版本,默認是使用的 autoit3 版本。
  17. ;;#autoit3wrapper_res_productversion=3.0.0.0
  18. ;;版權領域
  19. #autoit3wrapper_res_legal爱体育 copyright=爱体育 copyright © 2022
  20. ;;資源語言代碼
  21. #autoit3wrapper_res_language=1028
  22. ;;請求可用的最高權限
  23. #autoit3wrapper_res_requestedexecutionlevel=highestavailable
  24. ;;dpi感知
  25. #autoit3wrapper_res_hidpi=y
  26. #cs
  27.         #autoit3wrapper_res_compatibility=windows7
  28.         #autoit3wrapper_res_field=autoit 版本|%autoitver%
  29.         #autoit3wrapper_res_field=短日期格式的 pc 日期|�te%
  30.         #autoit3wrapper_res_field=長日期格式的 pc 日期|%longdate%
  31.         #autoit3wrapper_res_field=pc 時間格式|%time%
  32. #ce
  33. #endregion 編譯資訊

  34. ;;原始碼檢錯
  35. #autoit3wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 6 -w 7
  36. ;;#autoit3wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7
  37. #cs
  38.         au3check [-q] [-d] [-w[-] n]... [-v[-] n]... [-i dir]... file.au3

  39.         -q : 靜態 (僅輸出錯誤/警告)
  40.         -d : 等價於 opt("mustdeclarevars", 1)
  41.         -w 1: 已包含檔案 (打開)
  42.         -w 2: 缺少 # comments-end (打開)
  43.         -w 3: 變數已聲明 (關閉)
  44.         -w 4: 局部變數在全域範圍內使用 (關閉)
  45.         -w 5: 局部變數已聲明, 但未使用 (關閉)
  46.         -w 6: 使用 dim 時警告 (關閉)
  47.         -w 7: 傳遞常數或表示式到 byref 時警告 (打開)
  48.         -i dir: 搜尋其他目錄的包含檔案

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

  52.         退出程式碼:
  53.         0: 成功: 沒有錯誤或警告
  54.         1: 警告
  55.         2: 語法錯誤
  56.         3: 使用或輸入錯誤
  57. #ce


  58. #cs ____________________________________

  59.         au3版本:3.3.14.5
  60.         scite版本:3.6.6
  61.         腳本作者:

  62.         腳本功能:
  63.         參考代碼:

  64. #ce _______________腳本開始_________________


  65. #region 載入fuction
  66. #include
  67. #include
  68. #include
  69. #include
  70. #include
  71. #include
  72. #include
  73. #include
  74. #include
  75. #include


  76. #endregion 載入fuction



  77. #region 前置工作
  78. ;;判斷是否以管理員身份執行
  79. local $admin
  80. if isadmin() then
  81.         $admin = "目前以管理員權限執行"
  82. else
  83.         $admin = "目前非管理員權限執行,可能造成部份功能無法使用。"
  84.         msgbox(262144 48, '權限提示', $admin)
  85. endif

  86. ;;切換起始目錄工作目錄到腳本所在路徑
  87. filechangedir(@scriptdir)
  88. ;;防止重複執行
  89. _singleton(@scriptname)
  90. #endregion 前置工作


  91. #region 宣告變數
  92. global $hidpi

  93. global $mainguiwidth = 700 ;;介面寬
  94. global $mainguilength = 500 ;;介面高

  95. ;;全局字體及大小(備用字體:'comic sans ms'、'yahei consolas hybrid')
  96. global $fontsize = 12, $font_xing = 400, $font_var = default, $font_quality = 5
  97. ;~ global $font_name = 'microsoft jhenghei'
  98. global $font_name = '微软雅黑'

  99. global $title = '最佳程式碼實現 dpi-自適應縮放'
  100. global $version = 'v1.2.0.0 2022.11.04'
  101. global $author = ''
  102. global $爱体育 copyright = $author & ' 2022 unlicense.' ;;版權宣告

  103. global const $filelogpath = @scriptdir & '\_log\' & @year & "_" & @mon & "_" & @mday & ".log"
  104. global $autoit_error = objevent("autoit.error", "_autoit_error") ;;攔截com錯誤
  105. global $logflag = 'n' ;;啟用log模式

  106. #endregion 宣告變數


  107. #region opt模式
  108. opt("guiresizemode", 1) ;;設定gui默認縮放模式,afan版主提供
  109. opt("guioneventmode", 1) ;;使用事件模式


  110. #endregion opt模式

  111. ;;判斷是否編譯,使用不同策略設定和取得dpi
  112. if @compiled then
  113.                 if _isprocessdpiaware() then
  114.                                 $hidpi = _getdpi()
  115.                 else
  116.                                 $hidpi = 1
  117.                 endif
  118. else
  119.                 _setprocessdpiaware()
  120.                 $hidpi = _getdpi()
  121. endif


  122. global $maingui,$hguicsub
  123. _maingui()
  124. _submainb()

  125. func _maingui()
  126.         $maingui = guicreate('test', 565, 570, -1, -1,bitor($ws_sizebox,$ws_sysmenu,$ws_maximizebox,$ws_minimizebox,$ws_border))
  127.         guisetfont($fontsize, $font_xing, $font_var, $font_name, $maingui, $font_quality) ;;全局字型
  128.         guisetonevent(-3,'_exit')
  129.         local $idtreeview = guictrlcreatetreeview(0, 0, 150, 430)
  130.         guictrlcreatetreeviewitem(" 测试菜单 aaa", $idtreeview)
  131.         guictrlcreatetreeviewitem(" 测试菜单 001   ",$idtreeview)
  132.         guictrlcreatetreeviewitem(" 测试菜单 002   ", $idtreeview)
  133.         guictrlcreatetreeviewitem(" 测试菜单 003   ", $idtreeview)
  134.         guictrlcreatetreeviewitem(" 测试菜单 004   ", $idtreeview)
  135.             guictrlcreatetreeviewitem(" 测试菜单 005   ", $idtreeview)
  136. ;                dpi_zoom($maingui, $hidpi) ;;以dpi進行視窗調整
  137. ;        guisetstate(@sw_show,$maingui)
  138. endfunc

  139. func _submainb()
  140.         $hguicsub = guicreate("子 gui1", 710, 600, 151, 1, $ws_child, $ws_ex_clientedge, $maingui)
  141.         guisetfont($fontsize, $font_xing, $font_var, $font_name, $hguicsub, $font_quality) ;;全局字型

  142.         guictrlcreatelabel("测 试 文 字", 160, 10, 90, 25)

  143.         guictrlcreatelabel("", 260, 17, 50, 32)

  144.         guictrlcreatelabel("测 试 文 字", 20, 40, 100, 32)
  145.         guictrlcreatelabel("测 试 文 字", 20, 70, 100, 32)
  146.         guictrlcreatelabel("测 试 文 字", 20, 100, 100, 32)

  147.         guictrlcreateinput('asaasdasdasdasdsar', 110, 40, 260, 25)
  148.         guictrlcreateinput('asaasdasdasdasdsar', 110, 70, 260, 25)
  149.         guictrlcreateinput('asaasdasdasdasdsar', 110, 100, 260, 25)

  150.         guictrlcreatelabel("第一组测试文字", 25, 295, 120, 25)
  151.         guictrlcreateinput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 295, 238, 23)
  152.         guictrlcreatelabel("第二组测试文字", 25, 325, 120, 25)
  153.         guictrlcreateinput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 325, 238, 23)
  154.         guictrlcreatelabel("第三组测试文字", 25, 355, 120, 25)
  155.         guictrlcreateinput("abcdefgakljdfklsjfsdlkfsdklfds", 140, 355, 238, 23)

  156.         guictrlcreatebutton('测 试 按 钮',20,385,370,25)
  157.         guictrlcreatelabel("测试文字", 25, 427,120,25)
  158.         guictrlcreatebutton('测试按钮',120,425,80,25)
  159.         guictrlcreatebutton('测试按钮',215,425,80,25)
  160.         guictrlcreatebutton('测试按钮',310,425,80,25)

  161.                         dpi_zoom($maingui, $hidpi) ;;以dpi進行視窗調整
  162. ;                dpi_zoom($hguicsub, $hidpi) ;;以dpi進行視窗調整

  163.                 guisetstate(@sw_show,$hguicsub)
  164.         guisetstate(@sw_show,$maingui)
  165. endfunc



  166. ;;guisetstate(@sw_lock, $maingui) ;;鎖定
  167. ;;guisetstate(@sw_unlock, $maingui) ;;解除鎖定


  168. while 1
  169.         sleep(500)
  170. wend


  171. #region 基本函式
  172. func _exit() ;;離開軟體
  173.                 if msgbox(262144 36, '', '確定要退出嗎?', 0, $maingui) = 6 then
  174.                                 exit
  175.                 endif
  176. endfunc

  177. func _autoit_error($oerror)
  178.                 if $logflag <> 'y' then return

  179.                 local $errinfo = ""
  180.                 ;;do anything here.
  181.                 $errinfo = @scriptname & " (" & $oerror.scriptline & ") autoit.error : ==> com error intercepted !" & @crlf & '---------------------' & @crlf &  _
  182.                                 @tab & "err.number is: " & @tab & @tab & "0x" & hex($oerror.number) & @crlf & _
  183.                                 @tab & "err.windescription:" & @tab & $oerror.windescription & @crlf & _
  184.                                 @tab & "err.description is: " & @tab & $oerror.description & @crlf & _
  185.                                 @tab & "err.source is: " & @tab & @tab & $oerror.source & @crlf & _
  186.                                 @tab & "err.helpfile is: " & @tab & $oerror.helpfile & @crlf & _
  187.                                 @tab & "err.helpcontext is: " & @tab & $oerror.helpcontext & @crlf & _
  188.                                 @tab & "err.lastdllerror is: " & @tab & $oerror.lastdllerror & @crlf & _
  189.                                 @tab & "err.scriptline is: " & @tab & $oerror.scriptline & @crlf & _
  190.                                 @tab & "err.retcode is: " & @tab & "0x" & hex($oerror.retcode) & @crlf & @crlf
  191.                 _log($errinfo)
  192. endfunc   ;==>_autoit_error

  193. func _log($text)
  194.     _filewritelog($filelogpath, $text)
  195. endfunc   ;==>_log
  196. #endregion 基本函式


  197. #region dpi函式
  198. func dpi_zoom($hgui, $hdpi) ;;縮放gui,bfgxp提供
  199.                 guisetstate(@sw_hide, $hgui)
  200.                 local $apos = wingetpos($hgui)
  201.                 winmove($hgui, "", $apos[0] - ($apos[2] * $hdpi-$apos[2])/2, $apos[1] - ( $apos[3] * $hdpi- $apos[3])/2, $apos[2] * $hdpi, $apos[3] * $hdpi)
  202.                 #cs
  203.                                 1.guicreate建立的窗口大小是不包含邊框的,而winmove改變窗口大小卻是包含邊框的。所以在winmove之前,最好用wingetpos獲取包含邊框的真實窗口大小,以便winmove按比例放大
  204.                                 2.字型放大,經過我在不同dpi中的測試,最佳為 原字號 * (($hidpi - 1) / 64 1)

  205.                                 另外提示愛玩的朋友:
  206.                                 winmove之前的guisetstate(@sw_hide)很重要,沒有這個窗口中的控制項不會自動調整大小與位置
  207.                 #ce
  208. endfunc

  209. func _setprocessdpiaware()
  210.                 local $aret
  211.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  212.                                 $aret = dllcall("user32.dll", "bool", "isprocessdpiaware") ;檢查處理程序是否支援dpi感知
  213.                                 return $aret[0]
  214.                                 if $aret[0] = false then
  215.                                                 $aret = dllcall('user32.dll', 'bool', 'setprocessdpiaware') ;設定:系統dpi感知
  216.                                                 if @error then return seterror(@error, 0, false)
  217.                                                 return
  218.                                 endif
  219.                 else
  220.                         $aret = dllcall("shcore.dll", "bool", "getprocessdpiawareness", "hwnd", 0, "int*", 0) ;檢查處理程序是否支援dpi感知
  221.                         if @error then return seterror(@error, 0, false)
  222.                         if $aret[2] <> 2 then ;;0:不支援dpi感知,1:系統dpi感知,2:監視器dpi感知
  223.                                         $aret = dllcall("shcore.dll", "bool", "setprocessdpiawareness", "int", 2) ;設定:監視器dpi感知
  224.                                         if @error then return seterror(@error, 0, false)
  225.                                         return
  226.                         endif
  227.                 endif
  228. endfunc   ;==>_setprocessdpiaware

  229. func _getdpi()
  230.                 local $idpi
  231.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  232.                                 $idpi = regread("hkcu\control panel\desktop\windowmetrics", "applieddpi")
  233.                 else
  234.                                 local $hwnd = _winapi_monitorfromwindow(_winapi_getdesktopwindow())
  235.                                 local $aret = dllcall("shcore.dll", "bool", "getdpiformonitor", "handle", $hwnd, "int", 0, "int*", 0, "int*", 0)
  236.                                 if @error then return seterror(@error, 0, false)
  237.                                 $idpi = $aret[3]
  238.                 endif
  239.                 if $idpi < 96 or $idpi > 480 then $idpi = 96
  240.                 return $idpi / 96
  241. endfunc   ;==>_getdpi

  242. func _isprocessdpiaware()
  243.                 local $aret, $adpi = 0
  244.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  245.                                 $aret = dllcall("user32.dll", "bool", "isprocessdpiaware") ;檢查處理程序是否支援dpi感知
  246.                                 if @error then return seterror(@error, 0, false)
  247.                                 $adpi = $aret[0]
  248.                 else
  249.                                 $aret = dllcall("shcore.dll", "bool", "getprocessdpiawareness", "hwnd", 0, "int*", 0) ;檢查處理程序是否支援dpi感知
  250.                                 if @error then return seterror(@error, 0, false)
  251.                                 $adpi = $aret[2]
  252.                 endif
  253.                 return $adpi
  254. endfunc   ;==>_isprocessdpiaware
  255. #endregion dpi函式
复制代码
 楼主| 发表于 2023-9-24 10:11:14 | 显示全部楼层

不確定有沒有效果
有點忙...你先試試看

感谢答复,尝试后没有效果。
发表于 2023-9-24 10:48:13 | 显示全部楼层

还想请教下,如何有子窗口的情况下,如何操作? 子窗口不是不显示就是没生效


本帖子中包含更多资源

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

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

100%与125%,150%等缩放情况下的显示效果
发表于 2023-9-24 11:14:30 | 显示全部楼层

感谢答复,尝试后没有效果。

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

先判断屏幕分辩率是多少,然后设置窗口控件的长度。
但这样还是有差别,是个累活

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

主要是字体控制好就能省不少事,用w60711的方法实现了主窗口,但子窗口没能实现。

#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', $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 | 显示全部楼层

#region 載入fuction
#include
#include

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

本帖子中包含更多资源

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

×
 楼主| 发表于 2023-9-26 16:50:44 | 显示全部楼层
本帖最后由 anythinging 于 2023-9-26 17:28 编辑

给你官方的关于dpi的看看吧
也许能用得到

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

还想请教下,如何有子窗口的情况下,如何操作? 子窗口不是不显示就是没生效

是子窗口不能随主窗口缩放?
$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)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

||小黑屋|爱体育 ( ) "));

gmt 8, 2023-12-7 01:00 , processed in 0.090336 second(s), 15 queries .

powered by x3.5

© 2001-2023 .

返回列表
网站地图