爱体育

 
 加入
查看: 431|回复: 28

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

[复制链接]
发表于 2023-9-22 17:02:29 | 显示全部楼层 |
请教各位大神,免受系统缩放的真正有效方法?
做了个gui,是在100%屏幕缩放下配置的座标和尺寸,结果在放大的电脑屏幕上运行时惨不忍睹,试了论坛里的方法不好用,请教真正有效的方法。
guicreate('',380,220)
guisetstate()

guictrlcreatelabel('',55,0,1,300)
guictrlsetbkcolor ( -1 , 0x003366)

guictrlcreatebutton("按钮",10,30,30,20)
guictrlcreatecheckbox("选择",10,100,40,20)

while 1
        switch guigetmsg()
                case -3
                        exit
        endswitch
wend



本帖子中包含更多资源

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

×
 楼主| 发表于 2023-9-22 17:03:35 | 显示全部楼层
win10系统,第1个是100%,第2个是125%
 楼主| 发表于 2023-9-22 17:06:58 | 显示全部楼层
        local $result = dllcall('user32.dll', 'bool', 'setprocessdpiaware')
        if @error then return seterror(@error, 0, false)
        return $result[0]
这个是论坛里找的,不知为何不启作用。
发表于 2023-9-22 17:08:53 | 显示全部楼层
你说的是字体,跟gui没啥关系,固定字体大小试试?
 楼主| 发表于 2023-9-22 17:16:40 | 显示全部楼层
遇到的是字变大了,导致需要调整按钮,checkbox等的xyw值才能正常,全改一遍一方面是工作量太大了,另一方面只是在当前的缩放比例下看着美观,换一个比例又不行了
 楼主| 发表于 2023-9-22 17:19:23 | 显示全部楼层
如果能禁用当前程序缩放就省事了,不知怎样实现
发表于 2023-9-22 17:59:43 | 显示全部楼层
禁用dpi缩放,来自本论坛
 楼主| 发表于 2023-9-22 18:11:16 | 显示全部楼层

禁用dpi缩放,来自本论坛
https://www.autoitx.com/forum.php?mod=viewthread&tid=72066&highlight=dpi

前面提到了,不好使
发表于 2023-9-22 19:08:06 | 显示全部楼层
如果是因為介面跑位不好ˋ看

