fortress Posted January 23, 2014 Posted January 23, 2014 Hey folks. Brand new to the forum. Been writing AutoIt for many years, though never really delved into the complex bits. The problem I'm having today is that I need to grab a rectangle from the screen and place it in a control in my GUI. Currently I'm using _ScreenCapture_CaptureWnd to grab the rectangle, and GuiCtrlCreateGraphic / GUICtrlSetGraphic to display the captured pixels. Loading the Graphic control one pixel at a time is taking way too long for the cycle time required. So I am hoping to find a quicker mechanism. I do not need to have access to the individual pixels. I looked at GUICtrlCreatePic, but it draws from a an external file rather than a screen shot or bitmap. Any advise or direction would be appreciated. Thanks.
Moderators Melba23 Posted January 23, 2014 Moderators Posted January 23, 2014 fortress,Welcome to the AutoIt forum. This code shows how to display a screengrab in a GUI. Use the mouse to size and move the rectange and then right-click in it to capture and display:expandcollapse popup#include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #Include <ScreenCapture.au3> Global $hCapture_GUI ; Set distance from edge of Capture_GUI where resizing is possible Global Const $iMargin = 4 ; Set max and min Capture_GUI sizes Global Const $iGUIMinX = 50, $iGUIMinY = 50, $iGUIMaxX = @DesktopWidth - 100, $iGUIMaxY = @DesktopHeight - 100 _Main() Func _Main() Local $sBMP_Path = @ScriptDir & "\Rect.bmp" ; Create GUI Local $hMain_GUI = GUICreate("Select Rectangle", 240, 50) Local $hRect_Button = GUICtrlCreateButton("Mark Area", 10, 10, 80, 30) Local $hCancel_Button = GUICtrlCreateButton("Cancel", 150, 10, 80, 30) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $hCancel_Button FileDelete($sBMP_Path) Exit Case $hRect_Button GUISetState(@SW_HIDE, $hMain_GUI) Local $aCoords = Mark_Rect() ; Capture selected area _ScreenCapture_Capture($sBMP_Path, $aCoords[0], $aCoords[1], $aCoords[0] + $aCoords[2], $aCoords[1] + $aCoords[3], False) GUISetState(@SW_SHOW, $hMain_GUI) ; Display image Local $hBitmap_GUI = GUICreate("Selected Rectangle", $aCoords[2], $aCoords[3], 100, 100) Local $hPic = GUICtrlCreatePic(@ScriptDir & "\Rect.bmp", 0, 0, $aCoords[2], $aCoords[3]) GUISetState() EndSwitch WEnd EndFunc ;==>_Main ; ------------- Func Mark_Rect() ; Create capture GUI $hCapture_GUI = GUICreate("Y", 100, 100, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST)) GUISetBkColor(0xABCDEF) ; Create label for dragging Local $cLabel = GUICtrlCreateLabel("", $iMargin * 2, $iMargin * 2, 100 - ($iMargin * 4), 100 - ($iMargin * 4), -1, $GUI_WS_EX_PARENTDRAG) GUICtrlSetBkColor(-1, 0xFFFFFF) GUICtrlSetResizing(-1, $GUI_DOCKBORDERS) ; Create context menu Local $cContextMenu = GUICtrlCreateContextMenu($cLabel) $cContext_Capture = GUICtrlCreateMenuItem("Capture", $cContextMenu) $cContext_Cancel = GUICtrlCreateMenuItem("Cancel", $cContextMenu) ; Hide GUI _WinAPI_SetLayeredWindowAttributes($hCapture_GUI, 0xABCDEF, 250) GUISetState() ; Set transparency level WinSetTrans($hCapture_GUI, "", 100) ; Register message handlers GUIRegisterMsg($WM_MOUSEMOVE, "_SetCursor") ; For cursor type change GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN") ; For resize/drag GUIRegisterMsg($WM_GETMINMAXINFO, "_WM_GETMINMAXINFO") ; For GUI size limits While 1 Switch GUIGetMsg() Case $cContext_Capture ; Get GUI position and delete $aPos = WinGetPos($hCapture_GUI) GUIDelete($hCapture_GUI) ; Unregister message handlers GUIRegisterMsg($WM_MOUSEMOVE, "") GUIRegisterMsg($WM_LBUTTONDOWN, "") GUIRegisterMsg($WM_GETMINMAXINFO, "") ; Peturn position Return $aPos Case $cContext_Cancel Exit EndSwitch WEnd EndFunc ;==>Mark_Rect ; Set cursor to correct resizing form if mouse is over a border Func _SetCursor() Local $iCursorID Switch _Check_Border() Case 0 $iCursorID = 2 Case 1, 2 $iCursorID = 13 Case 3, 6 $iCursorID = 11 Case 5, 7 $iCursorID = 10 Case 4, 8 $iCursorID = 12 EndSwitch GUISetCursor($iCursorID, 1) EndFunc ;==>_SetCursor ; Check cursor type and resize/drag window as required Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam) Local $iCursorType = _Check_Border() If $iCursorType > 0 Then ; Cursor is set to resizing style so send appropriate resize message $iResizeType = 0xF000 + $iCursorType _SendMessage($hCapture_GUI, $WM_SYSCOMMAND, $iResizeType, 0) EndIf EndFunc ;==>_WM_LBUTTONDOWN ; Determines if mouse cursor over a border Func _Check_Border() Local $aCurInfo = GUIGetCursorInfo($hCapture_GUI) Local $aWinPos = WinGetPos($hCapture_GUI) Local $iSide = 0 Local $iTopBot = 0 If $aCurInfo[0] < $iMargin Then $iSide = 1 If $aCurInfo[0] > $aWinPos[2] - $iMargin Then $iSide = 2 If $aCurInfo[1] < $iMargin Then $iTopBot = 3 If $aCurInfo[1] > $aWinPos[3] - $iMargin Then $iTopBot = 6 Return $iSide + $iTopBot EndFunc ;==>_Check_Border ; Set min and max GUI sizes Func _WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam) $tMinMaxInfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam) DllStructSetData($tMinMaxInfo, 7, $iGUIMinX) DllStructSetData($tMinMaxInfo, 8, $iGUIMinY) DllStructSetData($tMinMaxInfo, 9, $iGUIMaxX) DllStructSetData($tMinMaxInfo, 10, $iGUIMaxY) Return 0 EndFunc ;==>_WM_GETMINMAXINFONote that it does save the screengrab to file - but that can just be deleted once used. Please ask if you have any questions. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
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