找回密码
 加入
搜索
楼主: .Simba

[GUI管理] [已解决]控件Edit 如何根据窗口大小变化呢

[复制链接]
发表于 2020-5-28 17:06:36 | 显示全部楼层
afan 发表于 2020-5-28 11:18
木子666~~~
印象中我当时写这个拖拉中部分界条而改变上下编辑框大小的时候,一开始也是使用的这种方式, ...

前辈过奖,我只是没事瞎折腾,纯粹自娱自乐。
发表于 2020-5-28 21:01:39 | 显示全部楼层
afan 发表于 2020-5-28 16:25
已修正,顺便修改了一些坐标尺寸逻辑;以及看楼主贴图似乎工具栏下横线显示异常的问题。

辛苦了,这个软件很有用
发表于 2020-5-29 10:12:29 | 显示全部楼层
解决问题及时修改标题,下次扣分 -20起步。
 楼主| 发表于 2020-5-29 10:13:47 | 显示全部楼层
afan 发表于 2020-5-29 10:12
解决问题及时修改标题,下次扣分 -20起步。

还没有解决哈,我把Edit嵌套在Tab控件下,还没有达到理想效果。
发表于 2020-5-29 10:23:10 | 显示全部楼层
.Simba 发表于 2020-5-29 10:13
还没有解决哈,我把Edit嵌套在Tab控件下,还没有达到理想效果。

那你慢慢折腾,伸手党不是那么好当的
 楼主| 发表于 2020-5-29 10:24:56 | 显示全部楼层
afan 发表于 2020-5-29 10:23
那你慢慢折腾,伸手党不是那么好当的

嗯,我先自己折腾,实在不行再贴出代码,指点一下。
 楼主| 发表于 2020-5-29 10:59:43 | 显示全部楼层
afan 发表于 2020-5-29 10:23
那你慢慢折腾,伸手党不是那么好当的

A大,我现在是这样处理的,感觉拖动快的时候还是有一点晃动,有更好的解决办法吗?另外还有一个问题,我吧Edit控件换成富文本控件,这个改变大小的方式就不管用了。
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

#Region ### START Koda GUI section ###
$Form1 = GUICreate("测试窗体", 615, 450, -1, -1, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_SIZEBOX))
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "Form1Minimize")
GUISetOnEvent($GUI_EVENT_MAXIMIZE, "Form1Maximize")
GUISetOnEvent($GUI_EVENT_RESTORE, "Form1Restore")

$Tab1 = GUICtrlCreateTab(24, 24, 569, 390)
GUICtrlCreateTabItem("Tab1")
$Edit1 = GUICtrlCreateEdit("", 28, 50, 561, 360)
GUICtrlSetData(-1, "Edit1")

GUICtrlCreateTabItem("Tab2")
$Edit2 = GUICtrlCreateEdit("", 28, 50, 561, 360)
GUICtrlSetData(-1, "Edit2")

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUIRegisterMsg($WM_SIZE, "WM_SIZE")
While 1
        Sleep(100)
WEnd

Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
        Switch $hWnd
                Case $Form1
                        Local $aPos = ControlGetPos('', '', $Edit1)
                        If Not @error Then
                                $iX = $aPos[0] - 2
                                $iY = $aPos[1] - 20
                                $iW = $aPos[2] + 10
                                $iH = $aPos[3] + 25
                                GUICtrlSetPos($Tab1, $iX, $iY, $iW, $iH)
                        EndIf
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE

Func Form1Close()
        Exit
EndFunc   ;==>Form1Close
Func Form1Maximize()
        Local $aPos = ControlGetPos('', '', $Edit1)
        If Not @error Then
                $iX = $aPos[0] - 2
                $iY = $aPos[1] - 20
                $iW = $aPos[2] + 10
                $iH = $aPos[3] + 25
                GUICtrlSetPos($Tab1, $iX, $iY, $iW, $iH)
        EndIf
EndFunc   ;==>Form1Maximize
Func Form1Minimize()
        Local $aPos = ControlGetPos('', '', $Edit1)
        If Not @error Then
                $iX = $aPos[0] - 2
                $iY = $aPos[1] - 20
                $iW = $aPos[2] + 10
                $iH = $aPos[3] + 25
                GUICtrlSetPos($Tab1, $iX, $iY, $iW, $iH)
        EndIf
