找回密码
 加入
搜索
查看: 8416|回复: 21

[GUI管理] 【已解决】关于GUI内部控件大小控制,如何解决窗口缩放后控件重叠的问题?

 火.. [复制链接]
发表于 2016-4-13 23:32:58 | 显示全部楼层 |阅读模式
本帖最后由 chamlien 于 2016-4-17 11:00 编辑
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
opt('GUIResizeMode',1)

#Region ### START Koda GUI section ### Form=e:\my file\源码\个人开发者审核\ie临时文件助手\form1.kxf

$Form1 = GUICreate("Form1", 785, 451, -1, -1,0x00CF0000)
$Group1 = GUICtrlCreateGroup("Test", 12, 11, 520, 121)
$Input1 = GUICtrlCreateInput("Input1", 138, 40, 380, 23)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT+$GUI_DOCKHEIGHT)

GUISetState(@SW_SHOW)
GUIRegisterMsg(0x0005, '_ChangeSize')

#EndRegion ### END Koda GUI section ###

GUISetOnEvent($GUI_EVENT_CLOSE, "_MainSwitch")

While 1
        Sleep(100)
WEnd

Func _ChangeSize()
                ControlMove($Form1,'', $Input1, 10,10, 50,23)
EndFunc

Func _MainSwitch()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        GUIDelete($Form1)
                        Exit
        EndSwitch
EndFunc
1. 上方窗口缩小后,input控件会超过group控件的位置,如图:


2. 尝试使用 GUIRegisterMsg(0x0005, '_ChangeSize')来改变input的大小,但问题是,程序是先执行GUIRegisterMsg,再执行缩小或放大窗口的动作,也就是GUIRegisterMsg设定的大小会被重新覆盖;

因此,请教一下,怎样才能让input与group控件不重叠?或怎样使GUIRegisterMsg消息动作在放大或缩小窗口之后才执行呢?

本帖子中包含更多资源

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

×
发表于 2016-4-14 09:07:00 | 显示全部楼层
本帖最后由 ma395311229 于 2016-4-14 09:08 编辑

是否是你要求的??



#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
opt('GUIResizeMode',1)

#Region ### START Koda GUI section ### Form=e:\my file\源码\个人开发者审核\ie临时文件助手\form1.kxf

$Form1 = GUICreate("Form1", 785, 451, -1, -1,0x00CF0000)
$Group1 = GUICtrlCreateGroup("Test", 12, 11, 520, 121)
$Input1 = GUICtrlCreateInput("Input1", 138, 40, 380, 23)
GUICtrlSetResizing(-1, 1)

GUISetState(@SW_SHOW)
GUIRegisterMsg(0x0005, '_ChangeSize')

#EndRegion ### END Koda GUI section ###

GUISetOnEvent($GUI_EVENT_CLOSE, "_MainSwitch")

While 1
        Sleep(100)
WEnd

Func _ChangeSize()
                ControlMove($Form1,'', $Input1, 10,10, 50,23)
EndFunc

Func _MainSwitch()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        GUIDelete($Form1)
                        Exit
        EndSwitch
EndFunc

本帖子中包含更多资源

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

×
 楼主| 发表于 2016-4-14 10:04:09 | 显示全部楼层
回复 2# ma395311229

谢谢你的解答,但不是所要求的。原源码要保持控件的高度不变,左边位置不变,你把那些限制给去掉了。
发表于 2016-4-14 11:08:39 | 显示全部楼层
回复 1# chamlien
那这样呢
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
opt('GUIResizeMode',1)
Global $iWidtha = 785;@DesktopWidth
Global $iHeighta = 451;@DesktopHeight
#Region ### START Koda GUI section ### Form=e:\my file\源码\个人开发者审核\ie临时文件助手\form1.kxf

$Form1 = GUICreate("Form1", $iWidtha, $iHeighta , -1, -1, $WS_OVERLAPPEDWINDOW);,0x00CF0000)
$Group1 = GUICtrlCreateGroup("Test", 12, 11, $iWidtha-265, 121)
$Input1 = GUICtrlCreateInput("Input1", 138, 40, $iWidtha-405, $iHeighta-428)
;GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT+$GUI_DOCKHEIGHT)

GUISetState(@SW_SHOW)
GUIRegisterMsg(0x0005, '_ChangeSize')

#EndRegion ### END Koda GUI section ###

GUISetOnEvent($GUI_EVENT_CLOSE, "_MainSwitch")

While 1
        Sleep(100)
WEnd

Func _ChangeSize()
                ControlMove($Form1,'', $Input1, 10,10, 50,23)
EndFunc

Func _MainSwitch()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        GUIDelete($Form1)
                        Exit
        EndSwitch
