找回密码
 加入
搜索
查看: 6929|回复: 14

[AU3基础] 『 已解决』 鼠标拉伸图片控件

 火.. [复制链接]
发表于 2011-11-24 08:54:41 | 显示全部楼层 |阅读模式
本帖最后由 dnbj2010 于 2011-11-24 18:41 编辑

如图:



想达到的目的是,在AU3窗体中,当鼠标接近图片控件的边缘时,鼠标左键按下,即可拉伸图片控件的大小。
就像在KODA编辑器里操作一样。
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 623, 449, 192, 114)
$Pic1 = GUICtrlCreatePic(@SystemDir & "\setup.bmp", 168, 40, 260, 220)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd

本帖子中包含更多资源

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

×
发表于 2011-11-24 09:04:02 | 显示全部楼层
我也想知道结果哈。。
发表于 2011-11-24 09:12:21 | 显示全部楼层
在论坛好像我见过,你找找看
发表于 2011-11-24 10:49:00 | 显示全部楼层

.

本帖最后由 xiehuahere 于 2011-11-24 10:52 编辑

论坛没找到哦,版主给个链接嘛。 我等也好学习学习。
  
个人想法:
1. 捕获 $GUI_EVENT_PRIMARYDOWN 窗口消息。
2. 使用GUIGetCursorInfo()判断鼠标位置是否在图片控件上($array[4])并且在边缘($array[0], $array[1])。
3. 如果第2步判断成立,就使用GUICtrlSetPos() 开始跟随鼠标位置的变化调整控件大小。
4. 捕获 $GUI_EVENT_PRIMARYUP 窗口消息,停止调整。
发表于 2011-11-24 11:01:01 | 显示全部楼层
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $aUtil_MinMax[4]


$Master_From=GUICreate('WM_GETMINMAXINFO',800,640,-1,-1)
$Sub_Form=GUICreate('WM_GETMINMAXINFO',400,400,-1,-1,$WS_SIZEBOX+$WS_CHILD,-1,$Master_From)
$pic=GUICtrlCreatePic(@DesktopDir&"\a.jpg",0,0,400,400)
GUICtrlSetResizing($pic,$GUI_DOCKAUTO)
GUISetState(@SW_SHOW,$Sub_Form)
GUISetState(@SW_SHOW,$Master_From)
initMinMax(100,100,600,600)

Do
    Sleep(20)
Until GUIGetMsg() = -3

Func initMinMax($x0,$y0,$x1,$y1)
    Local Const $WM_GETMINMAXINFO = 0x24
    $aUtil_MinMax[0]=$x0
    $aUtil_MinMax[1]=$y0
    $aUtil_MinMax[2]=$x1
    $aUtil_MinMax[3]=$y1
    GUIRegisterMsg($WM_GETMINMAXINFO,'MY_WM_GETMINMAXINFO')
EndFunc

Func MY_WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
        If $hWnd=$Sub_Form Then
    Local $minmaxinfo = DllStructCreate('int;int;int;int;int;int;int;int;int;int',$lParam)
    DllStructSetData($minmaxinfo,7,$aUtil_MinMax[0]); min X
    DllStructSetData($minmaxinfo,8,$aUtil_MinMax[1]); min Y
    DllStructSetData($minmaxinfo,9,$aUtil_MinMax[2]); max X
    DllStructSetData($minmaxinfo,10,$aUtil_MinMax[3]); max Y
        EndIf
    Return $GUI_RUNDEFMSG
EndFunc

评分

参与人数 2金钱 +42 贡献 +10 收起 理由
dnbj2010 + 30 + 5 代码精炼,有启发性!
xiehuahere + 12 + 5 学习了。。。

查看全部评分

发表于 2011-11-24 11:22:00 | 显示全部楼层
本帖最后由 xiehuahere 于 2011-11-24 11:40 编辑

回复 5# 3mile


    学习了。。。了解一下 WM_GETMINMAXINFO 消息。
   那个什么。。真的如连绵江水,滔滔不绝。
   积累很重要啊

WM_GETMINMAXINFO = $0024;
此消息发送给窗口(当它将要改变大小或位置时),所以用子窗口来实现真是很好的创意,同时可以控制图片拉伸的范围。
发表于 2011-11-24 13:09:00 | 显示全部楼层
这个不错,多谢3smile兄,学习了
发表于 2011-11-24 13:26:29 | 显示全部楼层
LZ 做这个图片控件拉伸具体是做什么用的? 如果是做图片(图像)处理那最好用 _GDIPlus* 类函数处理。
 楼主| 发表于 2011-11-24 13:48:21 | 显示全部楼层
回复 5# 3mile

-----------------------------------------------------
就是奔着"消息"来的,还真的就是"消息",呵呵。
原来是套了个子窗口,利用这个子窗口来接收伸缩消息,够绝的.....佩服..
谢谢3mile论坛元老的指导!
坛里的“超版”啊,“元老”啊,真是都是高人,出手代码精炼简约,却又内涵丰富。
学习了!

