Что нового

[Элементы GUI] Как в лупе отобразить курсор или выделить пиксель под курсором

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
В этой теме http://autoit-script.ru/index.php/topic,4710.msg34075.html#msg34075 многоуважаемый пользователь AZJIO выложил свой скрипт с лупой , из всех похожих скриптов ИМХО этот самый функциональный и легко интегрируемый, за что ему ->AZJIO нижайший поклон :beer:. Но столкнулся с потребностью навести мышку руками и прицелиться в пиксель , а в лупе не отображается курсор(понимаю что этот скрипт предназначен для других целей) но все таки подскажите как в этом скрипте заставить отображаться курсор , а в идеале прикрутить к нему прицел с выделением текущего пикселя. скрипт для удобства в спойлере.
Код:
; Добавил управление горячими клавишами
; Колёсико мыши - только регулировка увеличения
; Ctrl+Колёсико мыши - регулировка увеличения и размера лупы
; Shift+Колёсико мыши - только изменение размера лупы

; http://www.autoitscript.com/forum/index.php?showtopic=24154&view=findpost&p=168674
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
; Global Const $WM_MOUSEWHEEL = 0x020A
HotKeySet("{ESC}", "_Quit")
GUIRegisterMsg(0x020A , "WM_MOUSEWHEEL")

; установка параметров
Global $MagZoom = 4
Global $MagWidth = $MagZoom*10
Global $MagHeight =$MagZoom*10
Global $LastWidth = $MagWidth*$MagZoom
Global $LastHeight =$MagHeight*$MagZoom
Global $LastZoom, $Tr1=1
; $d = Int($MagWidth/2 + 5)

; Global $SRCCOPY = 0x00CC0020
Global $dll[3], $DeskHDC, $GUIHDC

$dll[1] = DllOpen ( "user32.dll")
$dll[2] = DllOpen ( "gdi32.dll")

Global $GUI = GUICreate ("Zoom x2 Au3", $MagWidth * $MagZoom, $MagHeight * $MagZoom, _
    MouseGetPos (0), MouseGetPos (1), $WS_POPUP+$WS_BORDER, $WS_EX_TOPMOST)

GUISetState(@SW_SHOW)

Global $LastPos[2] = [0,0]

While 1
    $MousePos = MouseGetPos() ; получаем координаты мыши
    If $LastPos[0] <> $MousePos[0] Or $LastPos[1] <> $MousePos[1] Or $Tr1=1 Then ; если позиция мыши и зум изменилась, то выполняем перемещение
        WinMove("Zoom x2 Au3", "", $MousePos[0] + $MagWidth/2 + 5, $MousePos[1], $MagWidth * $MagZoom, $MagHeight * $MagZoom)
        $LastPos[0] = $MousePos[0] ; и темпируем координаты и зум
        $LastPos[1] = $MousePos[1]
        $LastZoom = $MagZoom
        $Tr1=0
        MAG()
    EndIf
    Sleep(10)
WEnd

Func MAG()
    $DeskHDC = DLLCall("user32.dll","int","GetDC","hwnd",0)
    $GUIHDC = DLLCall("user32.dll","int","GetDC","hwnd",$GUI)
    If Not @error Then ; если без ошибок открыли DLL, то
        DLLCall("gdi32.dll", "int", "StretchBlt", "int", $GUIHDC[0], "int", _
            0, "int", 0, "int", $MagWidth * $MagZoom, "int", $MagHeight * $MagZoom, "int", $DeskHDC[0], "int", _
            MouseGetPos (0) - $MagWidth/2, "int", MouseGetPos (1) - $MagHeight/2, "int", $MagWidth ,"int", $MagHeight, _
            "long", $SRCCOPY)
        DLLCall("user32.dll","int","ReleaseDC","int",$DeskHDC[0],"hwnd",0)
        DLLCall("user32.dll","int","ReleaseDC","int",$GUIHDC[0],"hwnd",$GUI)
    EndIf
    ; размер ящика выходного и координаты ящика сканирования
EndFunc

Func WM_MOUSEWHEEL($hWndGui, $MsgId, $wParam, $lParam)
    If $MsgId = $WM_MOUSEWHEEL Then
        $KeysHeld = BitAND($wParam, 0xFFFF) ; нажатый модификатор
        $direction = BitShift($wParam, 16)
        ; $X = BitShift($lParam, 16) ; координаты мыши
        ; $Y = BitAND($lParam, 0xFFFF)
       
        If $direction > 0 Then
            $MagZoom += 1
        Else
            $MagZoom -= 1
        EndIf
        If $MagZoom < 2 Then $MagZoom = 2

        Switch $KeysHeld
            Case 0 ; ничего
                $MagWidth = $LastWidth/$MagZoom
                $MagHeight =$LastHeight/$MagZoom
            Case 4 ; Shift
                If $direction > 0 Then
                    $LastWidth = $MagWidth*$MagZoom
                    $LastHeight =$MagHeight*$MagZoom
                   
                    $MagZoom -= 2
                   
                    $MagWidth = $LastWidth/$MagZoom
                    $MagHeight =$LastHeight/$MagZoom
                Else
                    $LastWidth = $MagWidth*$MagZoom
                    $LastHeight =$MagHeight*$MagZoom
                   
                    $MagZoom += 2
                   
                    $MagWidth = $LastWidth/$MagZoom
                    $MagHeight =$LastHeight/$MagZoom
                EndIf              
                $MagZoom=$LastZoom
            Case 8 ; Ctrl
                $LastWidth = $MagWidth*$MagZoom
                $LastHeight =$MagHeight*$MagZoom
        EndSwitch
        $Tr1=1
    EndIf