EndFunc
 楼主| 发表于 2016-4-14 11:57:45 | 显示全部楼层
回复 4# chzj589

谢谢,不过控件还是会往左边缩进,怎样保持左边的位置不动呢?
 楼主| 发表于 2016-4-15 11:14:03 | 显示全部楼层
自顶一下,
发表于 2016-4-15 11:33:48 | 显示全部楼层
本帖最后由 kk_lee69 于 2016-4-15 11:35 编辑

回复 6# chamlien

老實說 我測試 你的源嗎  無法測試出你的狀況  不知道是甚麼原因

要不要考慮是 作業系統問題
 楼主| 发表于 2016-4-15 12:38:44 | 显示全部楼层
找到了一个折中的方法,控制窗口缩放的最小值,参考来自:http://www.autoitx.com/forum.php ... hlight=%B4%F3%D0%A1

下面是代码:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
opt('GUIResizeMode',1)

$Form1 = GUICreate("Form1", 785, 451, -1, -1,0x00CF0000)
$Group1 = GUICtrlCreateGroup("Test", 12, 11, 520, 121)
$Input1 = GUICtrlCreateInput("Input1", 138, 40, 380, 23)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT+$GUI_DOCKHEIGHT)

GUISetState(@SW_SHOW)
GUIRegisterMsg(0x24, "WM_GETMINMAXINFO")


#EndRegion ### END Koda GUI section ###

GUISetOnEvent($GUI_EVENT_CLOSE, "_MainSwitch")

While 1
        Sleep(100)
WEnd


Func _MainSwitch()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        GUIDelete($Form1)
                        Exit
        EndSwitch
        EndFunc
        

Func WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lparam)
        Local $tBuffer = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lparam)
        DllStructSetData($tBuffer, 7, 747);限制窗口的最小宽度为400
        Return "GUI_RUNDEFMSG"
EndFunc
发表于 2016-4-16 23:20:25 | 显示全部楼层
是这个效果吗
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Opt('GUIResizeMode', 1)

#region ### START Koda GUI section ### Form=e:\my file\源码\个人开发者审核\ie临时文件助手\form1.kxf

$Form1 = GUICreate("Form1", 785, 451, -1, -1, 0x00CF0000)
$Group1 = GUICtrlCreateGroup("Test", 12, 11, 520, 121)
$Input1 = GUICtrlCreateInput("Input1", 138, 40, 380, 23)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKHEIGHT)

GUISetState(@SW_SHOW)
GUIRegisterMsg(0x0005, '_ChangeSize')

#endregion ### END Koda GUI section ###

GUISetOnEvent($GUI_EVENT_CLOSE, "_MainSwitch")

While 1
        Sleep(100)
WEnd

Func _ChangeSize()
        $pos = ControlGetPos($Form1, '', $Group1)
        GUICtrlSetPos($Input1, $pos[0] + 126, $pos[1] + 29, $pos[2] - 140, 23)
EndFunc   ;==>_ChangeSize

Func _MainSwitch()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        GUIDelete($Form1)
                        Exit
        EndSwitch
EndFunc   ;==>_MainSwitch

评分

参与人数 1金钱 +13 收起 理由
chamlien + 13 提供了一个思路,非常感谢

查看全部评分

发表于 2016-4-16 23:23:30 | 显示全部楼层
还是要这个效果?
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
opt('GUIResizeMode',1)

#Region ### START Koda GUI section ### Form=e:\my file\源码\个人开发者审核\ie临时文件助手\form1.kxf

$Form1 = GUICreate("Form1", 785, 451, -1, -1,0x00CF0000)
$Group1 = GUICtrlCreateGroup("Test", 12, 11, 520, 121)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
$Input1 = GUICtrlCreateInput("Input1", 138, 40, 380, 23)
GUICtrlSetResizing(-1, $GUI_DOCKALL)

GUISetState(@SW_SHOW)
;GUIRegisterMsg(0x0005, '_ChangeSize')

#EndRegion ### END Koda GUI section ###

GUISetOnEvent($GUI_EVENT_CLOSE, "_MainSwitch")

While 1
        Sleep(100)
WEnd
Func _ChangeSize()
        ControlMove($Form1,'', $Input1, 10,10, 50,23)
EndFunc


Func _MainSwitch()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        GUIDelete($Form1)
                        Exit
        EndSwitch
EndFunc
 楼主| 发表于 2016-4-17 10:59:27 | 显示全部楼层
回复 9# zldfsz

感谢感谢,原来也挺简单,思路挺重要的,一个GUICtrlSetPos就搞定了,厉害!
 楼主| 发表于 2016-4-17 11:00:14 | 显示全部楼层
回复 10# zldfsz

