Что нового

Выделение области

Neverlate

Новичок
Сообщения
3
Репутация
0
Необходим скрипт для выделения области с фиксацией четырёх координат прямоугольника а именно лево верх по X/Y и право низ по X/Y. Сейчас у меня это реализовано через две функции на хоткеях. Необходимо "Упростить" для юзверя.
Т3:
1) Зажать ЛКМ - Фиксация первых двух координат.
2) Перетаскивание мыши
3) Отпустить ЛКМ Фиксация двух вторых координат.
4) По возможности визуальный эффект аля "выделение на раб.столе"


з.ы. Сколько не шарил, ничего подобного в готовых и "яндексе" не нашёл. Либо тыкните куда копать, буду копать
 
Решение


То, что подошло моему запросу. Спасибо Innl


Код:
#RequireAdmin
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <ScreenCapture.au3>
#Include <Misc.au3>
#include <EditConstants.au3>

Global $iX1, $iY1, $iX2, $iY2, $aPos, $sMsg, $sBMP_Path

Global $s_ProgramTitle01 = "Select Rectangle"

Gui01()

Func Gui01()

; Create GUI
Local $hGUI =...

Andr

Новичок
Сообщения
5
Репутация
2
Здравствуйте. Посмотрите в справке про функции MouseClickDrag, MouseGetPos, WinGetPos.
 
Автор
N

Neverlate

Новичок
Сообщения
3
Репутация
0
Здравствуйте. Посмотрите в справке про функции MouseClickDrag, MouseGetPos, WinGetPos.
Дело в том что функция ClickDrag работает в другую сторону. Она не отдаёт, а принимает координаты. По которым необходимо кликать и таскать т.е. заранее заданым. А мне как раз таки эти координаты необходимо получить этим же путём "перетаскивания"

WinGetPos , это работа с окном и его положением, не похоже на правду, либо я не знать как интерпретировать это под себя.
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,724
Репутация
1,355


 
Автор
N

Neverlate

Новичок
Сообщения
3
Репутация
0


То, что подошло моему запросу. Спасибо Innl


Код:
#RequireAdmin
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <ScreenCapture.au3>
#Include <Misc.au3>
#include <EditConstants.au3>

Global $iX1, $iY1, $iX2, $iY2, $aPos, $sMsg, $sBMP_Path

Global $s_ProgramTitle01 = "Select Rectangle"

Gui01()

Func Gui01()

; Create GUI
Local $hGUI = GUICreate($s_ProgramTitle01, 240, 50)

Local $hRect_Button   = GUICtrlCreateButton("Mark Area",  10, 10, 80, 30)
Local $hCancel_Button = GUICtrlCreateButton("Close",    150, 10, 80, 30)

GUISetState(@SW_SHOW, $hGUI)

While 1

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $hCancel_Button
            FileDelete(@ScriptDir & "Rect.bmp")
            Exit
        Case $hRect_Button
            ;Capture selected area
            GUIDelete($hGUI)
            ExitLoop
    EndSwitch

WEnd

Mark_Rect()

EndFunc

Func GUI02()

; Create a GUI with various controls.
    Local $hGUI = GUICreate($s_ProgramTitle01, 300, 200)
    Local $idButton_Close = GUICtrlCreateButton("Close", 170, 170, 85, 25)
Local $idButton_Back = GUICtrlCreateButton("Back", 75, 170, 85, 25)
    ; Display the GUI.
    Local $idMyedit = GUICtrlCreateEdit("Left: " & $iX1 & @CRLF & "Top: " & $iY1 & @CRLF & "Right: " & _
    $iX2 & @CRLF & "Bottom: " & $iY2, 15, 15, 275, 150, $ES_AUTOVSCROLL + $WS_VSCROLL)

    GUISetState(@SW_SHOW, $hGUI)

    ; Loop until the user exits.
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $idButton_Close
            FileDelete(@ScriptDir & "Rect.bmp")
            GUIDelete($hGUI)
            Exit
        Case $idButton_Back
        GUIDelete($hGUI)
        ExitLoop
        EndSwitch
    WEnd

Gui01()

EndFunc



; -------------

Func Mark_Rect()

    Local $aMouse_Pos, $hMask, $hMaster_Mask, $iTemp
    Local $UserDLL = DllOpen("user32.dll")

    ; Create transparent GUI with Cross cursor
    $hCross_GUI = GUICreate("Test", @DesktopWidth, @DesktopHeight - 20, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
    WinSetTrans($hCross_GUI, "", 8)
    GUISetState(@SW_SHOW, $hCross_GUI)
    GUISetCursor(3, 1, $hCross_GUI)

    Global $hRectangle_GUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
    GUISetBkColor(0x000000)

    ; Wait until mouse button pressed
    While Not _IsPressed("01", $UserDLL)
        Sleep(10)
    WEnd

    ; Get first mouse position
    $aMouse_Pos = MouseGetPos()
    $iX1 = $aMouse_Pos[0]
    $iY1 = $aMouse_Pos[1]

    ; Draw rectangle while mouse button pressed
    While _IsPressed("01", $UserDLL)

        $aMouse_Pos = MouseGetPos()

        $hMaster_Mask = _WinAPI_CreateRectRgn(0, 0, 0, 0)
        $hMask = _WinAPI_CreateRectRgn($iX1,  $aMouse_Pos[1], $aMouse_Pos[0],  $aMouse_Pos[1] + 1) ; Bottom of rectangle
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        $hMask = _WinAPI_CreateRectRgn($iX1, $iY1, $iX1 + 1, $aMouse_Pos[1]) ; Left of rectangle
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        $hMask = _WinAPI_CreateRectRgn($iX1 + 1, $iY1 + 1, $aMouse_Pos[0], $iY1) ; Top of rectangle
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        $hMask = _WinAPI_CreateRectRgn($aMouse_Pos[0], $iY1, $aMouse_Pos[0] + 1,  $aMouse_Pos[1]) ; Right of rectangle
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        ; Set overall region
        _WinAPI_SetWindowRgn($hRectangle_GUI, $hMaster_Mask)

        If WinGetState($hRectangle_GUI) < 15 Then GUISetState()
        Sleep(10)

    WEnd

    ; Get second mouse position
    $iX2 = $aMouse_Pos[0]
    $iY2 = $aMouse_Pos[1]

    ; Set in correct order if required
    If $iX2 < $iX1 Then
        $iTemp = $iX1
        $iX1 = $iX2
        $iX2 = $iTemp
    EndIf
    If $iY2 < $iY1 Then
        $iTemp = $iY1
        $iY1 = $iY2
        $iY2 = $iTemp
    EndIf

    GUIDelete( $hRectangle_GUI)
    GUIDelete($hCross_GUI)
    DllClose($UserDLL)

    GUI02()

EndFunc   ;==>Mark_Rect
 
Решение

AZJIO

Меценат
Меценат
Сообщения
2,803
Репутация
1,165
Этой ссылки ещё нет:

Я помню на этом форуме ещё CreatoR выкладывал выделение жёлтым прямоугольником, найти не могу. Там отличие можно было двигать этот прямоугольник и изменять размеры, типа GUI со стилем $WS_EX_CONTROLPARENT. То есть сначала рисуем квадрат, но не сразу получаем координаты, а имеем возможность подкорректировать края края.
Я уже сделал вариант на PureBasic, хотелось подсмотреть готовое. Потом это можно было бы использовать для скриншотера или для распознавания текста, кстати последнее подсмотрено у autohotkey. Windows 10 уже имеет встроенную поддержку распознавания (можете попробовать), далеко не идеальную, но всё же.
 
Верх