也模仿着写了一个,代码如下:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1) 

$Form1 = GUICreate("拉伸控件",623,444,192,124)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") 
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "FMOVE") 
GUISetState(@SW_SHOW,$Form1)

$Form2 = GUICreate("Sub_Form",185,89,192+192,124+124,BitOR($WS_POPUP,$WS_SIZEBOX),"",$Form1)
$Pic1 = GUICtrlCreatePic(@SystemDir & "\setup.bmp",0,0,185, 89)    ;图片路径
GUICtrlSetResizing ($Pic1,$GUI_DOCKAUTO) 
GUISetState(@SW_SHOW,$Form2)

While 1
        Sleep(1)
WEnd

Func CLOSEClicked()
          GUIDelete($Form1)
          Exit
EndFunc

Func FMOVE()
         $XY = WinGetPos($Form2)
        $XY2 = WinGetPos($Form1)
        If $XY2[0] <> $XY[0] Or $XY2[1] <> $XY[1] Then
                WinMove($Form2, "", $XY2[0]+192, $XY2[1]+124)
        EndIf                 
EndFunc
 楼主| 发表于 2011-11-24 14:07:49 | 显示全部楼层
回复 8# afan

---------------------------------------
回afan版主,是这样的。只是一个举例,
不是应用在图像处理方面的。
我先写了一个在窗体里调整控件的代码,是基于GUIGetCursorInfo鼠标状态来判断的。
但想了解一下如果是消息触发应该怎么写,是不是更有效率。
没想到套个子窗口,一根筋了...冏。

前些天做连接SQL数据库的练习,结果发现GUICtrlCreateListView控件显示数据足够,但还是功能有限。
比如连接到表后,不能直接的操作数据编辑,就像SQL企业管理器那样直观的编辑。

想要编辑,只能根据检索到的字段,动态生成类似Input那样的编辑框, 然后修改。
一时胡思乱想,如果多个类Input编辑框组合在一起形成联动控件,不是可以很方便的管理编辑数据库的数据吗?
........见笑了,做了试验,不成就拉倒...
发表于 2011-11-24 14:17:38 | 显示全部楼层
回复 10# dnbj2010


    ListView 可以就地编辑呀,也是在Edit控件中处理的~
如果你想用Edit控件组合在一起形成联动控件,那要处理的东西就比较多了~ 当然,你要处理的具体情况我也不清楚,或许也很简单。
 楼主| 发表于 2011-11-24 14:50:43 | 显示全部楼层
回复 11# afan

--------------------------------------------------
.....那要处理的东西就比较多了......
嗯,明白了,就是效率可能很低了。谢谢A版。
 楼主| 发表于 2011-11-24 14:57:52 | 显示全部楼层
下面把那个基于判断鼠标状态与控件边界的代码也贴出来:
鼠标还不能变形,直接拉吧
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>

Opt("GUIOnEventMode", 1) 
Local $k