EndFunc

Func _Quit()
    DllClose ( $dll[1] )
    DllClose ( $dll[2] )
    Exit
EndFunc
очень рассчитываю на помощь разработчика...
 

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
general66

Добавлено перемещение стрелками для точного наведения
Добавлено информационная панелька с отображаемым цветом и в цифре
Пока не удалось точно устанавливать прицел после масштабирования, возможно несовпадение +/- пиксель.

Код:
; greenmachine
; http://www.autoitscript.com/forum/topic/24154-au3-zoom/page__p__168674#entry168674

; Модификация AZJIO
; Добавил управление горячими клавишами
; Колёсико мыши - только регулировка увеличения
; Ctrl+Колёсико мыши - регулировка увеличения и размера лупы
; Shift+Колёсико мыши - только изменение размера лупы
; стрелки двигают курсор
; Добавил прицел, и отображение цвета

#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>
HotKeySet("{ESC}", "_Quit")
GUIRegisterMsg($WM_MOUSEWHEEL, "WM_MOUSEWHEEL")
Opt("GUIResizeMode", 802)
Opt("GUIOnEventMode", 1)

; установка параметров
Global $Zoom = 4
Global $CaptureWidth = $Zoom * 10
Global $CaptureHeight = $Zoom * 10
Global $GuiWidth = $CaptureWidth * $Zoom
Global $GuiHeight = $CaptureHeight * $Zoom
Global $LastZoom, $Tr1 = 1
; $d = Int($CaptureWidth/2 + 5)

; Global $SRCCOPY = 0x00CC0020
Global $dll[3], $DeskHDC, $hGuiHDC

$dll[1] = DllOpen("user32.dll")
$dll[2] = DllOpen("gdi32.dll")

Global $LastPos = MouseGetPos()
Sleep(10)

Global $hGui = GUICreate("Zoom", $CaptureWidth * $Zoom, $CaptureHeight * $Zoom, $LastPos[0], $LastPos[1], $WS_POPUP + $WS_BORDER, $WS_EX_TOPMOST, WinGetHandle(AutoItWinGetTitle()))

GUISetState(@SW_SHOW, $hGui)

Global $hGuiClr = GUICreate("c", 160, 19, $LastPos[0], $LastPos[1], $WS_POPUP + $WS_BORDER, -1, $hGui)
$iLbClr = GUICtrlCreateLabel('', -2, -2, 20, 20, $WS_BORDER)
$iStrClr = GUICtrlCreateLabel('', 17, -2, 142, 20, $SS_CENTERIMAGE + $SS_CENTER + $WS_BORDER)

$iL = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Arrow_Left")
$iR = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Arrow_Right")
$iT = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Arrow_Up")
$iB = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Arrow_Down")
Dim $AccelKeys[4][2] = [["{LEFT}", $iL],["{RIGHT}", $iR],["{UP}", $iT],["{DOWN}", $iB]]
GUISetAccelerators($AccelKeys)
GUISetState(@SW_SHOW, $hGuiClr)

Func _Arrow_Left()
	MouseMove($LastPos[0] - 1, $LastPos[1], 0)
EndFunc

Func _Arrow_Right()
	MouseMove($LastPos[0] + 1, $LastPos[1], 0)
EndFunc

Func _Arrow_Up()
	MouseMove($LastPos[0], $LastPos[1] - 1, 0)
EndFunc

Func _Arrow_Down()
	MouseMove($LastPos[0], $LastPos[1] + 1, 0)
EndFunc

$hPen = _WinAPI_CreatePen($PS_SOLID, 2, 0xFF) ; толщина и цвет (BGR) прицела

While 1
	$MousePos = MouseGetPos() ; получаем координаты мыши
	If $LastPos[0] <> $MousePos[0] Or $LastPos[1] <> $MousePos[1] Or $Tr1 = 1 Then ; если позиция мыши и зум изменилась, то выполняем перемещение
		WinMove($hGui, '', $MousePos[0] + $CaptureWidth / 2 + 5, $MousePos[1], $CaptureWidth * $Zoom, $CaptureHeight * $Zoom)
		WinMove($hGuiClr, '', $MousePos[0] + $CaptureWidth / 2 + 5, $MousePos[1], 160, 19)
		$LastPos[0] = $MousePos[0] ; и темпируем координаты и зум
		$LastPos[1] = $MousePos[1]
		$LastZoom = $Zoom
		$Tr1 = 0
		_gdi32_StretchBlt()
	EndIf
	Sleep(10)
