『 已解决』 鼠标拉伸图片控件
本帖最后由 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 我也想知道结果哈。。 在论坛好像我见过,你找找看
.
本帖最后由 xiehuahere 于 2011-11-24 10:52 编辑论坛没找到哦,版主给个链接嘛。 我等也好学习学习。
个人想法:
1. 捕获 $GUI_EVENT_PRIMARYDOWN 窗口消息。
2. 使用GUIGetCursorInfo()判断鼠标位置是否在图片控件上($array)并且在边缘($array, $array)。
3. 如果第2步判断成立,就使用GUICtrlSetPos() 开始跟随鼠标位置的变化调整控件大小。
4. 捕获 $GUI_EVENT_PRIMARYUP 窗口消息,停止调整。 #include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $aUtil_MinMax
$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=$x0
$aUtil_MinMax=$y0
$aUtil_MinMax=$x1
$aUtil_MinMax=$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); min X
DllStructSetData($minmaxinfo,8,$aUtil_MinMax); min Y
DllStructSetData($minmaxinfo,9,$aUtil_MinMax); max X
DllStructSetData($minmaxinfo,10,$aUtil_MinMax); max Y
EndIf
Return $GUI_RUNDEFMSG
EndFunc 本帖最后由 xiehuahere 于 2011-11-24 11:40 编辑
回复 5# 3mile
学习了。。。了解一下 WM_GETMINMAXINFO 消息。
那个什么。。真的如连绵江水,滔滔不绝。
积累很重要啊
WM_GETMINMAXINFO = $0024;
此消息发送给窗口(当它将要改变大小或位置时),所以用子窗口来实现真是很好的创意,同时可以控制图片拉伸的范围。 这个不错,多谢3smile兄,学习了{:1_530:} LZ 做这个图片控件拉伸具体是做什么用的? 如果是做图片(图像)处理那最好用 _GDIPlus* 类函数处理。 回复 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 <> $XY Or $XY2 <> $XY Then
WinMove($Form2, "", $XY2+192, $XY2+124)
EndIf
EndFunc
回复 8# afan
---------------------------------------
回afan版主,是这样的。只是一个举例,
不是应用在图像处理方面的。
我先写了一个在窗体里调整控件的代码,是基于GUIGetCursorInfo鼠标状态来判断的。
但想了解一下如果是消息触发应该怎么写,是不是更有效率。
没想到套个子窗口,一根筋了...冏。
前些天做连接SQL数据库的练习,结果发现GUICtrlCreateListView控件显示数据足够,但还是功能有限。
比如连接到表后,不能直接的操作数据编辑,就像SQL企业管理器那样直观的编辑。
想要编辑,只能根据检索到的字段,动态生成类似Input那样的编辑框, 然后修改。
一时胡思乱想,如果多个类Input编辑框组合在一起形成联动控件,不是可以很方便的管理编辑数据库的数据吗?
........见笑了,做了试验,不成就拉倒... 回复 10# dnbj2010
ListView 可以就地编辑呀,也是在Edit控件中处理的~
如果你想用Edit控件组合在一起形成联动控件,那要处理的东西就比较多了~ 当然,你要处理的具体情况我也不清楚,或许也很简单。 回复 11# afan
--------------------------------------------------
.....那要处理的东西就比较多了......
嗯,明白了,就是效率可能很低了。谢谢A版。 下面把那个基于判断鼠标状态与控件边界的代码也贴出来:
鼠标还不能变形,直接拉吧#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 = 3 And $GUICur = 1 Then
lashen()
EndIf
WEnd
Func lashen()
$k = 1
$Ctr = ControlGetPos("拉伸控件","",$Button1) ;控件信息
$nPos = WinGetPos("拉伸控件") ;主窗信息
;-------------------------------------------------------------------------------右边拉伸
$S71 = ($GUICur >= $Ctr + $Ctr- 8) ; 右边
$S72 = ($GUICur <= $Ctr + $Ctr+ 8) ; 右边
If $S71 And $S72 Then
;这里要加一个拖拽的条件
If $k = 1 Then
ControlMove ("拉伸控件","", $Button1,$Ctr,$Ctr,$GUICur+4-$Ctr,$Ctr)
EndIf
EndIf
;-------------------------------------------------------------------------------底边拉伸
$S81 = ($GUICur >= $Ctr + $Ctr- 8) ; 底边
$S82 = ($GUICur <= $Ctr + $Ctr+ 8) ; 底边
If $S81 And $S82 Then
If $k = 1 Then
ControlMove ("拉伸控件","", $Button1,$Ctr,$Ctr,$Ctr,$GUICur+4-$Ctr)
EndIf
EndIf
;------------------------------------------------------------------------------左边拉伸
$S51 = ($GUICur <= $Ctr+ 8) ; 左边
$S52 = ($GUICur >= $Ctr- 8) ; 左边
If $S51 And $S52 Then
If $k = 1 Then
ControlMove ("拉伸控件","", $Button1,$GUICur-4,$Ctr,$Ctr-($GUICur-4-$Ctr),$Ctr) ControlMove ("拉伸控件","", $Button1,$GUICur-4,$Ctr,$Ctr-($GUICur-4-$Ctr),$Ctr)
EndIf
EndIf
;---------------------------------------------------------------------------------上边拉伸
$S61 = ($GUICur <= $Ctr+ 8) ; 上边
$S62 = ($GUICur >= $Ctr- 8) ; 上边
If $S61 And $S62 Then
If $k = 1 Then
ControlMove ("拉伸控件","", $Button1,$Ctr,$GUICur-4,$Ctr,$Ctr-($GUICur-4-$Ctr))
EndIf
EndIf
;-----------------------------------------------------------------------------------
$S1x1 = ($GUICur >= $Ctr+ $Ctr- 8); 右下角x
$S1x2 = ($GUICur <= $Ctr+ $Ctr+ 8); 右下角x
$S1y1 = ($GUICur >= $Ctr+ $Ctr- 8); 右下角y
$S1y2 = ($GUICur <= $Ctr+ $Ctr+ 8); 右下角y
If $S1x1 and $S1x2 and $S1y1 and $S1y2 Then
If $k = 1 Then
ControlMove ("拉伸控件","", $Button1,$Ctr,$Ctr,$GUICur+4-$Ctr,$GUICur+4-$Ctr)
EndIf
EndIf
;------------------------------------------------------------------------------------
$S2x1 = ($GUICur <= $Ctr+ 8) ; 左上角x
$S2x2 = ($GUICur >= $Ctr- 8) ; 左上角x
$S2y1 = ($GUICur <= $Ctr+ 8) ; 左上角y
$S2y2 = ($GUICur >= $Ctr- 8) ; 左上角y
If $S2x1 and $S2x2 and $S2y1 and $S2y2 Then
If $k = 1 Then
ControlMove ("拉伸控件","", $Button1,$GUICur-4,$GUICur-4,$Ctr-($GUICur-4-$Ctr),$Ctr-($GUICur-4-$Ctr))
EndIf
EndIf
;------------------------------------------------------------------------------------
$S3x1 = ($GUICur <= $Ctr+8) ; 左下角x
$S3x2 = ($GUICur >= $Ctr-8) ; 左下角x
$S3y1 = ($GUICur >= $Ctr+ $Ctr- 8); 左下角y
$S3y2 = ($GUICur <= $Ctr+ $Ctr+ 8); 左下角y
If $S3x1 and $S3x2 and $S3y1 and $S3y2 Then
If $k = 1 Then
ControlMove ("拉伸控件","", $Button1,$GUICur-4,$Ctr,$Ctr-($GUICur-4-$Ctr),$GUICur+4-$Ctr)
EndIf
EndIf
;------------------------------------------------------------------------------------
$S4x1 = ($GUICur >= $Ctr+ $Ctr- 8); 右上角x
$S4x2 = ($GUICur <= $Ctr+ $Ctr+ 8); 右上角x
$S4y1 = ($GUICur <= $Ctr+ 8) ; 右上角y
$S4y2 = ($GUICur >= $Ctr- 8) ; 右上角y
If $S4x1 and $S4x2 and $S4y1 and $S4y2 Then
If $k = 1 Then
ControlMove ("拉伸控件","", $Button1,$Ctr,$GUICur-4,$GUICur+4-$Ctr,$Ctr-($GUICur-4-$Ctr))
EndIf
EndIf
EndFunc
Func CLOSEClicked()
GUIDelete($Form1)
Exit
EndFunc
呵呵,都是高手,学习了 这个好像真有过!!!!可以找到看!!!!
页:
[1]