那就試著讓它自動縮放?
  1. #region 編譯資訊
  2. ;;使用管理員權限
  3. #requireadmin
  4. ;;無系統匣圖示
  5. ;;#notrayicon
  6. ;;[url]https://www.autoitscript.com/wiki/autoit3wrapper_directives[/url]
  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.        
  40.         -q : 靜態 (僅輸出錯誤/警告)
  41.         -d : 等價於 opt("mustdeclarevars", 1)
  42.         -w 1: 已包含檔案 (打開)
  43.         -w 2: 缺少 # comments-end (打開)
  44.         -w 3: 變數已聲明 (關閉)
  45.         -w 4: 局部變數在全域範圍內使用 (關閉)
  46.         -w 5: 局部變數已聲明, 但未使用 (關閉)
  47.         -w 6: 使用 dim 時警告 (關閉)
  48.         -w 7: 傳遞常數或表示式到 byref 時警告 (打開)
  49.         -i dir: 搜尋其他目錄的包含檔案
  50.        
  51.         -v 1: 顯示包含路徑/檔案 (關閉)
  52.         -v 2: 顯示詞法標記 (關閉)
  53.         -v 3: 顯示未引用 udf 和全域變數 (關閉)

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


  60. #cs ____________________________________

  61.         au3版本:3.3.14.5
  62.         scite版本:3.6.6
  63.         腳本作者:

  64.         腳本功能:
  65.         參考代碼:

  66. #ce _______________腳本開始_________________


  67. #region 載入fuction
  68. #include
  69. #include
  70. #include
  71. #include


  72. #endregion 載入fuction



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

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


  87. #region 宣告變數
  88. global $hidpi

  89. global $mainguiwidth = 700 ;;介面寬
  90. global $mainguilength = 500 ;;介面高

  91. ;;全局字體及大小(備用字體:'comic sans ms'、'yahei consolas hybrid')
  92. global $fontsize = 12, $font_xing = 400, $font_var = default, $font_quality = 5
  93. global $font_name = 'microsoft jhenghei'

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

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

  101. #endregion 宣告變數


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


  105. #endregion opt模式

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


  117. global $maingui = guicreate($title & ' ' & $version, $mainguiwidth, $mainguilength, -1, -1)
  118. guisetonevent($gui_event_close, "_exit")
  119. guisetfont($fontsize, $font_xing, $font_var, $font_name, $maingui, $font_quality) ;;全局字型
  120. guisetbkcolor(0xe6e6e6) ;;將變更背景色彩

  121. guictrlcreatelabel('最佳程式碼實現 dpi-自適應縮放', 10, 10)




  122.                 dpi_zoom($maingui, $hidpi) ;;以dpi進行視窗調整
  123. guisetstate(@sw_show, $maingui)
  124. ;;guisetstate(@sw_lock, $maingui) ;;鎖定
  125. ;;guisetstate(@sw_unlock, $maingui) ;;解除鎖定


  126. while 1
  127.         sleep(500)
  128. wend


  129. #region 基本函式
  130. func _exit() ;;離開軟體
  131.                 if msgbox(262144 36, '', '確定要退出嗎?', 0, $maingui) = 6 then
  132.                                 exit
  133.                 endif
  134. endfunc

  135. func _autoit_error($oerror)
  136.                 if $logflag <> 'y' then return

  137.                 local $errinfo = ""
  138.                 ;;do anything here.
  139.                 $errinfo = @scriptname & " (" & $oerror.scriptline & ") autoit.error : ==> com error intercepted !" & @crlf & '---------------------' & @crlf &  _
  140.                                 @tab & "err.number is: " & @tab & @tab & "0x" & hex($oerror.number) & @crlf & _
  141.                                 @tab & "err.windescription:" & @tab & $oerror.windescription & @crlf & _
  142.                                 @tab & "err.description is: " & @tab & $oerror.description & @crlf & _
  143.                                 @tab & "err.source is: " & @tab & @tab & $oerror.source & @crlf & _
  144.                                 @tab & "err.helpfile is: " & @tab & $oerror.helpfile & @crlf & _
  145.                                 @tab & "err.helpcontext is: " & @tab & $oerror.helpcontext & @crlf & _
  146.                                 @tab & "err.lastdllerror is: " & @tab & $oerror.lastdllerror & @crlf & _
  147.                                 @tab & "err.scriptline is: " & @tab & $oerror.scriptline & @crlf & _
  148.                                 @tab & "err.retcode is: " & @tab & "0x" & hex($oerror.retcode) & @crlf & @crlf
  149.                 _log($errinfo)
  150. endfunc   ;==>_autoit_error

  151. func _log($text)
  152.     _filewritelog($filelogpath, $text)
  153. endfunc   ;==>_log
  154. #endregion 基本函式


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

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

  167. func _setprocessdpiaware()
  168.                 local $aret
  169.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  170.                                 $aret = dllcall("user32.dll", "bool", "isprocessdpiaware") ;檢查處理程序是否支援dpi感知
  171.                                 return $aret[0]
  172.                                 if $aret[0] = false then
  173.                                                 $aret = dllcall('user32.dll', 'bool', 'setprocessdpiaware') ;設定:系統dpi感知
  174.                                                 if @error then return seterror(@error, 0, false)
  175.                                                 return
  176.                                 endif
  177.                 else
  178.                         $aret = dllcall("shcore.dll", "bool", "getprocessdpiawareness", "hwnd", 0, "int*", 0) ;檢查處理程序是否支援dpi感知
  179.                         if @error then return seterror(@error, 0, false)
  180.                         if $aret[2] <> 2 then ;;0:不支援dpi感知,1:系統dpi感知,2:監視器dpi感知
  181.                                         $aret = dllcall("shcore.dll", "bool", "setprocessdpiawareness", "int", 2) ;設定:監視器dpi感知
  182.                                         if @error then return seterror(@error, 0, false)
  183.                                         return
  184.                         endif
  185.                 endif
  186. endfunc   ;==>_setprocessdpiaware

  187. func _getdpi()
  188.                 local $idpi
  189.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  190.                                 $idpi = regread("hkcu\control panel\desktop\windowmetrics", "applieddpi")
  191.                 else
  192.                                 local $hwnd = _winapi_monitorfromwindow(_winapi_getdesktopwindow())
  193.                                 local $aret = dllcall("shcore.dll", "bool", "getdpiformonitor", "handle", $hwnd, "int", 0, "int*", 0, "int*", 0)
  194.                                 if @error then return seterror(@error, 0, false)
  195.                                 $idpi = $aret[3]
  196.                 endif
  197.                 if $idpi < 96 or $idpi > 480 then $idpi = 96
  198.                 return $idpi / 96
  199. endfunc   ;==>_getdpi

  200. func _isprocessdpiaware()
  201.                 local $aret, $adpi = 0
  202.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  203.                                 $aret = dllcall("user32.dll", "bool", "isprocessdpiaware") ;檢查處理程序是否支援dpi感知
  204.                                 if @error then return seterror(@error, 0, false)
  205.                                 $adpi = $aret[0]
  206.                 else
  207.                                 $aret = dllcall("shcore.dll", "bool", "getprocessdpiawareness", "hwnd", 0, "int*", 0) ;檢查處理程序是否支援dpi感知
  208.                                 if @error then return seterror(@error, 0, false)
  209.                                 $adpi = $aret[2]
  210.                 endif
  211.                 return $adpi
  212. endfunc   ;==>_isprocessdpiaware
  213. #endregion dpi函式