EndFunc   ;==>Form1Minimize
Func Form1Restore()
        Local $aPos = ControlGetPos('', '', $Edit1)
        If Not @error Then
                $iX = $aPos[0] - 2
                $iY = $aPos[1] - 20
                $iW = $aPos[2] + 10
                $iH = $aPos[3] + 25
                GUICtrlSetPos($Tab1, $iX, $iY, $iW, $iH)
        EndIf
EndFunc   ;==>Form1Restore


发表于 2020-5-29 13:24:50 | 显示全部楼层
.Simba 发表于 2020-5-29 10:59
A大,我现在是这样处理的,感觉拖动快的时候还是有一点晃动,有更好的解决办法吗?另外还有一个问题,我 ...

你这代码运行结果令人迷糊,不知所谓。重复的、不需要的代码也多…
需要干预的控件要添加 GUICtrlSetResizing 使其约束。
富文本控件没有ID,要用 WinMove 控制。
 楼主| 发表于 2020-5-29 14:01:24 | 显示全部楼层
afan 发表于 2020-5-29 13:24
你这代码运行结果令人迷糊,不知所谓。重复的、不需要的代码也多…
需要干预的控件要添加 GUICtrlSetRes ...

最小化,最大化那里是重复代码是临时的,源代码不加的话 最大化最小化和复位,控件都会错位的。
 楼主| 发表于 2020-5-29 14:08:12 | 显示全部楼层
afan 发表于 2020-5-29 13:24
你这代码运行结果令人迷糊,不知所谓。重复的、不需要的代码也多…
需要干预的控件要添加 GUICtrlSetRes ...

按照你说的我这样写,不过没一个TAB页里的EDIT都需要单独控制大小,不知道合理不。

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

#Region ### START Koda GUI section ###
$Form1 = GUICreate("测试窗体", 615, 450, -1, -1, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_SIZEBOX))
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")

$Tab1 = GUICtrlCreateTab(24, 24, 569, 390)
GUICtrlSetResizing($Tab1, 1)
GUICtrlCreateTabItem("Tab1")
$Edit1 = GUICtrlCreateEdit("", 28, 50, 561, 360)
GUICtrlSetData(-1, "Edit1")

GUICtrlCreateTabItem("Tab2")
$Edit2 = GUICtrlCreateEdit("", 28, 50, 561, 360)
GUICtrlSetData(-1, "Edit2")

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUIRegisterMsg($WM_SIZE, "WM_SIZE")
While 1
        Sleep(100)
WEnd

Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
        Switch $hWnd
                Case $Form1
                        Local $aPos = ControlGetPos('', '', $Tab1)
                        If Not @error Then
                                $iX = $aPos[0] + 4
                                $iY = $aPos[1] + 26
                                $iW = $aPos[2] - 4
                                $iH = $aPos[3] - 28
                                GUICtrlSetPos($Edit1, $iX, $iY, $iW, $iH)
                                GUICtrlSetPos($Edit2, $iX, $iY, $iW, $iH) ;这样写这里要多一个对Edit2控件的大小控制
                        EndIf
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE

Func Form1Close()
        Exit
EndFunc   ;==>Form1Close
发表于 2020-5-29 14:13:17 | 显示全部楼层
.Simba 发表于 2020-5-29 14:01
最小化,最大化那里是重复代码是临时的,源代码不加的话 最大化最小化和复位,控件都会错位的。

如果你觉得没问题那我再回你最后一贴
最小化事件是不需要的
最大化、还原与WM_SIZE消息内的控制代码是重复的,应该写成一个函数统一调用,这样才不会出现改一处还要改N处的情况。
你加了这些就不错位了吗?随便试一下最小化、最大化、还原试试~ 错位到吐血
 楼主| 发表于 2020-5-29 15:24:06 | 显示全部楼层
afan 发表于 2020-5-29 14:13
如果你觉得没问题那我再回你最后一贴
最小化事件是不需要的
最大化、还原与WM_SIZE消息内的控制代码是 ...

确实错位厉害,我再折腾一下。
 楼主| 发表于 2020-5-30 00:14:49 | 显示全部楼层
afan 发表于 2020-5-29 14:13
如果你觉得没问题那我再回你最后一贴
最小化事件是不需要的
最大化、还原与WM_SIZE消息内的控制代码是 ...