$Form1 = GUICreate("拉伸控件", 623, 444, 192, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") ; 
$Button1 = GUICtrlCreateButton("", 192, 144, 185, 89,$BS_BITMAP,$BS_PUSHBOX)   ;这个按钮可拉伸
GUISetState(@SW_SHOW)

 While 1
     Sleep(1)
         $GUICur = GUIGetCursorInfo($Form1)         
         If $GUICur[4] = 3 And $GUICur[2] = 1 Then
                 lashen()
         EndIf
 WEnd

Func lashen()
            $k = 1
        $Ctr = ControlGetPos("拉伸控件","",$Button1)      ;控件信息
                $nPos = WinGetPos("拉伸控件")                    ;主窗信息
        
        ;-------------------------------------------------------------------------------右边拉伸
                $S71 = ($GUICur[0] >= $Ctr[0] + $Ctr[2]- 8)      ; 右边
                $S72 = ($GUICur[0] <= $Ctr[0] + $Ctr[2]+ 8)      ; 右边
                  
        If $S71 And $S72 Then 
                        ;这里要加一个拖拽的条件
                        If $k = 1 Then
               ControlMove ("拉伸控件","", $Button1,$Ctr[0],$Ctr[1],$GUICur[0]+4-$Ctr[0],$Ctr[3])                            
                        EndIf
                EndIf
            ;-------------------------------------------------------------------------------底边拉伸
         $S81 = ($GUICur[1] >= $Ctr[1] + $Ctr[3]- 8)      ; 底边
                 $S82 = ($GUICur[1] <= $Ctr[1] + $Ctr[3]+ 8)      ; 底边

        If $S81 And $S82 Then 
                        If $k = 1 Then
               ControlMove ("拉伸控件","", $Button1,$Ctr[0],$Ctr[1],$Ctr[2],$GUICur[1]+4-$Ctr[1])                            
                        EndIf
                EndIf
                ;------------------------------------------------------------------------------左边拉伸
        $S51 = ($GUICur[0] <= $Ctr[0]+ 8)      ; 左边
                $S52 = ($GUICur[0] >= $Ctr[0]- 8)      ; 左边
                
        If $S51 And $S52 Then 
                        If $k = 1 Then
               ControlMove ("拉伸控件","", $Button1,$GUICur[0]-4,$Ctr[1],$Ctr[2]-($GUICur[0]-4-$Ctr[0]),$Ctr[3])                                                 ControlMove ("拉伸控件","", $Button1,$GUICur[0]-4,$Ctr[1],$Ctr[2]-($GUICur[0]-4-$Ctr[0]),$Ctr[3])                                    
                        EndIf
                EndIf                
                ;---------------------------------------------------------------------------------上边拉伸
        $S61 = ($GUICur[1] <= $Ctr[1]+ 8)      ; 上边
                $S62 = ($GUICur[1] >= $Ctr[1]- 8)      ; 上边

        If $S61 And $S62 Then  
                        If $k = 1 Then
               ControlMove ("拉伸控件","", $Button1,$Ctr[0],$GUICur[1]-4,$Ctr[2],$Ctr[3]-($GUICur[1]-4-$Ctr[1]))                                    
                        EndIf
                EndIf
;-----------------------------------------------------------------------------------
        $S1x1 = ($GUICur[0] >= $Ctr[0]+ $Ctr[2]- 8)  ; 右下角x
                $S1x2 = ($GUICur[0] <= $Ctr[0]+ $Ctr[2]+ 8)  ; 右下角x
                
        $S1y1 = ($GUICur[1] >= $Ctr[1]+ $Ctr[3]- 8)  ; 右下角y
                $S1y2 = ($GUICur[1] <= $Ctr[1]+ $Ctr[3]+ 8)  ; 右下角y

        If $S1x1 and $S1x2 and $S1y1 and $S1y2 Then 

                        If $k = 1 Then
               ControlMove ("拉伸控件","", $Button1,$Ctr[0],$Ctr[1],$GUICur[0]+4-$Ctr[0],$GUICur[1]+4-$Ctr[1])                                    
                        EndIf
                EndIf                        
;------------------------------------------------------------------------------------
        $S2x1 = ($GUICur[0] <= $Ctr[0]+ 8)            ; 左上角x
                $S2x2 = ($GUICur[0] >= $Ctr[0]- 8)            ; 左上角x
                
        $S2y1 = ($GUICur[1] <= $Ctr[1]+ 8)            ; 左上角y
                $S2y2 = ($GUICur[1] >= $Ctr[1]- 8)            ; 左上角y
        
                If $S2x1 and $S2x2 and $S2y1 and $S2y2 Then 

                        If $k = 1 Then
                       ControlMove ("拉伸控件","", $Button1,$GUICur[0]-4,$GUICur[1]-4,$Ctr[2]-($GUICur[0]-4-$Ctr[0]),$Ctr[3]-($GUICur[1]-4-$Ctr[1])) 
                        EndIf
                EndIf        
;------------------------------------------------------------------------------------
        $S3x1 = ($GUICur[0] <= $Ctr[0]+8)             ; 左下角x
        $S3x2 = ($GUICur[0] >= $Ctr[0]-8)             ; 左下角x
                
        $S3y1 = ($GUICur[1] >= $Ctr[1]+ $Ctr[3]- 8)  ; 左下角y
                $S3y2 = ($GUICur[1] <= $Ctr[1]+ $Ctr[3]+ 8)  ; 左下角y

                If $S3x1 and $S3x2 and $S3y1 and $S3y2 Then 

                        If $k = 1 Then
                       ControlMove ("拉伸控件","", $Button1,$GUICur[0]-4,$Ctr[1],$Ctr[2]-($GUICur[0]-4-$Ctr[0]),$GUICur[1]+4-$Ctr[1]) 
                        EndIf
                EndIf        
;------------------------------------------------------------------------------------

        $S4x1 = ($GUICur[0] >= $Ctr[0]+ $Ctr[2]- 8)  ; 右上角x
                $S4x2 = ($GUICur[0] <= $Ctr[0]+ $Ctr[2]+ 8)  ; 右上角x
        $S4y1 = ($GUICur[1] <= $Ctr[1]+ 8)            ; 右上角y
                $S4y2 = ($GUICur[1] >= $Ctr[1]- 8)            ; 右上角y


                If $S4x1 and $S4x2 and $S4y1 and $S4y2 Then 

                        If $k = 1 Then
                       ControlMove ("拉伸控件","", $Button1,$Ctr[0],$GUICur[1]-4,$GUICur[0]+4-$Ctr[0],$Ctr[3]-($GUICur[1]-4-$Ctr[1])) 
                        EndIf
                EndIf        

EndFunc

Func CLOSEClicked()
GUIDelete($Form1)
Exit
EndFunc
发表于 2011-11-24 21:35:06 | 显示全部楼层
呵呵,都是高手,学习了
发表于 2011-11-25 00:20:55 | 显示全部楼层
这个好像真有过!!!!可以找到看!!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 06:51 , Processed in 0.080761 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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