复制代码


 楼主| 发表于 2023-9-22 20:05:56 | 显示全部楼层
本帖最后由 anythinging 于 2023-9-22 20:08 编辑

如果是因為介面跑位不好ˋ看

那就試著讓它自動縮放?

感谢回复,我把这段代码放到你的代码里,好象没什么效果。
guictrlcreatelabel('',55,0,1,300)
guictrlsetbkcolor ( -1 , 0x003366)

guictrlcreatebutton("按钮",10,30,30,20)
guictrlcreatecheckbox("选择",10,100,40,20)
在100%无缩放的情况下,显示不全。

本帖子中包含更多资源

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

×
发表于 2023-9-22 20:28:57 | 显示全部楼层

感谢回复,我把这段代码放到你的代码里,好象没什么效果。
guictrlcreatelabel('',55,0,1,300)
guictrl ...

因為我有設置字體大小啊
  1. $fontsize = 12
复制代码



正確用法為:你在目前的模式下,就應該要調整好文字、控件大小了

編譯以後,會隨著縮放~
如一開始不正確,縮放後還是不會正常的...


  1. #region 編譯資訊
  2. ;;使用管理員權限
  3. #requireadmin
  4. ;;無系統匣圖示
  5. ;;#notrayicon
  6. ;;[url]https://www.autoitscript.com/wiki/autoit3wrapper_directives[/url]
  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.         
  40.         -q : 靜態 (僅輸出錯誤/警告)
  41.         -d : 等價於 opt("mustdeclarevars", 1)
  42.         -w 1: 已包含檔案 (打開)
  43.         -w 2: 缺少 # comments-end (打開)
  44.         -w 3: 變數已聲明 (關閉)
  45.         -w 4: 局部變數在全域範圍內使用 (關閉)
  46.         -w 5: 局部變數已聲明, 但未使用 (關閉)
  47.         -w 6: 使用 dim 時警告 (關閉)
  48.         -w 7: 傳遞常數或表示式到 byref 時警告 (打開)
  49.         -i dir: 搜尋其他目錄的包含檔案
  50.         
  51.         -v 1: 顯示包含路徑/檔案 (關閉)
  52.         -v 2: 顯示詞法標記 (關閉)
  53.         -v 3: 顯示未引用 udf 和全域變數 (關閉)

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


  60. #cs ____________________________________

  61.         au3版本:3.3.14.5
  62.         scite版本:3.6.6
  63.         腳本作者:

  64.         腳本功能:
  65.         參考代碼:

  66. #ce _______________腳本開始_________________


  67. #region 載入fuction
  68. #include
  69. #include
  70. #include
  71. #include


  72. #endregion 載入fuction



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

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


  87. #region 宣告變數
  88. global $hidpi

  89. global $mainguiwidth = 700 ;;介面寬
  90. global $mainguilength = 500 ;;介面高

  91. ;;全局字體及大小(備用字體:'comic sans ms'、'yahei consolas hybrid')
  92. global $fontsize = 12, $font_xing = 400, $font_var = default, $font_quality = 5
  93. global $font_name = 'microsoft jhenghei'

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

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

  101. #endregion 宣告變數


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


  105. #endregion opt模式

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


  117. global $maingui = guicreate($title & ' ' & $version, $mainguiwidth, $mainguilength, -1, -1)
  118. guisetonevent($gui_event_close, "_exit")
  119. guisetfont($fontsize, $font_xing, $font_var, $font_name, $maingui, $font_quality) ;;全局字型
  120. guisetbkcolor(0xe6e6e6) ;;將變更背景色彩

  121. guictrlcreatelabel('最佳程式碼實現 dpi-自適應縮放', 10, 10)


  122. guictrlcreatelabel('', 75, 30, 1, 300)
  123. guictrlsetbkcolor(-1, 0x003366)

  124. guictrlcreatebutton('按钮1', 10, 30)
  125. guictrlcreatebutton('按钮2', 100, 30, 100, 30)
  126. guictrlcreatecheckbox('选择1', 10, 100)
  127. guictrlcreatecheckbox('选择2', 100, 100, 100, 30)



  128.                 dpi_zoom($maingui, $hidpi) ;;以dpi進行視窗調整
  129. guisetstate(@sw_show, $maingui)
  130. ;;guisetstate(@sw_lock, $maingui) ;;鎖定
  131. ;;guisetstate(@sw_unlock, $maingui) ;;解除鎖定


  132. while 1
  133.         sleep(500)
  134. wend


  135. #region 基本函式
  136. func _exit() ;;離開軟體
  137.                 if msgbox(262144 36, '', '確定要退出嗎?', 0, $maingui) = 6 then
  138.                                 exit
  139.                 endif
  140. endfunc

  141. func _autoit_error($oerror)
  142.                 if $logflag <> 'y' then return

  143.                 local $errinfo = ""
  144.                 ;;do anything here.
  145.                 $errinfo = @scriptname & " (" & $oerror.scriptline & ") autoit.error : ==> com error intercepted !" & @crlf & '---------------------' & @crlf &  _
  146.                                 @tab & "err.number is: " & @tab & @tab & "0x" & hex($oerror.number) & @crlf & _
  147.                                 @tab & "err.windescription:" & @tab & $oerror.windescription & @crlf & _
  148.                                 @tab & "err.description is: " & @tab & $oerror.description & @crlf & _
  149.                                 @tab & "err.source is: " & @tab & @tab & $oerror.source & @crlf & _
  150.                                 @tab & "err.helpfile is: " & @tab & $oerror.helpfile & @crlf & _
  151.                                 @tab & "err.helpcontext is: " & @tab & $oerror.helpcontext & @crlf & _
  152.                                 @tab & "err.lastdllerror is: " & @tab & $oerror.lastdllerror & @crlf & _
  153.                                 @tab & "err.scriptline is: " & @tab & $oerror.scriptline & @crlf & _
  154.                                 @tab & "err.retcode is: " & @tab & "0x" & hex($oerror.retcode) & @crlf & @crlf
  155.                 _log($errinfo)
  156. endfunc   ;==>_autoit_error

  157. func _log($text)
  158.     _filewritelog($filelogpath, $text)
  159. endfunc   ;==>_log
  160. #endregion 基本函式


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

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

  173. func _setprocessdpiaware()
  174.                 local $aret
  175.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  176.                                 $aret = dllcall("user32.dll", "bool", "isprocessdpiaware") ;檢查處理程序是否支援dpi感知
  177.                                 return $aret[0]
  178.                                 if $aret[0] = false then
  179.                                                 $aret = dllcall('user32.dll', 'bool', 'setprocessdpiaware') ;設定:系統dpi感知
  180.                                                 if @error then return seterror(@error, 0, false)
  181.                                                 return
  182.                                 endif
  183.                 else
  184.                         $aret = dllcall("shcore.dll", "bool", "getprocessdpiawareness", "hwnd", 0, "int*", 0) ;檢查處理程序是否支援dpi感知
  185.                         if @error then return seterror(@error, 0, false)
  186.                         if $aret[2] <> 2 then ;;0:不支援dpi感知,1:系統dpi感知,2:監視器dpi感知
  187.                                         $aret = dllcall("shcore.dll", "bool", "setprocessdpiawareness", "int", 2) ;設定:監視器dpi感知
  188.                                         if @error then return seterror(@error, 0, false)
  189.                                         return
  190.                         endif
  191.                 endif
  192. endfunc   ;==>_setprocessdpiaware

  193. func _getdpi()
  194.                 local $idpi
  195.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  196.                                 $idpi = regread("hkcu\control panel\desktop\windowmetrics", "applieddpi")
  197.                 else
  198.                                 local $hwnd = _winapi_monitorfromwindow(_winapi_getdesktopwindow())
  199.                                 local $aret = dllcall("shcore.dll", "bool", "getdpiformonitor", "handle", $hwnd, "int", 0, "int*", 0, "int*", 0)
  200.                                 if @error then return seterror(@error, 0, false)
  201.                                 $idpi = $aret[3]
  202.                 endif
  203.                 if $idpi < 96 or $idpi > 480 then $idpi = 96
  204.                 return $idpi / 96
  205. endfunc   ;==>_getdpi

  206. func _isprocessdpiaware()
  207.                 local $aret, $adpi = 0
  208.                 if @osbuild < 9600 then ;;判斷系統版本 win8.1(9600)
  209.                                 $aret = dllcall("user32.dll", "bool", "isprocessdpiaware") ;檢查處理程序是否支援dpi感知
  210.                                 if @error then return seterror(@error, 0, false)
  211.                                 $adpi = $aret[0]
  212.                 else
  213.                                 $aret = dllcall("shcore.dll", "bool", "getprocessdpiawareness", "hwnd", 0, "int*", 0) ;檢查處理程序是否支援dpi感知
  214.                                 if @error then return seterror(@error, 0, false)
  215.                                 $adpi = $aret[2]
  216.                 endif
  217.                 return $adpi
  218. endfunc   ;==>_isprocessdpiaware
  219. #endregion dpi函式