A大,我觉得差不多了,按照你的经验还能帮我修改一下不?
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

Global $Form, $GroupOne, $Tab, $TabOne, $TabTwo, $EditOne, $EditTwo

#Region ### START Koda GUI section ###
$Form = GUICreate("测试窗体", 615, 450, -1, -1, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_SIZEBOX))
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "Form1Minimize")
GUISetOnEvent($GUI_EVENT_MAXIMIZE, "Form1Maximize")
GUISetOnEvent($GUI_EVENT_RESTORE, "Form1Restore")

$GroupOne = GUICtrlCreateGroup("", 10, 2, 590, 420, -1, $WS_EX_TRANSPARENT)

$Tab = GUICtrlCreateTab(12, 10, 588, 410)
$TabOne = GUICtrlCreateTabItem("TabOne")
$EditOne = GUICtrlCreateEdit("", 13, 31, 584, 388, $ES_MULTILINE + $WS_VSCROLL)
GUICtrlSetData(-1, "Edit1")

$TabTwo = GUICtrlCreateTabItem("TabTwo")
$EditTwo = GUICtrlCreateEdit("", 28, 50, 561, 360, $ES_MULTILINE + $WS_VSCROLL)
GUICtrlSetData(-1, "Edit2")

GUICtrlCreateGroup("", -99, -99, 1, 1)

GUISetState(@SW_SHOW)

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

GUIRegisterMsg($WM_SIZE, "WM_SIZE")
While 1
        Sleep(100)
WEnd

Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
        Switch $hWnd
                Case $Form
                        Local $aPos = ControlGetPos($Form, '', $GroupOne) ;WinGetPos()
                        If Not @error Then
                                _SetControlGetPos($Form, $GroupOne, $Tab, 4, 9, -3, -10)
                                _SetControlGetPos($Form, $Tab, $EditOne, 0, 22, -2, -22)
                                _SetControlGetPos($Form, $Tab, $EditTwo, 0, 22, -2, -22)
                        EndIf
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE

Func Form1Close()
        Exit
EndFunc   ;==>Form1Close

Func _SetControlGetPos($hWndForm, $hWndControl, $hSetControl, $iX, $iY, $iWidth, $iHeight, $sFromText = '')
        Local $aPos = ControlGetPos($hWndForm, $sFromText, $hWndControl)
        $iX = $aPos[0] + $iX
        $iY = $aPos[1] + $iY
        $iWidth = $aPos[2] + $iWidth
        $iHeight = $aPos[3] + $iHeight
        GUICtrlSetPos($hSetControl, $iX, $iY, $iWidth, $iHeight)
EndFunc   ;==>_SetControlGetPos

Func _SetWinGetPos($hWnd, $arrPos)

EndFunc   ;==>_SetWinGetPos

Func Form1Maximize()
        _SetControlGetPos($Form, $GroupOne, $Tab, 4, 9, -3, -10)
        _SetControlGetPos($Form, $Tab, $EditOne, 0, 22, -2, -22)
        _SetControlGetPos($Form, $Tab, $EditTwo, 0, 22, -2, -22)
EndFunc   ;==>Form1Maximize

Func Form1Minimize()

EndFunc   ;==>Form1Minimize

Func Form1Restore()
        _SetControlGetPos($Form, $GroupOne, $Tab, 4, 9, -3, -10)
        _SetControlGetPos($Form, $Tab, $EditOne, 0, 22, -2, -22)
        _SetControlGetPos($Form, $Tab, $EditTwo, 0, 22, -2, -22)
EndFunc   ;==>Form1Restore
发表于 2020-6-5 21:31:06 | 显示全部楼层
afan 发表于 2020-5-28 11:18
木子666~~~
印象中我当时写这个拖拉中部分界条而改变上下编辑框大小的时候,一开始也是使用的这种方式, ...

A大,你的正则工具,中间可以拖动的地方是用什么函数创建的?想知道一下
发表于 2020-6-5 21:50:15 | 显示全部楼层
heroxianf 发表于 2020-6-5 21:31
A大,你的正则工具,中间可以拖动的地方是用什么函数创建的?想知道一下

就是普通的控件移动,没有特殊的地方
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-2 20:40 , Processed in 0.075244 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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