WEnd


; $LastPos[0] + $CaptureWidth / 2 + 5 - X позиция окна
; $LastPos[1] - Y позиция окна

; $CaptureWidth * $Zoom - ширина окна
; $CaptureHeight * $Zoom - высота окна

; $LastPos[0] - $CaptureWidth / 2 - X фотографируемого участка
; $LastPos[1] - $CaptureHeight / 2 - Y фотографируемого участка

; $CaptureWidth - ширина участка
; $CaptureHeight - высота участка

Func _gdi32_StretchBlt()
	Local $Color, $DeskHDC, $hGuiHDC, $obj_orig, $x
	$DeskHDC = DllCall($dll[1], "int", "GetDC", "hwnd", 0)
	$hGuiHDC = DllCall($dll[1], "int", "GetDC", "hwnd", $hGui)
	If Not @error Then ; если без ошибок открыли DLL, то
		DllCall($dll[2], "int", "StretchBlt", "int", $hGuiHDC[0], "int", _
				0, "int", 0, "int", $CaptureWidth * $Zoom, "int", $CaptureHeight * $Zoom, "int", $DeskHDC[0], "int", _
				$LastPos[0] - Ceiling($CaptureWidth / 2), "int", $LastPos[1] - Ceiling($CaptureHeight / 2), "int", $CaptureWidth, "int", $CaptureHeight, _
				"long", $SRCCOPY)

		; Создание прицела
		$obj_orig = _WinAPI_SelectObject($DeskHDC[0], $hPen)
		$x = $LastPos[0] + $CaptureWidth / 2 + 5 + (Ceiling($CaptureWidth / 2)+1) * $Zoom
		_WinAPI_DrawLine($DeskHDC[0], $x, $LastPos[1] + $CaptureHeight * $Zoom - 3, $x, _
		$LastPos[1] + (Ceiling($CaptureHeight / 2)+1) * $Zoom) ; вертикальная линия, прицел

		$Color = PixelGetColor($LastPos[0], $LastPos[1])
		GUICtrlSetData($iStrClr, Hex(Int($Color), 6)&', z'&$Zoom&', x'&$LastPos[0]&', y'&$LastPos[1])
		GUICtrlSetBkColor($iLbClr, $Color)

		DllCall($dll[1], "int", "ReleaseDC", "int", $DeskHDC[0], "hwnd", 0)
		DllCall($dll[1], "int", "ReleaseDC", "int", $hGuiHDC[0], "hwnd", $hGui)
	EndIf
EndFunc

Func WM_MOUSEWHEEL($hWndGui, $MsgId, $wParam, $lParam)
	Local $direction, $KeysHeld
	$KeysHeld = BitAND($wParam, 0xFFFF) ; нажатый модификатор
	$direction = BitShift($wParam, 16)
	; $X = BitShift($lParam, 16) ; координаты мыши
	; $Y = BitAND($lParam, 0xFFFF)

	If $direction > 0 Then
		$Zoom += 1
	Else
		$Zoom -= 1
	EndIf
	If $Zoom < 2 Then $Zoom = 2

	Switch $KeysHeld
		Case 0 ; ничего
			$CaptureWidth = $GuiWidth / $Zoom
			$CaptureHeight = $GuiHeight / $Zoom
		Case 4 ; Shift
			If $direction > 0 Then
				$GuiWidth = $CaptureWidth * $Zoom
				$GuiHeight = $CaptureHeight * $Zoom

				$Zoom -= 2

				$CaptureWidth = $GuiWidth / $Zoom
				$CaptureHeight = $GuiHeight / $Zoom
			Else
				$GuiWidth = $CaptureWidth * $Zoom
				$GuiHeight = $CaptureHeight * $Zoom

				$Zoom += 2

				$CaptureWidth = $GuiWidth / $Zoom
				$CaptureHeight = $GuiHeight / $Zoom
			EndIf
			$Zoom = $LastZoom
		Case 8 ; Ctrl
			$GuiWidth = $CaptureWidth * $Zoom
			$GuiHeight = $CaptureHeight * $Zoom
	EndSwitch
	$Tr1 = 1
EndFunc

Func _Quit()
	DllClose($dll[1])
	DllClose($dll[2])
	Exit
EndFunc

А это я уже делаю свою утилиту Zoom
 
Автор
G

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
AZJIO

Огромное СПАСИБО :beer: наконец то сбылась мечта .... Работает отлично, управление клавишами самое оно, вечером буду наслаждаться :whistle:


Добавлено:
Сообщение автоматически объединено:

AZJIO [?]
А это я уже делаю свою утилиту Zoom

:shok: вечером буду пробовать, с сохранением результатов мм.. загляденье, регулировка насыщенности яркости тона - нет слов , буду ждать релиза ;) и ридми с описанием полного функционала.



Добавлено:
Сообщение автоматически объединено:

вопрос параметр shade-variation в PixelSearch это яркость у Вас в настройках?
 
Верх