复制代码
发表于 2023-9-22 20:49:31 | 显示全部楼层

前面提到了,不好使

这样试试
#include
global $gform1
local $hdc = _winapi_getdc($gform1)
local $iwidtha = _winapi_getdevicecaps($hdc, 118)
local $iheighta = _winapi_getdevicecaps($hdc, 117)
$gform1 = guicreate('', 380, 220)
guisetstate()
guictrlcreatelabel('', 55, 0, 1, 300)
guictrlsetbkcolor(-1, 0x003366)
guictrlcreatebutton("按钮", 10, 30, 30, 20)
guictrlcreatecheckbox("选择", 10, 100, 40, 20)
while 1
        switch guigetmsg()
                case -3
                        exit
        endswitch
wend
发表于 2023-9-22 21:02:18 | 显示全部楼层

如果能禁用当前程序缩放就省事了,不知怎样实现

local $w1 = 1440
local $h1 = 900
$gform1 = guicreate('', $w1 / 3.79, $h1 / 4.1);380, 220)
guisetstate()
guictrlcreatelabel('', 55, 0, 1, 300)
guictrlsetbkcolor(-1, 0x003366)
guictrlcreatebutton("按钮", 10, 30, 30, 20)
guictrlcreatecheckbox("选择", 10, 100, 40, 20)
while 1
        switch guigetmsg()
                case -3
                        exit
        endswitch
wend
 楼主| 发表于 2023-9-22 21:22:24 | 显示全部楼层

因為我有設置字體大小啊

按你说的,确实有效果。
不知有没有更简单点的,直接禁用缩放
 楼主| 发表于 2023-9-22 21:26:06 | 显示全部楼层

local $w1 = 1440
local $h1 = 900
$gform1 = guicreate('', $w1 / 3.79, $h1 / 4.1);380, 220)

感谢目前按11楼的方法,能解决缩放带来的字体变大,导致组件显示不全的问题。
禁止缩放可能是我想的简单了,想在100%的屏幕无缩放的环境下弄好的界面,在各种放大后仍然显示原来大小。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

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

powered by x3.5

© 2001-2023 .

返回列表
网站地图