这个效果控件都是固定的了,感谢,想要的效果已在9楼
发表于 2016-4-17 11:10:21 | 显示全部楼层
回复  zldfsz

感谢感谢,原来也挺简单,思路挺重要的,一个GUICtrlSetPos就搞定了,厉害!
chamlien 发表于 2016-4-17 10:59



    如果大师的代码是你想要的效果,那你应该继续完善最小化、最大化事件。
 楼主| 发表于 2016-4-17 11:47:19 | 显示全部楼层
本帖最后由 chamlien 于 2016-4-17 11:53 编辑

回复 13# afan

这个窗口主要是模仿了IE临时文件助手,最大最小化事件的方法应该很多,下面这个我写的窗口还原还没能解决输入框的位置:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Opt('GUIResizeMode', 1)
Opt('GUIEventOptions', 1)
#region ### START Koda GUI section ### Form=e:\my file\源码\个人开发者审核\ie临时文件助手\form1.kxf

$Form1 = GUICreate("Form1", 785, 451, -1, -1, 0x00CF0000)
$Group1 = GUICtrlCreateGroup("Test", 12, 11, 520, 121)
GUICtrlSetResizing(-1, $GUI_DOCKMENUBAR + $GUI_DOCKLEFT)
$Input1 = GUICtrlCreateInput("Input1", 138, 40, 380, 23)
GUICtrlSetResizing(-1, $GUI_DOCKMENUBAR + $GUI_DOCKLEFT)

GUISetState(@SW_SHOW)
GUIRegisterMsg(0x0005, '_ChangeSize')

#endregion ### END Koda GUI section ###

GUISetOnEvent($GUI_EVENT_CLOSE, "_MainSwitch")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "_MainSwitch")
GUISetOnEvent($GUI_EVENT_MAXIMIZE, "_MainSwitch")
GUISetOnEvent($GUI_EVENT_RESTORE, "_MainSwitch")

While 1
        Sleep(100)
WEnd

Func _ChangeSize()
        Local $pos = ControlGetPos($Form1, '', $Group1)
        GUICtrlSetPos($Input1, $pos[0] + 126, $pos[1] + 29, $pos[2] - 140, 23)
EndFunc   ;==>_ChangeSize

Func _MainSwitch()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        GUIDelete($Form1)
                        Exit
                Case $GUI_EVENT_MINIMIZE
                        GUISetState(@SW_MINIMIZE)
                Case $GUI_EVENT_MAXIMIZE
                        GUISetState(@SW_MAXIMIZE)
                        _sysWindow()
                Case $GUI_EVENT_RESTORE
                        GUISetState(@SW_RESTORE)
                        _sysWindow()
        EndSwitch
EndFunc   ;==>_MainSwitch

Func _sysWindow()
        Local $wgroup1 = ControlGetPos($Form1,'', $Group1)
        GUICtrlSetPos($Input1, $wgroup1[0] + 126, $wgroup1[1] + 29, $wgroup1[2] - 140, 23)
EndFunc
发表于 2016-4-18 21:08:51 | 显示全部楼层
如果大师的代码是你想要的效果,那你应该继续完善最小化、最大化事件。
afan 发表于 2016-4-17 11:10


    还是A版考虑得周到

回复 14# chamlien

#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Opt('GUIResizeMode', 1)
 
#region ### START Koda GUI section ### Form=e:\my file\源码\个人开发者审核\ie临时文件助手\form1.kxf
 
$Form1 = GUICreate("Form1", 785, 451, -1, -1, 0x00CF0000)
$Group1 = GUICtrlCreateGroup("Test", 12, 11, 520, 121)
$Input1 = GUICtrlCreateInput("Input1", 138, 40, 380, 23)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKHEIGHT)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_WINDOWPOSCHANGED, '_ChangeSize')
GUISetOnEvent($GUI_EVENT_RESTORE, '_ChangeSize')
GUISetOnEvent($GUI_EVENT_RESIZED, '_ChangeSize')
GUISetOnEvent($GUI_EVENT_MAXIMIZE, '_ChangeSize')

#endregion ### END Koda GUI section ###
GUISetOnEvent($GUI_EVENT_CLOSE, "_MainSwitch")
 
While 1
        Sleep(100)
WEnd
Func _ChangeSize()
        $pos = ControlGetPos($Form1, '', $Group1)
        GUICtrlSetPos($Input1, $pos[0] + 126, $pos[1] + 29, $pos[2] - 140, 23)
EndFunc   ;==>_ChangeSize
 
Func _MainSwitch()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        GUIDelete($Form1)
                        Exit
        EndSwitch
EndFunc   ;==>_MainSwitch
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-26 09:31 , Processed in 0.084206 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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