nitekram Posted June 23, 2015 Author Share Posted June 23, 2015 (edited) I finally figured it out, but I think I need to create a list of things to do, and in what order - for dealing with GDI+ graphics, is there any WIKI, on how to use these functions. I mean the help files are helpful, but they really do not describe the order of things, and how to make something happen on a given control. Not complaining, just am having a very hard time figuring this out.expandcollapse popup#include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <WindowsConstants.au3> #include <StaticConstants.au3> AutoItSetOption("MouseCoordMode", 2) Global $g_hGUI, $g_hImage, $g_hGDIBitmap, $g_aCtrls[4][9], $hGraphics Global $ci_MainWidth = 1000, $ci_MainHeight = 800 Example() Func Example() AutoItSetOption("GUIOnEventMode", 1) ; X64 running support Local $sWow64 = "" If @AutoItX64 Then $sWow64 = "\Wow6432Node" ;get AutoIt install dir Local $sRegPath = "HKLM\SOFTWARE" & $sWow64 & "\AutoIt v3\AutoIt" Local $sFile = RegRead($sRegPath, "InstallDir") & "\Examples\GUI\logo4.gif" If Not FileExists($sFile) Then MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", $sFile & " not found!", 30) Exit EndIf ;$sFile = 'bulb0.jpg' If FileExists('logo4.gif') Then $sFile = 'logo4.gif' Local $i _GDIPlus_Startup() $g_hGUI = GUICreate("GDI+", $ci_MainWidth, $ci_MainHeight) For $i = 0 To UBound($g_aCtrls) - 1 $g_aCtrls[$i][1] = 0 ;100 + $i * 150 ;x pos (Starting Position) $g_aCtrls[$i][2] = 250 + $i * 120 ;y pos $g_aCtrls[$i][0] = GUICtrlCreatePic("", $g_aCtrls[$i][1], $g_aCtrls[$i][2], 169, 68) ;, $SS_BITMAP) ;ctrl id $g_aCtrls[$i][3] = 100 ;min x pos $g_aCtrls[$i][4] = 250 ; $g_aCtrls[$i][2] - 20 ;min y pos Local $aImagePos = ControlGetPos($g_hGUI, '', $g_aCtrls[$i][0]) $g_aCtrls[$i][5] = $ci_MainWidth - $aImagePos[2] - 10; $ci_MainHeight ;max x pos $g_aCtrls[$i][6] = $ci_MainHeight - $aImagePos[3] - 10 ; $g_aCtrls[$i][2] + 20 ;max y pos ; have to resize as you are making the control $g_aCtrls[$i][7] = _GDIPlus_ImageLoadFromFile($sFile) $g_aCtrls[$i][7] = _GDIPlus_ImageResize($g_aCtrls[$i][7], 50, 50) $g_aCtrls[$i][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($g_aCtrls[$i][7]) Next _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUISetState(@SW_SHOW) ; ScreenUpdate CtrlMove($g_aCtrls, 0, $g_hGUI) Local $aMChk Do $aMChk = GUIGetCursorInfo($g_hGUI) Switch $aMChk[4] Case $g_aCtrls[0][0] CtrlMove($g_aCtrls, 0, $g_hGUI) Case $g_aCtrls[1][0] CtrlMove($g_aCtrls, 1, $g_hGUI) Case $g_aCtrls[2][0] CtrlMove($g_aCtrls, 2, $g_hGUI) Case $g_aCtrls[3][0] CtrlMove($g_aCtrls, 3, $g_hGUI) EndSwitch _GDIPlus_GraphicsDrawRect($hGraphics, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 110, $ci_MainHeight - 260) Until Not Sleep(50) EndFunc ;==>Example Func CtrlMove(ByRef $g_aCtrls, $iCtrl, $g_hGUI) Local $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) Local $iDX = Abs(MouseGetPos(0) - $aCtrlPos[0]) Local $iDY = Abs(MouseGetPos(1) - $aCtrlPos[1]) Local $iX, $iY Static $bRan = False If Not $bRan Then ;MsgBox('','','splash screen - starting') For $x = 0 To UBound($g_aCtrls) - 1 $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$x][0]) ;#cs ;Remove Current Image and replace with smaller one... _WinAPI_DeleteObject(GUICtrlSendMsg($g_aCtrls[$x][0], 0x0172, $IMAGE_BITMAP, $g_aCtrls[$x][8])) ;$STM_SETIMAGE = 0x0172 Sleep(20) Local $hBitmap_Scaled = _GDIPlus_ImageResize($g_aCtrls[$x][7], 50, 50) If @error Then MsgBox('', '_GDIPlus_ImageResize ' & @error, $hBitmap_Scaled) Sleep(20) ; Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle If @error Then MsgBox('', '_GDIPlus_GraphicsCreateFromHWND ' & @error, $hGraphics) Sleep(20) ; _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, $aCtrlPos[0], $aCtrlPos[1]) ;$g_aCtrls[$iCtrl][3], $g_aCtrls[$iCtrl][4]) ;MouseGetPos(0), MouseGetPos(1)) ; $aCtrlPos[0], $aCtrlPos[1]) ;$iDX, $iDY) Sleep(20) $g_aCtrls[$x][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_Scaled) ; handle to a HBITMAP (a handle to a bitmap from a bitmap object) Sleep(20) $iPic_W = _GDIPlus_ImageGetWidth($hBitmap_Scaled) $iPic_H = _GDIPlus_ImageGetHeight($hBitmap_Scaled) ;#ce _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) Next _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) $bRan = True Else ConsoleWrite($aCtrlPos[0] & ',' & $aCtrlPos[1] & @CRLF) ;#cs ;Remove Current Image and replace with smaller one... _WinAPI_DeleteObject(GUICtrlSendMsg($g_aCtrls[$iCtrl][0], 0x0172, $IMAGE_BITMAP, $g_aCtrls[$iCtrl][8])) ;$STM_SETIMAGE = 0x0172 Sleep(20) Local $hBitmap_Scaled = _GDIPlus_ImageResize($g_aCtrls[$iCtrl][7], 50, 50) If @error Then MsgBox('', '_GDIPlus_ImageResize ' & @error, $hBitmap_Scaled) Sleep(20) ; Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle If @error Then MsgBox('', '_GDIPlus_GraphicsCreateFromHWND ' & @error, $hGraphics) Sleep(20) ; _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, $aCtrlPos[0], $aCtrlPos[1]) ;$g_aCtrls[$iCtrl][3], $g_aCtrls[$iCtrl][4]) ;MouseGetPos(0), MouseGetPos(1)) ; $aCtrlPos[0], $aCtrlPos[1]) ;$iDX, $iDY) Sleep(20) $g_aCtrls[$iCtrl][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_Scaled) ; handle to a HBITMAP (a handle to a bitmap from a bitmap object) Sleep(20) $iPic_W = _GDIPlus_ImageGetWidth($hBitmap_Scaled) $iPic_H = _GDIPlus_ImageGetHeight($hBitmap_Scaled) $g_aCtrls[$iCtrl][5] = $ci_MainWidth - $iPic_W - 10 ; width $g_aCtrls[$iCtrl][6] = $ci_MainHeight - $iPic_H - 10 ; height ;#ce $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;$hGraphics = _GDIPlus_ImageGetGraphicsContext($g_hGUI) ; Draw a frame around the inserted image _GDIPlus_GraphicsDrawRect($hGraphics, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 110, $ci_MainHeight - 260) ;_GDIPlus_GraphicsDrawRect($hGraphics, 300, 300, 300, 300) ;_WinAPI_DrawLine ( $g_hGUI, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 20, $ci_MainHeight - 20 ) EndIf While GUIGetCursorInfo($g_hGUI)[2] $iX = MouseGetPos(0) - $iDX $iY = MouseGetPos(1) - $iDY $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) $iX_ = $aCtrlPos[0] $iY_ = $aCtrlPos[1] ConsoleWrite(' ' & $iX & ' ' & $iY & @CRLF) ; ternary operator ; GUICtrlSetPos($g_aCtrls[$iCtrl][0], ($iX < $g_aCtrls[$iCtrl][3]) ? $g_aCtrls[$iCtrl][3] : ($iX > $g_aCtrls[$iCtrl][5]) ? $g_aCtrls[$iCtrl][5] : $iX, _ ($iY < $g_aCtrls[$iCtrl][4]) ? $g_aCtrls[$iCtrl][4] : ($iY > $g_aCtrls[$iCtrl][6]) ? $g_aCtrls[$iCtrl][6] : $iY) Sleep(10) _GDIPlus_GraphicsDrawRect($hGraphics, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 110, $ci_MainHeight - 260) _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) Sleep(10) WEnd EndFunc ;==>CtrlMove ; Func _Exit() _WinAPI_DeleteObject($g_hGDIBitmap) _GDIPlus_ImageDispose($g_hImage) _GDIPlus_Shutdown() GUIDelete($g_hGUI) Exit EndFunc ;==>_Exit ' Edited June 23, 2015 by nitekram 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
nitekram Posted June 29, 2015 Author Share Posted June 29, 2015 (edited) I am trying to further this example, but am stuck on getting the images to move (after being moved over another object). There is a msgbox('','','hit'), that when enabled, lets only one image move, the one that is being move on top of the original. I do not want the MsgBox to hit, but still want only the image that is being moved, to move to the correct position, but when I disable the msgbox - it moves both images.To test this example...move an image to the right side of the screen. Now move another on top of it, making sure the mouse is over the first image (still working on the image and not the mouse, but it will come later)So for those that I confused...I am trying to not allow images to move on top of each other - blocking them from staying over each other. For now, all I have is the mouse over the image working...so you have to release the second image, while the mouse is over the first image.Here is the code...can someone suggest a way of working this out?expandcollapse popup#include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <WindowsConstants.au3> #include <StaticConstants.au3> AutoItSetOption("MouseCoordMode", 2) Global $g_hGUI, $g_hImage, $g_hGDIBitmap, $g_aCtrls[4][13], $hGraphics Global $ci_MainWidth = 1000, $ci_MainHeight = 800 Example() Func Example() AutoItSetOption("GUIOnEventMode", 1) ; X64 running support Local $sWow64 = "" If @AutoItX64 Then $sWow64 = "\Wow6432Node" ;get AutoIt install dir Local $sRegPath = "HKLM\SOFTWARE" & $sWow64 & "\AutoIt v3\AutoIt" Local $sFile = RegRead($sRegPath, "InstallDir") & "\Examples\GUI\logo4.gif" If Not FileExists($sFile) Then MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", $sFile & " not found!", 30) Exit EndIf ;$sFile = 'bulb0.jpg' If FileExists('logo4.gif') Then $sFile = 'logo4.gif' Local $i _GDIPlus_Startup() $g_hGUI = GUICreate("GDI+", $ci_MainWidth, $ci_MainHeight) For $i = 0 To UBound($g_aCtrls) - 1 $g_aCtrls[$i][1] = 0 ;100 + $i * 150 ;x pos (Starting Position) $g_aCtrls[$i][2] = 250 + $i * 120 ;y pos $g_aCtrls[$i][0] = GUICtrlCreatePic("", $g_aCtrls[$i][1], $g_aCtrls[$i][2], 169, 68) ;, $SS_BITMAP) ;ctrl id $g_aCtrls[$i][3] = 100 ;min x pos $g_aCtrls[$i][4] = 250 ; $g_aCtrls[$i][2] - 20 ;min y pos Local $aImagePos = ControlGetPos($g_hGUI, '', $g_aCtrls[$i][0]) $g_aCtrls[$i][5] = $ci_MainWidth - $aImagePos[2] - 10; $ci_MainHeight ;max x pos $g_aCtrls[$i][6] = $ci_MainHeight - $aImagePos[3] - 10 ; $g_aCtrls[$i][2] + 20 ;max y pos ; have to resize as you are making the control $g_aCtrls[$i][7] = _GDIPlus_ImageLoadFromFile($sFile) $g_aCtrls[$i][7] = _GDIPlus_ImageResize($g_aCtrls[$i][7], 50, 50) $g_aCtrls[$i][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($g_aCtrls[$i][7]) $g_aCtrls[$i][10] = $g_aCtrls[$i][1] $g_aCtrls[$i][11] = $g_aCtrls[$i][2] Next _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUISetState(@SW_SHOW) ; ScreenUpdate CtrlMove($g_aCtrls, 0, $g_hGUI) Local $aMChk Do $aMChk = GUIGetCursorInfo($g_hGUI) Switch $aMChk[4] Case $g_aCtrls[0][0] CtrlMove($g_aCtrls, 0, $g_hGUI) CheckObjectLocation(0) Case $g_aCtrls[1][0] CtrlMove($g_aCtrls, 1, $g_hGUI) CheckObjectLocation(1) Case $g_aCtrls[2][0] CtrlMove($g_aCtrls, 2, $g_hGUI) CheckObjectLocation(2) Case $g_aCtrls[3][0] CtrlMove($g_aCtrls, 3, $g_hGUI) CheckObjectLocation(3) EndSwitch _GDIPlus_GraphicsDrawRect($hGraphics, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 110, $ci_MainHeight - 260) Until Not Sleep(50) EndFunc ;==>Example Func CtrlMove(ByRef $g_aCtrls, $iCtrl, $g_hGUI) Local $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) Local $iDX = Abs(MouseGetPos(0) - $aCtrlPos[0]) Local $iDY = Abs(MouseGetPos(1) - $aCtrlPos[1]) Local $iX, $iY Static $bRan = False If Not $bRan Then ;MsgBox('','','splash screen - starting') For $x = 0 To UBound($g_aCtrls) - 1 $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$x][0]) ;#cs ;Remove Current Image and replace with smaller one... _WinAPI_DeleteObject(GUICtrlSendMsg($g_aCtrls[$x][0], 0x0172, $IMAGE_BITMAP, $g_aCtrls[$x][8])) ;$STM_SETIMAGE = 0x0172 Sleep(20) Local $hBitmap_Scaled = _GDIPlus_ImageResize($g_aCtrls[$x][7], 50, 50) If @error Then MsgBox('', '_GDIPlus_ImageResize ' & @error, $hBitmap_Scaled) Sleep(20) ; Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle If @error Then MsgBox('', '_GDIPlus_GraphicsCreateFromHWND ' & @error, $hGraphics) Sleep(20) ; _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, $aCtrlPos[0], $aCtrlPos[1]) ;$g_aCtrls[$iCtrl][3], $g_aCtrls[$iCtrl][4]) ;MouseGetPos(0), MouseGetPos(1)) ; $aCtrlPos[0], $aCtrlPos[1]) ;$iDX, $iDY) Sleep(20) $g_aCtrls[$x][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_Scaled) ; handle to a HBITMAP (a handle to a bitmap from a bitmap object) Sleep(20) $iPic_W = _GDIPlus_ImageGetWidth($hBitmap_Scaled) $iPic_H = _GDIPlus_ImageGetHeight($hBitmap_Scaled) ;#ce _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) Next _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) $bRan = True Else ConsoleWrite($aCtrlPos[0] & ',' & $aCtrlPos[1] & @CRLF) ;#cs ;Remove Current Image and replace with smaller one... _WinAPI_DeleteObject(GUICtrlSendMsg($g_aCtrls[$iCtrl][0], 0x0172, $IMAGE_BITMAP, $g_aCtrls[$iCtrl][8])) ;$STM_SETIMAGE = 0x0172 Sleep(20) Local $hBitmap_Scaled = _GDIPlus_ImageResize($g_aCtrls[$iCtrl][7], 50, 50) If @error Then MsgBox('', '_GDIPlus_ImageResize ' & @error, $hBitmap_Scaled) Sleep(20) ; Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle If @error Then MsgBox('', '_GDIPlus_GraphicsCreateFromHWND ' & @error, $hGraphics) Sleep(20) ; _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, $aCtrlPos[0], $aCtrlPos[1]) ;$g_aCtrls[$iCtrl][3], $g_aCtrls[$iCtrl][4]) ;MouseGetPos(0), MouseGetPos(1)) ; $aCtrlPos[0], $aCtrlPos[1]) ;$iDX, $iDY) Sleep(20) $g_aCtrls[$iCtrl][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_Scaled) ; handle to a HBITMAP (a handle to a bitmap from a bitmap object) Sleep(20) $iPic_W = _GDIPlus_ImageGetWidth($hBitmap_Scaled) $iPic_H = _GDIPlus_ImageGetHeight($hBitmap_Scaled) $g_aCtrls[$iCtrl][5] = $ci_MainWidth - $iPic_W - 10 ; width $g_aCtrls[$iCtrl][6] = $ci_MainHeight - $iPic_H - 10 ; height ;#ce $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;$hGraphics = _GDIPlus_ImageGetGraphicsContext($g_hGUI) ; Draw a frame around the inserted image _GDIPlus_GraphicsDrawRect($hGraphics, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 110, $ci_MainHeight - 260) ;_GDIPlus_GraphicsDrawRect($hGraphics, 300, 300, 300, 300) ;_WinAPI_DrawLine ( $g_hGUI, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 20, $ci_MainHeight - 20 ) EndIf While GUIGetCursorInfo($g_hGUI)[2] $iX = MouseGetPos(0) - $iDX $iY = MouseGetPos(1) - $iDY $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) $iX_ = $aCtrlPos[0] $iY_ = $aCtrlPos[1] ConsoleWrite(' ' & $iX & ' ' & $iY & @CRLF) ; ternary operator ; #cs GUICtrlSetPos($g_aCtrls[$iCtrl][0], ($iX < $g_aCtrls[$iCtrl][3]) ? $g_aCtrls[$iCtrl][3] : ($iX > $g_aCtrls[$iCtrl][5]) ? $g_aCtrls[$iCtrl][5] : $iX, _ ($iY < $g_aCtrls[$iCtrl][4]) ? $g_aCtrls[$iCtrl][4] : ($iY > $g_aCtrls[$iCtrl][6]) ? $g_aCtrls[$iCtrl][6] : $iY) #ce Sleep(10) _GDIPlus_GraphicsDrawRect($hGraphics, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 110, $ci_MainHeight - 260) _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) Sleep(10) Local $iX_, $iY_ If $iX < $g_aCtrls[$iCtrl][3] Then ; get x $iX_ = $g_aCtrls[$iCtrl][3] ElseIf $iX > $g_aCtrls[$iCtrl][5] Then ; get x $iX_ = $g_aCtrls[$iCtrl][5] Else $iX_ = $iX EndIf If $iY < $g_aCtrls[$iCtrl][4] Then $iY_ = $g_aCtrls[$iCtrl][4] ElseIf $iY > $g_aCtrls[$iCtrl][6] Then $iY_ = $g_aCtrls[$iCtrl][6] Else $iY_ = $iY EndIf ;MsgBox('', '', $iX_ & ',' & $iY_) GUICtrlSetPos($g_aCtrls[$iCtrl][0], $iX_, $iY_) Sleep(10) $g_aCtrls[$iCtrl][10] = $iX_ $g_aCtrls[$iCtrl][11] = $iY_ WEnd EndFunc ;==>CtrlMove ; Func _Exit() _WinAPI_DeleteObject($g_hGDIBitmap) _GDIPlus_ImageDispose($g_hImage) _GDIPlus_Shutdown() GUIDelete($g_hGUI) Exit EndFunc ;==>_Exit ; Func CheckObjectLocation($CtrlID) Local $aReadCursorInfo = GUIGetCursorInfo($g_hGUI) For $x = 0 To UBound($g_aCtrls) - 1 If $CtrlID = $x Then ContinueLoop Local $aImagePos = ControlGetPos($g_hGUI, '', $g_aCtrls[$x][0]) If _WinAPI_PtInRectEx($aReadCursorInfo[0], $aReadCursorInfo[1], $g_aCtrls[$x][10], $g_aCtrls[$x][11], $g_aCtrls[$x][10] + $aImagePos[2], $g_aCtrls[$x][11] + $aImagePos[3]) Then Sleep(20) MsgBox('', '', 'hit') ; if I comment this out, both images move... GUICtrlSetPos($g_aCtrls[$CtrlID][0], $g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11]) ConsoleWrite($aReadCursorInfo[0] & ',' & $aReadCursorInfo[1] & @CRLF) ConsoleWrite($g_aCtrls[$x][3] & ',' & $g_aCtrls[$x][4] & @CRLF) ConsoleWrite($g_aCtrls[$x][5] & ',' & $g_aCtrls[$x][6] & @CRLF) EndIf Next EndFunc ;==>CheckObjectLocation ;#ce ..EDITPossible fix is to move the mouse - I replaced the msgbox with:MouseMove($g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11], 0) EDIT 2That does not seem to work, as the next image will not move to the next position - moving 1, 2 and then 3 onto 2, does not move 3 away Edited June 29, 2015 by nitekram 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
nitekram Posted July 1, 2015 Author Share Posted July 1, 2015 Anyone know of a post that might help me out? Or any thoughts on how to change what I have to get what I would like to do? 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
nitekram Posted July 4, 2015 Author Share Posted July 4, 2015 Seems I can not get that Math right...can anyone help me out. I feel I am close, but there is an area, beside the math part, that the image will align to, but it is not in my parameters - meaning the image will be closer to the blocked one, and then further away in areas around the corner of the blocked one.I am trying to not allow the image to come in contact with the smaller square - that will be an image, but for testing wanted a square. The outer square is where I want the image to land (or not go past), but it bleeds into some areas, and then is further away around the corners of the outside square. expandcollapse popup#include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <WindowsConstants.au3> #include <array.au3> #include <StaticConstants.au3> AutoItSetOption("MouseCoordMode", 2) HotKeySet('!^s', 'Draw_A_Rect') Global $g_hGUI, $g_hImage, $g_hGDIBitmap, $g_aCtrls[4][13], $hGraphics Global $ci_MainWidth = 1000, $ci_MainHeight = 700 Global $bCheckLocation = False Global $bDrawLine = False, $h_Pen Example() Func Example() AutoItSetOption("GUIOnEventMode", 1) ; X64 running support Local $sWow64 = "" If @AutoItX64 Then $sWow64 = "\Wow6432Node" ;get AutoIt install dir Local $sRegPath = "HKLM\SOFTWARE" & $sWow64 & "\AutoIt v3\AutoIt" Local $sFile = RegRead($sRegPath, "InstallDir") & "\Examples\GUI\logo4.gif" If Not FileExists($sFile) Then MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", $sFile & " not found!", 30) Exit EndIf ;$sFile = 'bulb0.jpg' If FileExists('logo4.gif') Then $sFile = 'logo4.gif' Local $i Local $sTitle = "GDI+" _GDIPlus_Startup() $h_Pen = _GDIPlus_PenCreate(0xFFFF0000) $g_hGUI = GUICreate($sTitle, $ci_MainWidth, $ci_MainHeight) ;GUISetBkColor(0xffffff) For $i = 0 To UBound($g_aCtrls) - 1 $g_aCtrls[$i][1] = 0 ;100 + $i * 150 ;x pos (Starting Position) $g_aCtrls[$i][2] = 250 + $i * 120 ;y pos $g_aCtrls[$i][0] = GUICtrlCreatePic("", $g_aCtrls[$i][1], $g_aCtrls[$i][2], 169, 68) ;, $SS_BITMAP) ;ctrl id $g_aCtrls[$i][3] = 100 ;min x pos $g_aCtrls[$i][4] = 150 ; $g_aCtrls[$i][2] - 20 ;min y pos Local $aImagePos = ControlGetPos($g_hGUI, '', $g_aCtrls[$i][0]) $g_aCtrls[$i][5] = $ci_MainWidth - $aImagePos[2] - 10; $ci_MainHeight ;max x pos $g_aCtrls[$i][6] = $ci_MainHeight - $aImagePos[3] - 10 ; $g_aCtrls[$i][2] + 20 ;max y pos ; have to resize as you are making the control $g_aCtrls[$i][7] = _GDIPlus_ImageLoadFromFile($sFile) $g_aCtrls[$i][7] = _GDIPlus_ImageResize($g_aCtrls[$i][7], 50, 50) $g_aCtrls[$i][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($g_aCtrls[$i][7]) $g_aCtrls[$i][10] = $g_aCtrls[$i][1] $g_aCtrls[$i][11] = $g_aCtrls[$i][2] Next ;`($g_aCtrls) _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, 'Get_Stats') GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUISetState(@SW_SHOW) ; ScreenUpdate CtrlMove($g_aCtrls, 0, $g_hGUI) Local $aMChk Do ;ConsoleWrite('*' & @CRLF) $aMChk = GUIGetCursorInfo($g_hGUI) Switch $aMChk[4] Case $g_aCtrls[0][0] $bCheckLocation = False CtrlMove($g_aCtrls, 0, $g_hGUI) CheckObjectLocation($g_aCtrls, 0) ;$bCheckLocation = False Case $g_aCtrls[1][0] $bCheckLocation = False CtrlMove($g_aCtrls, 1, $g_hGUI) CheckObjectLocation($g_aCtrls, 1) ;$bCheckLocation = False Case $g_aCtrls[2][0] $bCheckLocation = False CtrlMove($g_aCtrls, 2, $g_hGUI) CheckObjectLocation($g_aCtrls, 2) ;$bCheckLocation = False Case $g_aCtrls[3][0] $bCheckLocation = False CtrlMove($g_aCtrls, 3, $g_hGUI) CheckObjectLocation($g_aCtrls, 3) ;$bCheckLocation = False EndSwitch ;_GDIPlus_GraphicsDrawRect($hGraphics, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 110, $ci_MainHeight - 260) Until Not Sleep(50) EndFunc ;==>Example ; Func Draw_A_Rect() ;If $bRunning Then ConsoleWrite('drawing...' & @CRLF) ;0xFF000000 #cs While Not _IsPressed('05', $hDLL) $aMouseLocation = GUIGetCursorInfo($h_GUI) WEnd ; _IsPressed('05', $hDLL) _ArrayDisplay($aMouseLocation) Exit #ce If Not $bDrawLine Then $bDrawLine = True Else $bDrawLine = False EndIf ;$iX_ > 400 And $iX_ < 600 And $iY_ > 300 And $iY_ < 50 Then $iX_ = 390 _GDIPlus_GraphicsDrawRect($hGraphics, 400, 400, 200, 50, $h_Pen) ;_GDIPlus_GraphicsDrawLine($hGraphics, 135, 435, 435, 435) ;_ML_LineDraw(1, 2, 135, 435, 435, 435) ; $iPen, $hColor, $iThickness) ;EndIf EndFunc ;==>Draw_A_Rect ; Func CtrlMove(ByRef $g_aCtrls, $iCtrl, $g_hGUI) Local $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) Local $iDX = Abs(MouseGetPos(0) - $aCtrlPos[0]) Local $iDY = Abs(MouseGetPos(1) - $aCtrlPos[1]) Local $iX, $iY Static $bRan = False If Not $bRan Then ;MsgBox('','','splash screen - starting') For $x = 0 To UBound($g_aCtrls) - 1 $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$x][0]) ;#cs ;Remove Current Image and replace with smaller one... _WinAPI_DeleteObject(GUICtrlSendMsg($g_aCtrls[$x][0], 0x0172, $IMAGE_BITMAP, $g_aCtrls[$x][8])) ;$STM_SETIMAGE = 0x0172 Sleep(20) Local $hBitmap_Scaled = _GDIPlus_ImageResize($g_aCtrls[$x][7], 50, 50) If @error Then MsgBox('', '_GDIPlus_ImageResize ' & @error, $hBitmap_Scaled) Sleep(20) ; Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle If @error Then MsgBox('', '_GDIPlus_GraphicsCreateFromHWND ' & @error, $hGraphics) Sleep(20) ; _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, $aCtrlPos[0], $aCtrlPos[1]) ;$g_aCtrls[$iCtrl][3], $g_aCtrls[$iCtrl][4]) ;MouseGetPos(0), MouseGetPos(1)) ; $aCtrlPos[0], $aCtrlPos[1]) ;$iDX, $iDY) Sleep(20) $g_aCtrls[$x][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_Scaled) ; handle to a HBITMAP (a handle to a bitmap from a bitmap object) Sleep(20) $iPic_W = _GDIPlus_ImageGetWidth($hBitmap_Scaled) $iPic_H = _GDIPlus_ImageGetHeight($hBitmap_Scaled) ;#ce _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) Next _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) $bRan = True Else ConsoleWrite($aCtrlPos[0] & ',' & $aCtrlPos[1] & @CRLF) ;#cs ;Remove Current Image and replace with smaller one... _WinAPI_DeleteObject(GUICtrlSendMsg($g_aCtrls[$iCtrl][0], 0x0172, $IMAGE_BITMAP, $g_aCtrls[$iCtrl][8])) ;$STM_SETIMAGE = 0x0172 Sleep(20) Local $hBitmap_Scaled = _GDIPlus_ImageResize($g_aCtrls[$iCtrl][7], 50, 50) If @error Then MsgBox('', '_GDIPlus_ImageResize ' & @error, $hBitmap_Scaled) Sleep(20) ; Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle If @error Then MsgBox('', '_GDIPlus_GraphicsCreateFromHWND ' & @error, $hGraphics) Sleep(20) ; _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, $aCtrlPos[0], $aCtrlPos[1]) ;$g_aCtrls[$iCtrl][3], $g_aCtrls[$iCtrl][4]) ;MouseGetPos(0), MouseGetPos(1)) ; $aCtrlPos[0], $aCtrlPos[1]) ;$iDX, $iDY) Sleep(20) $g_aCtrls[$iCtrl][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_Scaled) ; handle to a HBITMAP (a handle to a bitmap from a bitmap object) Sleep(20) $iPic_W = _GDIPlus_ImageGetWidth($hBitmap_Scaled) $iPic_H = _GDIPlus_ImageGetHeight($hBitmap_Scaled) $g_aCtrls[$iCtrl][5] = $ci_MainWidth - $iPic_W - 10 ; width $g_aCtrls[$iCtrl][6] = $ci_MainHeight - $iPic_H - 10 ; height ;#ce $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;$hGraphics = _GDIPlus_ImageGetGraphicsContext($g_hGUI) ; Draw a frame around the inserted image ;_GDIPlus_GraphicsDrawRect($hGraphics, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 110, $ci_MainHeight - 260) ;_GDIPlus_GraphicsDrawRect($hGraphics, 300, 300, 300, 300) ;_WinAPI_DrawLine ( $g_hGUI, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 20, $ci_MainHeight - 20 ) EndIf While GUIGetCursorInfo($g_hGUI)[2] $iX = MouseGetPos(0) - $iDX $iY = MouseGetPos(1) - $iDY $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) $iX_ = $aCtrlPos[0] $iY_ = $aCtrlPos[1] ConsoleWrite(' --REAL MOUSE-- ' & MouseGetPos(0) & ' ' & MouseGetPos(1) & @CRLF) ; ternary operator ; #cs GUICtrlSetPos($g_aCtrls[$iCtrl][0], ($iX < $g_aCtrls[$iCtrl][3]) ? $g_aCtrls[$iCtrl][3] : ($iX > $g_aCtrls[$iCtrl][5]) ? $g_aCtrls[$iCtrl][5] : $iX, _ ($iY < $g_aCtrls[$iCtrl][4]) ? $g_aCtrls[$iCtrl][4] : ($iY > $g_aCtrls[$iCtrl][6]) ? $g_aCtrls[$iCtrl][6] : $iY) #ce Sleep(10) ; _GDIPlus_GraphicsDrawRect($hGraphics, $g_aCtrls[0][3], $g_aCtrls[0][4], $ci_MainWidth - 110, $ci_MainHeight - 260) ; _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) Sleep(10) Local $iX_, $iY_ If $iX < $g_aCtrls[$iCtrl][3] Then ; get x $iX_ = $g_aCtrls[$iCtrl][3] ElseIf $iX > $g_aCtrls[$iCtrl][5] Then ; get x $iX_ = $g_aCtrls[$iCtrl][5] Else $iX_ = $iX EndIf If $iY < $g_aCtrls[$iCtrl][4] Then $iY_ = $g_aCtrls[$iCtrl][4] ElseIf $iY > $g_aCtrls[$iCtrl][6] Then $iY_ = $g_aCtrls[$iCtrl][6] Else $iY_ = $iY EndIf ; 400, 300, 200, 50, If Not _CheckLocation($g_aCtrls[$iCtrl][0], $iX_, $iY_) Then ContinueLoop #cs If $iX_ > 400 And $iX_ < 600 And $iY_ > 300 And $iY_ < 450 Then If $iX_ > 400 And $iX_ < 600 Then If $iX_ = 390 If $iY_ > 300 And $iY_ < 450 Then $iY_ = #ce ;MsgBox('', '', $iX_ & ',' & $iY_) GUICtrlSetPos($g_aCtrls[$iCtrl][0], $iX_, $iY_) Sleep(10) $g_aCtrls[$iCtrl][10] = $iX_ $g_aCtrls[$iCtrl][11] = $iY_ ;_GDIPlus_GraphicsClear($hGraphics, 0xffffffff) ;_GDIPlus_GraphicsDrawLine($hGraphics, 535, 335, 835, 335, $h_Pen) ;$iX, $iY, $iWidth, $iHeight Local $xOffSet = 40 _GDIPlus_GraphicsDrawRect($hGraphics, 300, 300, 50, 50, $h_Pen) _GDIPlus_GraphicsDrawRect($hGraphics, 300 - $xOffSet/2, 300 - $xOffSet/2, 90, 90, $h_Pen) WEnd ;_ArrayDisplay($g_aCtrls) EndFunc ;==>CtrlMove ; Func _Exit() _WinAPI_DeleteObject($g_hGDIBitmap) _GDIPlus_ImageDispose($g_hImage) _GDIPlus_Shutdown() GUIDelete($g_hGUI) Exit EndFunc ;==>_Exit ; Func _CheckLocation($iCtrl, $iX, $iY) Local $xOffSet = 40 If ($iX < 350 + $xOffSet - _GDIPlus_ImageGetWidth($g_aCtrls[$iCtrl][7]) / 2 And _ $iX > 300 - $xOffSet - _GDIPlus_ImageGetWidth($g_aCtrls[$iCtrl][7]) / 2) _ And ($iY < 350 + $xOffSet - _GDIPlus_ImageGetHeight($g_aCtrls[$iCtrl][7]) / 2 And _ $iY > 300 - $xOffSet - _GDIPlus_ImageGetHeight($g_aCtrls[$iCtrl][7]) / 2) Then Return False Else Return True EndIf EndFunc ;==>_CheckLocation ; Func CheckObjectLocation(ByRef $g_aCtrls, $iCtrl) ;_GDIPlus_PathIsVisiblePoint ConsoleWrite('Checking Location...' & @CRLF) Local $aReadCursorInfo ;= GUIGetCursorInfo($g_hGUI) For $x = 0 To UBound($g_aCtrls) - 1 ;ConsoleWrite('x = ' & $x & @CRLF) ; If $iCtrl = $x Then ContinueLoop $aReadCursorInfo = GUIGetCursorInfo($g_hGUI) ConsoleWrite('Mouse ' & $aReadCursorInfo[0] & '|' & $aReadCursorInfo[0] & @CRLF) Local $aImagePos = ControlGetPos($g_hGUI, '', $g_aCtrls[$x][0]) If Not $bCheckLocation And _WinAPI_PtInRectEx($aReadCursorInfo[0], $aReadCursorInfo[1], $g_aCtrls[$x][10], $g_aCtrls[$x][11], $g_aCtrls[$x][10] + $aImagePos[2], $g_aCtrls[$x][11] + $aImagePos[3]) Then ;#cs Sleep(20) ; MouseMove($g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11], 0) ConsoleWrite('+> XXX ' & $x & ' ' & $g_aCtrls[$x][10] & '|' & $g_aCtrls[$x][11] & @CRLF) ; ;MsgBox('', '', 'hit') ; if I comment this out, both images move... GUICtrlSetPos($g_aCtrls[$iCtrl][0], $g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11]) $g_aCtrls[$iCtrl][10] = $g_aCtrls[$x][10] - $aImagePos[2] $g_aCtrls[$iCtrl][11] = $g_aCtrls[$x][11] ConsoleWrite('+> MOVED ' & $iCtrl & ' ' & $g_aCtrls[$iCtrl][10] & '|' & $g_aCtrls[$iCtrl][11] & @CRLF) MouseClick('Left') ;, $g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11]) ;ConsoleWrite($aReadCursorInfo[0] & ',' & $aReadCursorInfo[1] & @CRLF) ;ConsoleWrite($g_aCtrls[$x][3] & ',' & $g_aCtrls[$x][4] & @CRLF) ;ConsoleWrite($g_aCtrls[$x][5] & ',' & $g_aCtrls[$x][6] & @CRLF) ;_ArrayDisplay($g_aCtrls) ;#ce ;ContinueLoop ;Return ExitLoop Else ConsoleWrite('!> ' & $x & ' ' & $g_aCtrls[$x][10] & '|' & $g_aCtrls[$x][11] & @CRLF) EndIf Next ConsoleWrite('+++' & @CRLF) EndFunc ;==>CheckObjectLocation ;#ce Func Get_Stats() _ArrayDisplay($g_aCtrls) EndFunc ;==>Get_Stats . . 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
UEZ Posted July 4, 2015 Share Posted July 4, 2015 I will have next week a closer look to the collision problem. Meanwhile have a look here: https://www.autoitscript.com/forum/topic/170315-collision-detection-with-gdi/?do=findComment&comment=1245469Maybe it will give you some more ideas. Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
nitekram Posted July 4, 2015 Author Share Posted July 4, 2015 I was going to start a new post on this, but maybe someone will read this and fill in the blanks - since it appears that might be the fix https://www.autoitscript.com/autoit3/docs/libfunctions/_GDIPlus_PathIsVisiblePoint.htm The graphic handle option, cuts off - there are a few help files with this same ending. Can someone fill in the blank? 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
UEZ Posted July 5, 2015 Share Posted July 5, 2015 The header is; #FUNCTION# ==================================================================================================================== ; Name...........: _GDIPlus_PathIsVisiblePoint ; Description ...: Determines whether a specified point lies in the area that is filled when a path is filled by a specified ; +Graphics object ; Syntax.........: _GDIPlus_PathIsVisiblePoint($hPath, $fX, $fY[, $hGraphics = 0]) ; Parameters ....: $hPath - Pointer to a GraphicsPath object ; $fX - X coordinate of the point to test ; $fY - Y coordinate of the point to test ; $hGraphics - Pointer to a Graphics object that specifies a world-to-device transformation. If 0, the test is ; +done in world coordinates; otherwise, the test is done in device coordinates ; Return values .: Success - True if the point lies in the interior of the path, False otherwise ; Failure - -1 ; Author ........: Authenticity ; Modified.......: Eukalyptus ; Remarks .......: None ; Related .......: None ; Link ..........; @@MsdnLink@@ GdipIsVisiblePathPoint ; Example .......; Yes ; =============================================================================================================================== Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
nitekram Posted July 5, 2015 Author Share Posted July 5, 2015 That is twice I have been schooled lol, never thought of going to source - thanks, will look into this soon. 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
nitekram Posted July 7, 2015 Author Share Posted July 7, 2015 I was not able to understand the Path, so I started again with this, but for the life of me, I cannot figure out why it only works with the first image (the top one on the left). All the other ones, will allow for the any image to cover them. I have been at this for a few days, and no matter what I try, I cannot seem to get it right.expandcollapse popup#include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <WindowsConstants.au3> #include <array.au3> #include <StaticConstants.au3> AutoItSetOption("MouseCoordMode", 2) Global $g_hGUI, $g_hImage, $g_hGDIBitmap, $g_aCtrls[4][15], $hGraphics, $hPath Global $ci_MainWidth = 1000, $ci_MainHeight = 700 Global $bCheckLocation = False Global $bDrawLine = False, $h_Pen Global $hBitmap_Scaled Example() Func Example() AutoItSetOption("GUIOnEventMode", 1) ; X64 running support Local $sWow64 = "" If @AutoItX64 Then $sWow64 = "\Wow6432Node" ;get AutoIt install dir Local $sRegPath = "HKLM\SOFTWARE" & $sWow64 & "\AutoIt v3\AutoIt" Local $sFile = RegRead($sRegPath, "InstallDir") & "\Examples\GUI\logo4.gif" If Not FileExists($sFile) Then MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", $sFile & " not found!", 30) Exit EndIf ;$sFile = 'bulb0.jpg' If FileExists('logo4.gif') Then $sFile = 'logo4.gif' Local $i Local $sTitle = "GDI+" _GDIPlus_Startup() $h_Pen = _GDIPlus_PenCreate(0xFFFF0000) $hPath = _GDIPlus_PathCreate() ;Create new path object $g_hGUI = GUICreate($sTitle, $ci_MainWidth, $ci_MainHeight) ;GUISetBkColor(0xffffff) For $i = 0 To UBound($g_aCtrls) - 1 $g_aCtrls[$i][1] = 0 ;x pos (Starting Position) $g_aCtrls[$i][2] = 250 + $i * 120 ;y pos starting position $g_aCtrls[$i][0] = GUICtrlCreatePic("", $g_aCtrls[$i][1], $g_aCtrls[$i][2], 169, 68) $g_aCtrls[$i][3] = 100 ; min x pos $g_aCtrls[$i][4] = 150 ; min y pos Local $aImagePos = ControlGetPos($g_hGUI, '', $g_aCtrls[$i][0]) $g_aCtrls[$i][5] = $ci_MainWidth - $aImagePos[2] - 10 ; max x pos $g_aCtrls[$i][6] = $ci_MainHeight - $aImagePos[3] - 10 ; max y pos ; have to resize as you are making the control to make sure the larger image is not on the screen $g_aCtrls[$i][7] = _GDIPlus_ImageLoadFromFile($sFile) $g_aCtrls[$i][7] = _GDIPlus_ImageResize($g_aCtrls[$i][7], 50, 50) $g_aCtrls[$i][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($g_aCtrls[$i][7]) $g_aCtrls[$i][10] = $g_aCtrls[$i][1] ; starting X - then updates to new X position $g_aCtrls[$i][11] = $g_aCtrls[$i][2] ; starting y - then updates to new Y position $g_aCtrls[$i][12] = _GDIPlus_ImageGetWidth($g_aCtrls[$i][7]) ; Width of image $g_aCtrls[$i][13] = _GDIPlus_ImageGetHeight($g_aCtrls[$i][7]) ; Height of image Next _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, 'Get_Stats') GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUISetState(@SW_SHOW) ; ScreenUpdate CtrlMove($g_aCtrls, 0, $g_hGUI) Local $aMChk Do ;ConsoleWrite('*' & @CRLF) $aMChk = GUIGetCursorInfo($g_hGUI) Switch $aMChk[4] Case $g_aCtrls[0][0] $bCheckLocation = False CtrlMove($g_aCtrls, 0, $g_hGUI) ;CheckObjectLocation($g_aCtrls, 0) ;$bCheckLocation = False Case $g_aCtrls[1][0] $bCheckLocation = False CtrlMove($g_aCtrls, 1, $g_hGUI) ;CheckObjectLocation($g_aCtrls, 1) ;$bCheckLocation = False Case $g_aCtrls[2][0] $bCheckLocation = False CtrlMove($g_aCtrls, 2, $g_hGUI) ;CheckObjectLocation($g_aCtrls, 2) ;$bCheckLocation = False Case $g_aCtrls[3][0] $bCheckLocation = False CtrlMove($g_aCtrls, 3, $g_hGUI) ;CheckObjectLocation($g_aCtrls, 3) ;$bCheckLocation = False EndSwitch Until Not Sleep(50) EndFunc ;==>Example ; Func CtrlMove(ByRef $g_aCtrls, $iCtrl, $g_hGUI) Local $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) Local $iDX = Abs(MouseGetPos(0) - $aCtrlPos[0]) Local $iDY = Abs(MouseGetPos(1) - $aCtrlPos[1]) Local $iX, $iY ; For $x = 0 To UBound($g_aCtrls) - 1 $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$x][0]) _WinAPI_DeleteObject(GUICtrlSendMsg($g_aCtrls[$x][0], 0x0172, $IMAGE_BITMAP, $g_aCtrls[$x][8])) ;$STM_SETIMAGE = 0x0172 Sleep(20) Local $hBitmap_Scaled = _GDIPlus_ImageResize($g_aCtrls[$x][7], 50, 50) If @error Then MsgBox('', '_GDIPlus_ImageResize ' & @error, $hBitmap_Scaled) Sleep(20) ; Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle If @error Then MsgBox('', '_GDIPlus_GraphicsCreateFromHWND ' & @error, $hGraphics) Sleep(20) ; _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, $aCtrlPos[0], $aCtrlPos[1]) Sleep(20) $g_aCtrls[$x][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_Scaled) ; handle to a HBITMAP (a handle to a bitmap from a bitmap object) Sleep(20) $iPic_W = _GDIPlus_ImageGetWidth($hBitmap_Scaled) $iPic_H = _GDIPlus_ImageGetHeight($hBitmap_Scaled) _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) Next _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) While GUIGetCursorInfo($g_hGUI)[2] $iX = MouseGetPos(0) - $iDX $iY = MouseGetPos(1) - $iDY $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) $iX_ = $aCtrlPos[0] $iY_ = $aCtrlPos[1] ;ConsoleWrite(' --REAL MOUSE-- ' & MouseGetPos(0) & ' ' & MouseGetPos(1) & @CRLF) ; ternary operator ; #cs GUICtrlSetPos($g_aCtrls[$iCtrl][0], ($iX < $g_aCtrls[$iCtrl][3]) ? $g_aCtrls[$iCtrl][3] : ($iX > $g_aCtrls[$iCtrl][5]) ? $g_aCtrls[$iCtrl][5] : $iX, _ ($iY < $g_aCtrls[$iCtrl][4]) ? $g_aCtrls[$iCtrl][4] : ($iY > $g_aCtrls[$iCtrl][6]) ? $g_aCtrls[$iCtrl][6] : $iY) #ce Sleep(10) Local $iX_, $iY_ ; check boundries X If $iX < $g_aCtrls[$iCtrl][3] Then ; get x $iX_ = $g_aCtrls[$iCtrl][3] ElseIf $iX > $g_aCtrls[$iCtrl][5] Then ; get x $iX_ = $g_aCtrls[$iCtrl][5] Else $iX_ = $iX EndIf ; check boundries Y If $iY < $g_aCtrls[$iCtrl][4] Then $iY_ = $g_aCtrls[$iCtrl][4] ElseIf $iY > $g_aCtrls[$iCtrl][6] Then $iY_ = $g_aCtrls[$iCtrl][6] Else $iY_ = $iY EndIf ; Check to make sure no overlap If Not _CheckLocation($iCtrl, $iX_, $iY_) Then ContinueLoop Else ; move image to new position GUICtrlSetPos($g_aCtrls[$iCtrl][0], $iX_, $iY_) Sleep(10) $g_aCtrls[$iCtrl][10] = $iX_ $g_aCtrls[$iCtrl][11] = $iY_ ConsoleWrite('!> ' & $iCtrl & ' NEW VALUE...' & $g_aCtrls[$iCtrl][10] & ',' & $g_aCtrls[$iCtrl][11] & @CRLF) EndIf ;_GDIPlus_GraphicsDrawRect($hGraphics, 300, 300, 50, 50, $h_Pen) ;_GDIPlus_GraphicsDrawRect($hGraphics, 290, 290, 70, 70, $h_Pen) WEnd EndFunc ;==>CtrlMove ; Func _Exit() _WinAPI_DeleteObject($g_hGDIBitmap) _GDIPlus_ImageDispose($g_hImage) _GDIPlus_Shutdown() GUIDelete($g_hGUI) Exit EndFunc ;==>_Exit ; Func _CheckLocation($iCtrl, $iX, $iY) ;ConsoleWrite('Checking the locatoin...' & $iCtrl & ' ' & $iX & ',' & $iY & ',' & $_x & ',' & $_y & ',' & _GDIPlus_ImageGetWidth($hBitmap_Scaled) & ' ' & _GDIPlus_ImageGetHeight($hBitmap_Scaled) & @CRLF) ;ConsoleWrite('Checking the locatoin...' & _GDIPlus_ImageGetWidth($hBitmap_Scaled) & ' ' & _GDIPlus_ImageGetHeight($hBitmap_Scaled) & @CRLF) Local $xOffSet = 10 Local $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) For $x = 0 To UBound($g_aCtrls) - 1 ;ConsoleWrite('!>' & $iX & @CRLF) If _WinAPI_PtInRectEx($iX, $iY, $g_aCtrls[$x][10] - $aCtrlPos[2] - $xOffSet, $g_aCtrls[$x][11] - $aCtrlPos[3] - $xOffSet, $g_aCtrls[$x][10] + $aCtrlPos[2] + $xOffSet, $g_aCtrls[$x][11] + $aCtrlPos[3] + $xOffSet) Then Return False Else Return True EndIf Next EndFunc ;==>_CheckLocation Func CheckObjectLocation(ByRef $g_aCtrls, $iCtrl) ConsoleWrite('Checking Location...' & @CRLF) Local $aReadCursorInfo ;= GUIGetCursorInfo($g_hGUI) For $x = 0 To UBound($g_aCtrls) - 1 ;ConsoleWrite('x = ' & $x & @CRLF) ; If $iCtrl = $x Then ContinueLoop $aReadCursorInfo = GUIGetCursorInfo($g_hGUI) ConsoleWrite('Mouse ' & $aReadCursorInfo[0] & '|' & $aReadCursorInfo[0] & @CRLF) Local $aImagePos = ControlGetPos($g_hGUI, '', $g_aCtrls[$x][0]) If Not $bCheckLocation And _WinAPI_PtInRectEx($aReadCursorInfo[0], $aReadCursorInfo[1], $g_aCtrls[$x][10], $g_aCtrls[$x][11], $g_aCtrls[$x][10] + $aImagePos[2], $g_aCtrls[$x][11] + $aImagePos[3]) Then ;#cs Sleep(20) ; MouseMove($g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11], 0) ConsoleWrite('+> XXX ' & $x & ' ' & $g_aCtrls[$x][10] & '|' & $g_aCtrls[$x][11] & @CRLF) ; ;MsgBox('', '', 'hit') ; if I comment this out, both images move... GUICtrlSetPos($g_aCtrls[$iCtrl][0], $g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11]) $g_aCtrls[$iCtrl][10] = $g_aCtrls[$x][10] - $aImagePos[2] $g_aCtrls[$iCtrl][11] = $g_aCtrls[$x][11] ConsoleWrite('+> MOVED ' & $iCtrl & ' ' & $g_aCtrls[$iCtrl][10] & '|' & $g_aCtrls[$iCtrl][11] & @CRLF) MouseClick('Left') ;, $g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11]) ;ConsoleWrite($aReadCursorInfo[0] & ',' & $aReadCursorInfo[1] & @CRLF) ;ConsoleWrite($g_aCtrls[$x][3] & ',' & $g_aCtrls[$x][4] & @CRLF) ;ConsoleWrite($g_aCtrls[$x][5] & ',' & $g_aCtrls[$x][6] & @CRLF) ;_ArrayDisplay($g_aCtrls) ;#ce ;ContinueLoop ;Return ExitLoop Else ConsoleWrite('!> ' & $x & ' ' & $g_aCtrls[$x][10] & '|' & $g_aCtrls[$x][11] & @CRLF) EndIf Next ConsoleWrite('+++' & @CRLF) EndFunc ;==>CheckObjectLocation ;#ce Func Get_Stats() _ArrayDisplay($g_aCtrls) EndFunc ;==>Get_Stats .. 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
nitekram Posted July 7, 2015 Author Share Posted July 7, 2015 (edited) I do not believe this function -https://www.autoitscript.com/autoit3/docs/libfunctions/_GDIPlus_PathIsVisiblePoint.htmis what I was looking for, as I am only using the squares for a reference - meaning, I am going to be moving the images on the left to the right, and once placed, I do not want other images to over lap them by an offset of X. Reading what this function does, it works with lines and arcs, and such.https://msdn.microsoft.com/en-us/library/530a2kct(v=vs.110).aspx?f=255&MSPPError=-2147217396I am still looking, though I thought I found a thread that would help, but lost it. It was random boxes floating down and when another came down it stopped at the top of the one below - though I do not remember if it was using the same function or not. And I have looked and still cannot find. This is the closes I have gotten so far...I need to fine tune it.expandcollapse popup#include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <WindowsConstants.au3> #include <array.au3> #include <StaticConstants.au3> AutoItSetOption("MouseCoordMode", 2) Global $g_hGUI, $g_hImage, $g_hGDIBitmap, $g_aCtrls[4][15], $hGraphics, $hPath Global $ci_MainWidth = 1000, $ci_MainHeight = 700 Global $bCheckLocation = False Global $bDrawLine = False, $h_Pen Global $hBitmap_Scaled Example() Func Example() AutoItSetOption("GUIOnEventMode", 1) ; X64 running support Local $sWow64 = "" If @AutoItX64 Then $sWow64 = "\Wow6432Node" ;get AutoIt install dir Local $sRegPath = "HKLM\SOFTWARE" & $sWow64 & "\AutoIt v3\AutoIt" Local $sFile = RegRead($sRegPath, "InstallDir") & "\Examples\GUI\logo4.gif" If Not FileExists($sFile) Then MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", $sFile & " not found!", 30) Exit EndIf ;$sFile = 'bulb0.jpg' If FileExists('logo4.gif') Then $sFile = 'logo4.gif' Local $i Local $sTitle = "GDI+" _GDIPlus_Startup() $h_Pen = _GDIPlus_PenCreate(0xFFFF0000) $hPath = _GDIPlus_PathCreate() ;Create new path object $g_hGUI = GUICreate($sTitle, $ci_MainWidth, $ci_MainHeight) ;GUISetBkColor(0xffffff) For $i = 0 To UBound($g_aCtrls) - 1 $g_aCtrls[$i][1] = 0 ;x pos (Starting Position) $g_aCtrls[$i][2] = 250 + $i * 120 ;y pos starting position $g_aCtrls[$i][0] = GUICtrlCreatePic("", $g_aCtrls[$i][1], $g_aCtrls[$i][2], 169, 68) $g_aCtrls[$i][3] = 100 ; min x pos $g_aCtrls[$i][4] = 150 ; min y pos Local $aImagePos = ControlGetPos($g_hGUI, '', $g_aCtrls[$i][0]) $g_aCtrls[$i][5] = $ci_MainWidth - $aImagePos[2] - 10 ; max x pos $g_aCtrls[$i][6] = $ci_MainHeight - $aImagePos[3] - 10 ; max y pos ; have to resize as you are making the control to make sure the larger image is not on the screen $g_aCtrls[$i][7] = _GDIPlus_ImageLoadFromFile($sFile) $g_aCtrls[$i][7] = _GDIPlus_ImageResize($g_aCtrls[$i][7], 50, 50) $g_aCtrls[$i][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($g_aCtrls[$i][7]) $g_aCtrls[$i][10] = $g_aCtrls[$i][1] ; starting X - then updates to new X position $g_aCtrls[$i][11] = $g_aCtrls[$i][2] ; starting y - then updates to new Y position $g_aCtrls[$i][12] = _GDIPlus_ImageGetWidth($g_aCtrls[$i][7]) ; Width of image $g_aCtrls[$i][13] = _GDIPlus_ImageGetHeight($g_aCtrls[$i][7]) ; Height of image Next _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, 'Get_Stats') GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUISetState(@SW_SHOW) ; ScreenUpdate CtrlMove($g_aCtrls, 0, $g_hGUI) Local $aMChk Do ConsoleWrite('*' & @CRLF) $aMChk = GUIGetCursorInfo($g_hGUI) Switch $aMChk[4] Case $g_aCtrls[0][0] $bCheckLocation = False If $aMChk[2] Then CtrlMove($g_aCtrls, 0, $g_hGUI) ;CheckObjectLocation($g_aCtrls, 0) ;$bCheckLocation = False Case $g_aCtrls[1][0] $bCheckLocation = False If $aMChk[2] Then CtrlMove($g_aCtrls, 1, $g_hGUI) ;CheckObjectLocation($g_aCtrls, 1) ;$bCheckLocation = False Case $g_aCtrls[2][0] $bCheckLocation = False If $aMChk[2] Then CtrlMove($g_aCtrls, 2, $g_hGUI) ;CheckObjectLocation($g_aCtrls, 2) ;$bCheckLocation = False Case $g_aCtrls[3][0] $bCheckLocation = False If $aMChk[2] Then CtrlMove($g_aCtrls, 3, $g_hGUI) ;CheckObjectLocation($g_aCtrls, 3) ;$bCheckLocation = False EndSwitch Until Not Sleep(50) EndFunc ;==>Example ; Func CtrlMove(ByRef $g_aCtrls, $iCtrl, $g_hGUI) Local $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) Local $iDX = Abs(MouseGetPos(0) - $aCtrlPos[0]) Local $iDY = Abs(MouseGetPos(1) - $aCtrlPos[1]) Local $iX, $iY Static $bRanOnce = False ; If Not $bRanOnce Then For $x = 0 To UBound($g_aCtrls) - 1 $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$x][0]) _WinAPI_DeleteObject(GUICtrlSendMsg($g_aCtrls[$x][0], 0x0172, $IMAGE_BITMAP, $g_aCtrls[$x][8])) ;$STM_SETIMAGE = 0x0172 Sleep(20) Local $hBitmap_Scaled = _GDIPlus_ImageResize($g_aCtrls[$x][7], 50, 50) If @error Then MsgBox('', '_GDIPlus_ImageResize ' & @error, $hBitmap_Scaled) Sleep(20) ; Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle If @error Then MsgBox('', '_GDIPlus_GraphicsCreateFromHWND ' & @error, $hGraphics) Sleep(20) ; _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Scaled, $aCtrlPos[0], $aCtrlPos[1]) Sleep(20) $g_aCtrls[$x][8] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_Scaled) ; handle to a HBITMAP (a handle to a bitmap from a bitmap object) Sleep(20) $iPic_W = _GDIPlus_ImageGetWidth($hBitmap_Scaled) $iPic_H = _GDIPlus_ImageGetHeight($hBitmap_Scaled) _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) Next _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW) $bRanOnce = True EndIf ; While GUIGetCursorInfo($g_hGUI)[2] $iX = MouseGetPos(0) - $iDX $iY = MouseGetPos(1) - $iDY $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) $iX_ = $aCtrlPos[0] $iY_ = $aCtrlPos[1] ;ConsoleWrite(' --REAL MOUSE-- ' & MouseGetPos(0) & ' ' & MouseGetPos(1) & @CRLF) ; ternary operator ; #cs GUICtrlSetPos($g_aCtrls[$iCtrl][0], ($iX < $g_aCtrls[$iCtrl][3]) ? $g_aCtrls[$iCtrl][3] : ($iX > $g_aCtrls[$iCtrl][5]) ? $g_aCtrls[$iCtrl][5] : $iX, _ ($iY < $g_aCtrls[$iCtrl][4]) ? $g_aCtrls[$iCtrl][4] : ($iY > $g_aCtrls[$iCtrl][6]) ? $g_aCtrls[$iCtrl][6] : $iY) #ce Sleep(10) Local $iX_, $iY_ ; check boundries X If $iX < $g_aCtrls[$iCtrl][3] Then ; get min x $iX_ = $g_aCtrls[$iCtrl][3] ElseIf $iX > $g_aCtrls[$iCtrl][5] Then ; get max x $iX_ = $g_aCtrls[$iCtrl][5] Else $iX_ = $iX EndIf ; check boundries Y If $iY < $g_aCtrls[$iCtrl][4] Then ; get min y $iY_ = $g_aCtrls[$iCtrl][4] ElseIf $iY > $g_aCtrls[$iCtrl][6] Then ; get max y $iY_ = $g_aCtrls[$iCtrl][6] Else $iY_ = $iY EndIf ; Check to make sure no overlap If _CheckLocation($iCtrl, $iX_, $iY_) Then ; move image to new position GUICtrlSetPos($g_aCtrls[$iCtrl][0], $iX_, $iY_) Sleep(10) $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) If $aCtrlPos[0] <> $iX_ Then MsgBox('','','') If $aCtrlPos[1] <> $iY_ Then MsgBox('','','') ;ConsoleWrite('!> ' & $iCtrl & ' OLD VALUE...' & $g_aCtrls[$iCtrl][10] & ',' & $g_aCtrls[$iCtrl][11] & @CRLF) $g_aCtrls[$iCtrl][10] = $aCtrlPos[0] $g_aCtrls[$iCtrl][11] = $aCtrlPos[1] ;ConsoleWrite('!> ' & $iCtrl & ' NEW VALUE...' & $g_aCtrls[$iCtrl][10] & ',' & $g_aCtrls[$iCtrl][11] & @CRLF) EndIf ;_GDIPlus_GraphicsDrawRect($hGraphics, 300, 300, 50, 50, $h_Pen) ;_GDIPlus_GraphicsDrawRect($hGraphics, 290, 290, 70, 70, $h_Pen) WEnd ;_ArrayDisplay($g_aCtrls, '') EndFunc ;==>CtrlMove ; Func _Exit() _WinAPI_DeleteObject($g_hGDIBitmap) _GDIPlus_ImageDispose($g_hImage) _GDIPlus_Shutdown() GUIDelete($g_hGUI) Exit EndFunc ;==>_Exit ; Func _CheckLocation($iCtrl, $iX, $iY) ;ConsoleWrite('Checking the locatoin...' & $iCtrl & ' ' & $iX & ',' & $iY & ',' & $_x & ',' & $_y & ',' & _GDIPlus_ImageGetWidth($hBitmap_Scaled) & ' ' & _GDIPlus_ImageGetHeight($hBitmap_Scaled) & @CRLF) ;ConsoleWrite('Checking the locatoin...' & _GDIPlus_ImageGetWidth($hBitmap_Scaled) & ' ' & _GDIPlus_ImageGetHeight($hBitmap_Scaled) & @CRLF) Local $xOffSet = 10 Static $wtf For $x = 0 To UBound($g_aCtrls) - 1 If $iCtrl = $x Then ContinueLoop ; Local $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$iCtrl][0]) ; If _WinAPI_PtInRectEx($iX, $iY, $g_aCtrls[$x][10] - $aCtrlPos[2] - $xOffSet, $g_aCtrls[$x][11] - $aCtrlPos[3] - $xOffSet, $g_aCtrls[$x][10] + $aCtrlPos[2] + $xOffSet, $g_aCtrls[$x][11] + $aCtrlPos[3] + $xOffSet) Then ;If $x <> UBound($g_aCtrls) - 1 Then Return False EndIf ; Next Return True EndFunc ;==>_CheckLocation ; Func CheckObjectLocation(ByRef $g_aCtrls, $iCtrl) ConsoleWrite('Checking Location...' & @CRLF) Local $aReadCursorInfo ;= GUIGetCursorInfo($g_hGUI) For $x = 0 To UBound($g_aCtrls) - 1 ;ConsoleWrite('x = ' & $x & @CRLF) ; If $iCtrl = $x Then ContinueLoop $aReadCursorInfo = GUIGetCursorInfo($g_hGUI) ConsoleWrite('Mouse ' & $aReadCursorInfo[0] & '|' & $aReadCursorInfo[0] & @CRLF) Local $aImagePos = ControlGetPos($g_hGUI, '', $g_aCtrls[$x][0]) If Not $bCheckLocation And _WinAPI_PtInRectEx($aReadCursorInfo[0], $aReadCursorInfo[1], $g_aCtrls[$x][10], $g_aCtrls[$x][11], $g_aCtrls[$x][10] + $aImagePos[2], $g_aCtrls[$x][11] + $aImagePos[3]) Then ;#cs Sleep(20) ; MouseMove($g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11], 0) ConsoleWrite('+> XXX ' & $x & ' ' & $g_aCtrls[$x][10] & '|' & $g_aCtrls[$x][11] & @CRLF) ; ;MsgBox('', '', 'hit') ; if I comment this out, both images move... GUICtrlSetPos($g_aCtrls[$iCtrl][0], $g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11]) $g_aCtrls[$iCtrl][10] = $g_aCtrls[$x][10] - $aImagePos[2] $g_aCtrls[$iCtrl][11] = $g_aCtrls[$x][11] ConsoleWrite('+> MOVED ' & $iCtrl & ' ' & $g_aCtrls[$iCtrl][10] & '|' & $g_aCtrls[$iCtrl][11] & @CRLF) MouseClick('Left') ;, $g_aCtrls[$x][10] - $aImagePos[2] - 50, $g_aCtrls[$x][11]) ;ConsoleWrite($aReadCursorInfo[0] & ',' & $aReadCursorInfo[1] & @CRLF) ;ConsoleWrite($g_aCtrls[$x][3] & ',' & $g_aCtrls[$x][4] & @CRLF) ;ConsoleWrite($g_aCtrls[$x][5] & ',' & $g_aCtrls[$x][6] & @CRLF) ;_ArrayDisplay($g_aCtrls) ;#ce ;ContinueLoop ;Return ExitLoop Else ConsoleWrite('!> ' & $x & ' ' & $g_aCtrls[$x][10] & '|' & $g_aCtrls[$x][11] & @CRLF) EndIf Next ConsoleWrite('+++' & @CRLF) EndFunc ;==>CheckObjectLocation ;#ce Func Get_Stats() _ArrayDisplay($g_aCtrls) EndFunc ;==>Get_Stats ..EDITI found the link with the floating boxes:https://www.autoitscript.com/forum/topic/129222-issues-collision-backbuffering-ect/#comment-897633 Edited July 8, 2015 by nitekram 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
UEZ Posted July 8, 2015 Share Posted July 8, 2015 (edited) You can try something like this here:expandcollapse popup#include <GDIPlus.au3> #include <GUIConstantsEx.au3> AutoItSetOption("MouseCoordMode", 2) Global $g_hGUI, $g_hImage, $g_hGDIBitmap, $g_aCtrls[4][5], $hGraphics Example() Func Example() AutoItSetOption("GUIOnEventMode", 1) ; X64 running support Local $sWow64 = "" If @AutoItX64 Then $sWow64 = "\Wow6432Node" ;get AutoIt install dir Local $sRegPath = "HKLM\SOFTWARE" & $sWow64 & "\AutoIt v3\AutoIt" Local $sFile = RegRead($sRegPath, "InstallDir") & "\Examples\GUI\logo4.gif" If Not FileExists($sFile) Then MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", $sFile & " not found!", 30) Exit EndIf ;$sFile = 'bulb0.jpg' If FileExists('logo4.gif') Then $sFile = 'logo4.gif' Local $i Local $sTitle = "GDI+" _GDIPlus_Startup() $g_hImage = _GDIPlus_ImageLoadFromFile($sFile) $g_hGDIBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($g_hImage) $g_hGUI = GUICreate($sTitle, 1000, 600) ;GUISetBkColor(0xffffff) Local $iW = 169, $iH = 68 For $i = 0 To UBound($g_aCtrls) - 1 $g_aCtrls[$i][0] = 10 $g_aCtrls[$i][1] = 50 + $i * 150 $g_aCtrls[$i][2] = $iW $g_aCtrls[$i][3] = $iH $g_aCtrls[$i][4] = GUICtrlCreatePic("", $g_aCtrls[$i][0], $g_aCtrls[$i][1], $g_aCtrls[$i][2], $g_aCtrls[$i][3]) _WinAPI_DeleteObject(GUICtrlSendMsg($g_aCtrls[$i][4], 0x0172, $IMAGE_BITMAP, $g_hGDIBitmap)) ;$STM_SETIMAGE = 0x0172 Next GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUISetState(@SW_SHOW) Local $aMChk, $aCtrlPos, $iDX, $iDY, $iX_old, $iY_old Do $aMChk = GUIGetCursorInfo($g_hGUI) For $i = 0 To UBound($g_aCtrls) - 1 Switch $aMChk[4] Case $g_aCtrls[$i][4] $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$i][4]) $iDX = Abs(MouseGetPos(0) - $aCtrlPos[0]) $iDY = Abs(MouseGetPos(1) - $aCtrlPos[1]) While GUIGetCursorInfo($g_hGUI)[2] $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$i][4]) If Not Collision($i, MouseGetPos(0) - $iDX, MouseGetPos(1) - $iDY) Then ControlMove($g_hGUI, "", $g_aCtrls[$i][4], MouseGetPos(0) - $iDX, MouseGetPos(1) - $iDY) $aCtrlPos = ControlGetPos($g_hGUI, "", $g_aCtrls[$i][4]) $g_aCtrls[$i][0] = $aCtrlPos[0] $g_aCtrls[$i][1] = $aCtrlPos[1] EndIf Sleep(10) WEnd EndSwitch Next Until Not Sleep(30) EndFunc ;==>Example Func Collision($iCtrl, $iX, $iY) Local $i For $i = 0 To UBound($g_aCtrls) - 1 If $iCtrl <> $i Then If _WinAPI_PtInRectEx($iX, $iY, $g_aCtrls[$i][0], $g_aCtrls[$i][1], $g_aCtrls[$i][0] + $g_aCtrls[$i][2], $g_aCtrls[$i][1] + $g_aCtrls[$i][3]) Then Return 1 If _WinAPI_PtInRectEx($iX + $g_aCtrls[$iCtrl][2], $iY, $g_aCtrls[$i][0], $g_aCtrls[$i][1], $g_aCtrls[$i][0] + $g_aCtrls[$i][2], $g_aCtrls[$i][1] + $g_aCtrls[$i][3]) Then Return 1 If _WinAPI_PtInRectEx($iX, $iY + $g_aCtrls[$iCtrl][3], $g_aCtrls[$i][0], $g_aCtrls[$i][1], $g_aCtrls[$i][0] + $g_aCtrls[$i][2], $g_aCtrls[$i][1] + $g_aCtrls[$i][3]) Then Return 1 If _WinAPI_PtInRectEx($iX + $g_aCtrls[$iCtrl][2], $iY + $g_aCtrls[$iCtrl][3], $g_aCtrls[$i][0], $g_aCtrls[$i][1], $g_aCtrls[$i][0] + $g_aCtrls[$i][2], $g_aCtrls[$i][1] + $g_aCtrls[$i][3]) Then Return 1 EndIf Next Return 0 EndFunc ;==>Collision Func _Exit() _GDIPlus_ImageDispose($g_hImage) _WinAPI_DeleteObject($g_hGDIBitmap) _GDIPlus_Shutdown() GUIDelete($g_hGUI) Exit EndFunc ;==>_Exit Edited July 8, 2015 by UEZ forget to save moved control position Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
nitekram Posted July 8, 2015 Author Share Posted July 8, 2015 That did not seem to work, as the images were able to overlap each other. I looked but could not find out where it was allowing it, as it appears the code is right, but maybe not the conditions? 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
UEZ Posted July 8, 2015 Share Posted July 8, 2015 (edited) I understood that the controls should not overlap.Edit: sorry, found the bug. I updated the code. Edited July 8, 2015 by UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
nitekram Posted July 8, 2015 Author Share Posted July 8, 2015 I tried yours, and it is not much different than the one I posted. Both still have issues when coming in from the corners - but it is workable. I am still going to look at it, as I have other stuff going to be added, and I will see how much it affects the script. 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
LarsJ Posted July 8, 2015 Share Posted July 8, 2015 (edited) Optimizing the Collision functionBecause the rectangles have the same size it's easy to optimize the Collision function. In order to check whether the right rectangle overlaps the left rectangle, it is enough to check if the midpoint of the right rectangle is inside the dotted rectangle.The height and width of the dotted rectangle is twice the height and width of the solid. The midpoint of the dotted rectangle is the same as the midpoint of the solid.The four lines in the Collision function can be reduced to one line where you check if the midpoint is inside the dotted rectangle.You have to store information about the dotted rectangles and the midpoints in the arrays. Edited July 8, 2015 by LarsJ Xandy 1 Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
nitekram Posted July 8, 2015 Author Share Posted July 8, 2015 I will take a look at this tonight, but there are going to be different size rectangles, is that going to make a difference? 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
UEZ Posted July 8, 2015 Share Posted July 8, 2015 (edited) I tried yours, and it is not much different than the one I posted. Both still have issues when coming in from the corners - but it is workable. I am still going to look at it, as I have other stuff going to be added, and I will see how much it affects the script.To be honest I didn't check in details what you did. So, the ideas were the same... Optimizing the Collision functionBecause the rectangles have the same size it's easy to optimize the Collision function. In order to check whether the right rectangle overlaps the left rectangle, it is enough to check if the midpoint of the right rectangle is inside the dotted rectangle.The height and width of the dotted rectangle is twice the height and width of the solid. The midpoint of the dotted rectangle is the same as the midpoint of the solid.The four lines in the Collision function can be reduced to one line where you check if the midpoint is inside the dotted rectangle.You have to store information about the dotted rectangles and the midpoints in the arrays.That might be shorter and faster but with the 4 lines version you can check more or less which edge causes the collision if you need more details about the collision.Anyhow, nice to know that "trick". I will add it, too.I assume this should also work for different rectangle sizes as long as they are rectangles and not other more complex objects. Edited July 8, 2015 by UEZ Xandy 1 Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
LarsJ Posted July 8, 2015 Share Posted July 8, 2015 (edited) nitekram, No, rectangles of different sizes will not make a crucial difference. But you will need to store information about all the dotted rectangles. I'll add an example in the weekend.UEZ, Because there are many more checks without collision than checks with collision, it's important that the collision check is as fast as possible. For the most checks without collision the extra information is useless anyway. When you know, that there is a collision, you can calculate the extra information.For more complex objects you can use the trick for the bounding rectangles. When you know that the bounding rectangles collides, you can make a more complex collision check for the objects. Edited July 8, 2015 by LarsJ Complex objects Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
LarsJ Posted July 9, 2015 Share Posted July 9, 2015 (edited) Optimizing the Collision function 2Code to determine whether a point is inside a rectangle is very simple and should certainly not be performed with a function call. Perform the calculation directly:If $x1 < $mx And $mx < $x2 And $y1 < $my And $my < $y2 Then ; Collision Edited July 9, 2015 by LarsJ Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
nitekram Posted July 9, 2015 Author Share Posted July 9, 2015 What are you using for the offset - half the size of the box (rectangle) that is moving or the stationary box? 2¢ All by me:"Sometimes you have to go back to where you started, to get to where you want to go." "Everybody catches up with everyone, eventually" "As you teach others, you are really teaching yourself." From my dad "Do not worry about yesterday, as the only thing that you can control is tomorrow." WIKI | Tabs; | Arrays; | Strings | Wiki Arrays | How to ask a Question | Forum Search | FAQ | Tutorials | Original FAQ | ONLINE HELP | UDF's Wiki | AutoIt PDF AutoIt Snippets | Multple Guis | Interrupting a running function | Another Send StringRegExp | StringRegExp Help | RegEXTester | REG TUTOR | Reg TUTOT 2 AutoItSetOption | Macros | AutoIt Snippets | Wrapper | Autoit Docs SCITE | SciteJump | BB | MyTopics | Programming | UDFs | AutoIt 123 | UDFs Form | UDF Learning to script | Tutorials | Documentation | IE.AU3 | Games? | FreeSoftware | Path_Online | Core Language Programming Tips Excel Changes ControlHover.UDF GDI_Plus Draw_On_Screen GDI Basics GDI_More_Basics GDI Rotate GDI Graph GDI CheckExistingItems GDI Trajectory Replace $ghGDIPDll with $__g_hGDIPDll DLL 101? Array via Object GDI Swimlane GDI Plus French 101 Site GDI Examples UEZ GDI Basic Clock GDI Detection Ternary operator Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now