Что нового

Перемещение картинки вслед за окном программы

lixar21

Новичок
Сообщения
70
Репутация
0
Добрый вечер, знатоки Autoit.
Помогите с непростым вопросом.

Мой скрипт выводит картинку - в определенных координатах в отношении уже открытого окна программы Paint.
Я пытаюсь заставить эту картинку - перемещаться вместе с окном Paint, то есть как бы привязать картинку к окну Paint.
Код:
#Include <GDIPlus.au3>

_GDIPlus_Startup()

$CurImage = _GDIPlus_ImageLoadFromFile('test.jpg')
$sCLSID = _GDIPlus_EncodersGetCLSID("jpg")
$NewSizeW = Round((_GDIPlus_ImageGetWidth($CurImage) * 300) / _GDIPlus_ImageGetHeight($CurImage))

$NewImage = _GDIPlus_BitmapCreateFromScan0($NewSizeW, 300, _GDIPlus_ImageGetPixelFormat($CurImage)[0])
$hGraphics = _GDIPlus_ImageGetGraphicsContext($NewImage)
_GDIPlus_GraphicsSetInterpolationMode($hGraphics, 7)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $CurImage, 0, 0, _GDIPlus_ImageGetWidth($CurImage), _GDIPlus_ImageGetHeight($CurImage), 0, 0, $NewSizeW, 300)
_GDIPlus_GraphicsDispose($hGraphics)

If FileExists("Resized.jpg") Then FileRecycle("Resized.jpg")
$tParams = _GDIPlus_ParamInit(1)
$tData = DllStructCreate("int Quality")
DllStructSetData($tData, "Quality", 100)
$pData = DllStructGetPtr($tData)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
$pParams = DllStructGetPtr($tParams)
_GDIPlus_ImageSaveToFileEx($NewImage, "Resized.jpg", $sCLSID, DllStructGetPtr($tParams))
_GDIPlus_ImageDispose($CurImage)
_GDIPlus_ImageDispose($NewImage)

$hImage = _GDIPlus_ImageLoadFromFile("Resized.jpg")
$W2 = _GDIPlus_ImageGetWidth($hImage)
$H2 = _GDIPlus_ImageGetHeight($hImage)
_GDIPlus_ImageDispose($hImage)

_GDIPlus_Shutdown()


$X = -1
$Y = -1
$aPos = WinGetPos("[RegexpTitle: - Paint]")
If IsArray($aPos) Then
  $X = $aPos[0] + 100
  $Y = $aPos[1] + 200
EndIf


SplashImageOn('', @ScriptDir & '\Resized.jpg', $W2, $H2, $X, $Y)

Local $hW1 = WinGetHandle("[RegexpTitle: - Paint]")
Local $hW2 = WinGetHandle("[CLASS:Static; INSTANCE:1]", "")
Local $gp1 = WinGetPos($hW1)
Local $gp2 = WinGetPos($hW2)
Local $tX = $gp1[0], $tY = $gp1[1]
WinMove($hW2, '', $tX, $tY)
WinSetOnTop($hW2, '', 1)
Local $wtop
While 1
    $gp1 = WinGetPos($hW1)
    If Not @error Then
        If $tX <> $gp1[0] Or $tY <> $gp1[1] Then
            $tX = $gp1[0]
            $tY = $gp1[1]
            WinMove($hW2, '', $tX, $tY)
        EndIf
    EndIf
    Sleep(10)
	 If WinActive($hW1) Then
        WinSetOnTop($hW2, '', 1)
    Else
        WinSetOnTop($hW2, '', 0)
    EndIf
WEnd

Sleep(300)
Подобное перемещение картинки вроде бы - может делать код:
Код:
Local $hW1 = WinGetHandle("[RegexpTitle: - Paint]")
Local $hW2 = WinGetHandle("[CLASS:Static; INSTANCE:1]", "")
Local $gp1 = WinGetPos($hW1)
Local $gp2 = WinGetPos($hW2)
Local $tX = $gp1[0], $tY = $gp1[1]
WinMove($hW2, '', $tX, $tY)
WinSetOnTop($hW2, '', 1)
Local $wtop
While 1
    $gp1 = WinGetPos($hW1)
    If Not @error Then
        If $tX <> $gp1[0] Or $tY <> $gp1[1] Then
            $tX = $gp1[0]
            $tY = $gp1[1]
            WinMove($hW2, '', $tX, $tY)
        EndIf
    EndIf
    Sleep(10)
	 If WinActive($hW1) Then
        WinSetOnTop($hW2, '', 1)
    Else
        WinSetOnTop($hW2, '', 0)
    EndIf
WEnd
Но что-то не получается.

Подскажите - как заставить выводимую в относительных координатах картинку - привязаться к окну программы Пайнт ?
(то есть - если я передвину окно Пайнт, то и картинка - тут же передвинется за ним)
 

Вложения

  • 1.rar
    86.6 КБ · Просмотры: 5

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Код:
#Include <GDIPlus.au3>
#include <Misc.au3>

AdlibRegister("_move_if_paint_move",250)

_GDIPlus_Startup()

$CurImage = _GDIPlus_ImageLoadFromFile('test.jpg')
$sCLSID = _GDIPlus_EncodersGetCLSID("jpg")
$NewSizeW = Round((_GDIPlus_ImageGetWidth($CurImage) * 300) / _GDIPlus_ImageGetHeight($CurImage))

$NewImage = _GDIPlus_BitmapCreateFromScan0($NewSizeW, 300, _GDIPlus_ImageGetPixelFormat($CurImage)[0])
$hGraphics = _GDIPlus_ImageGetGraphicsContext($NewImage)
_GDIPlus_GraphicsSetInterpolationMode($hGraphics, 7)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $CurImage, 0, 0, _GDIPlus_ImageGetWidth($CurImage), _GDIPlus_ImageGetHeight($CurImage), 0, 0, $NewSizeW, 300)
_GDIPlus_GraphicsDispose($hGraphics)

If FileExists("Resized.jpg") Then FileRecycle("Resized.jpg")
$tParams = _GDIPlus_ParamInit(1)
$tData = DllStructCreate("int Quality")
DllStructSetData($tData, "Quality", 100)
$pData = DllStructGetPtr($tData)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
$pParams = DllStructGetPtr($tParams)
_GDIPlus_ImageSaveToFileEx($NewImage, "Resized.jpg", $sCLSID, DllStructGetPtr($tParams))
_GDIPlus_ImageDispose($CurImage)
_GDIPlus_ImageDispose($NewImage)

$hImage = _GDIPlus_ImageLoadFromFile("Resized.jpg")
$W2 = _GDIPlus_ImageGetWidth($hImage)
$H2 = _GDIPlus_ImageGetHeight($hImage)
_GDIPlus_ImageDispose($hImage)

_GDIPlus_Shutdown()


$X = -1
$Y = -1
$aPos = WinGetPos("[RegexpTitle: - Paint]")
If IsArray($aPos) Then
  $X = $aPos[0] + 100
  $Y = $aPos[1] + 200
EndIf

SplashImageOn('', @ScriptDir & '\Resized.jpg', $W2, $H2, $X, $Y)

Local $hW1 = WinGetHandle("[RegexpTitle: - Paint]")
Local $hW2 = WinGetHandle("[CLASS:Static; INSTANCE:1]", "")
Local $gp1 = WinGetPos($hW1)
Local $gp2 = WinGetPos($hW2)
Local $tX = $gp1[0], $tY = $gp1[1]
WinMove($hW2, '', $tX, $tY)
WinSetOnTop($hW2, '', 1)
Local $wtop

While 1
    $gp1 = WinGetPos($hW1)
    If Not @error Then
        If $tX <> $gp1[0] Or $tY <> $gp1[1] Then
            $tX = $gp1[0]
            $tY = $gp1[1]
            WinMove($hW2, '', $tX, $tY)
        EndIf
    EndIf
    Sleep(10)
	 If WinActive($hW1) Then
        WinSetOnTop($hW2, '', 1)
    Else
        WinSetOnTop($hW2, '', 0)
    EndIf
WEnd

Sleep(300)

Func _move_if_paint_move()
	If _IsPressed(01) Then
		$gp3 = WinGetPos($hW1)
		If $gp3[0] <> $gp1[0] Or $gp3[1] <> $gp1[1] Then
			SplashOff()

			$aPos = WinGetPos("[RegexpTitle: - Paint]")
			If IsArray($aPos) Then
				$X = $aPos[0] + 100
				$Y = $aPos[1] + 200
			EndIf

			SplashImageOn('', @ScriptDir & '\Resized.jpg', $W2, $H2, $X, $Y)

			$gp1 = $gp3
		EndIf
	EndIf
EndFunc
 
Автор
L

lixar21

Новичок
Сообщения
70
Репутация
0
Dima1337, почему-то работает не при каждом перемещении, а примерно - при каждом втором.
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Возможно вы передвигаете окно слишком быстро отпуская лкм.
Сделайте таймер меньше:
Код:
#Include <GDIPlus.au3>
#include <Misc.au3>

AdlibRegister("_move_if_paint_move",10)

_GDIPlus_Startup()

$CurImage = _GDIPlus_ImageLoadFromFile('test.jpg')
$sCLSID = _GDIPlus_EncodersGetCLSID("jpg")
$NewSizeW = Round((_GDIPlus_ImageGetWidth($CurImage) * 300) / _GDIPlus_ImageGetHeight($CurImage))

$NewImage = _GDIPlus_BitmapCreateFromScan0($NewSizeW, 300, _GDIPlus_ImageGetPixelFormat($CurImage)[0])
$hGraphics = _GDIPlus_ImageGetGraphicsContext($NewImage)
_GDIPlus_GraphicsSetInterpolationMode($hGraphics, 7)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $CurImage, 0, 0, _GDIPlus_ImageGetWidth($CurImage), _GDIPlus_ImageGetHeight($CurImage), 0, 0, $NewSizeW, 300)
_GDIPlus_GraphicsDispose($hGraphics)

If FileExists("Resized.jpg") Then FileRecycle("Resized.jpg")
$tParams = _GDIPlus_ParamInit(1)
$tData = DllStructCreate("int Quality")
DllStructSetData($tData, "Quality", 100)
$pData = DllStructGetPtr($tData)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
$pParams = DllStructGetPtr($tParams)
_GDIPlus_ImageSaveToFileEx($NewImage, "Resized.jpg", $sCLSID, DllStructGetPtr($tParams))
_GDIPlus_ImageDispose($CurImage)
_GDIPlus_ImageDispose($NewImage)

$hImage = _GDIPlus_ImageLoadFromFile("Resized.jpg")
$W2 = _GDIPlus_ImageGetWidth($hImage)
$H2 = _GDIPlus_ImageGetHeight($hImage)
_GDIPlus_ImageDispose($hImage)

_GDIPlus_Shutdown()


$X = -1
$Y = -1
$aPos = WinGetPos("[RegexpTitle: - Paint]")
If IsArray($aPos) Then
  $X = $aPos[0] + 100
  $Y = $aPos[1] + 200
EndIf

$win = SplashImageOn('', @ScriptDir & '\Resized.jpg', $W2, $H2, $X, $Y)

Local $hW1 = WinGetHandle("[RegexpTitle: - Paint]")
Local $hW2 = WinGetHandle("[CLASS:Static; INSTANCE:1]", "")
Local $gp1 = WinGetPos($hW1)
Local $gp2 = WinGetPos($hW2)
Local $tX = $gp1[0], $tY = $gp1[1]
WinMove($hW2, '', $tX, $tY)
WinSetOnTop($hW2, '', 1)
Local $wtop

While 1
    $gp1 = WinGetPos($hW1)
    If Not @error Then
        If $tX <> $gp1[0] Or $tY <> $gp1[1] Then
            $tX = $gp1[0]
            $tY = $gp1[1]
            WinMove($hW2, '', $tX, $tY)
        EndIf
    EndIf
    Sleep(10)
     If WinActive($hW1) Then
        WinSetOnTop($hW2, '', 1)
    Else
        WinSetOnTop($hW2, '', 0)
    EndIf
WEnd

Sleep(300)

Func _move_if_paint_move()
    If _IsPressed(01) Then
        $gp3 = WinGetPos($hW1)
        If $gp3[0] <> $gp1[0] Or $gp3[1] <> $gp1[1] Then

            $aPos = WinGetPos("[RegexpTitle: - Paint]")
            If IsArray($aPos) Then
                $X = $aPos[0] + 100
                $Y = $aPos[1] + 200
            EndIf

			WinMove('[CLASS:AutoIt v3]','',$X, $Y)

            $gp1 = $gp3
        EndIf
    EndIf
EndFunc

или:
Код:
#Include <GDIPlus.au3>
#include <Misc.au3>

_GDIPlus_Startup()

$CurImage = _GDIPlus_ImageLoadFromFile('test.jpg')
$sCLSID = _GDIPlus_EncodersGetCLSID("jpg")
$NewSizeW = Round((_GDIPlus_ImageGetWidth($CurImage) * 300) / _GDIPlus_ImageGetHeight($CurImage))

$NewImage = _GDIPlus_BitmapCreateFromScan0($NewSizeW, 300, _GDIPlus_ImageGetPixelFormat($CurImage)[0])
$hGraphics = _GDIPlus_ImageGetGraphicsContext($NewImage)
_GDIPlus_GraphicsSetInterpolationMode($hGraphics, 7)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $CurImage, 0, 0, _GDIPlus_ImageGetWidth($CurImage), _GDIPlus_ImageGetHeight($CurImage), 0, 0, $NewSizeW, 300)
_GDIPlus_GraphicsDispose($hGraphics)

If FileExists("Resized.jpg") Then FileRecycle("Resized.jpg")
$tParams = _GDIPlus_ParamInit(1)
$tData = DllStructCreate("int Quality")
DllStructSetData($tData, "Quality", 100)
$pData = DllStructGetPtr($tData)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
$pParams = DllStructGetPtr($tParams)
_GDIPlus_ImageSaveToFileEx($NewImage, "Resized.jpg", $sCLSID, DllStructGetPtr($tParams))
_GDIPlus_ImageDispose($CurImage)
_GDIPlus_ImageDispose($NewImage)

$hImage = _GDIPlus_ImageLoadFromFile("Resized.jpg")
$W2 = _GDIPlus_ImageGetWidth($hImage)
$H2 = _GDIPlus_ImageGetHeight($hImage)
_GDIPlus_ImageDispose($hImage)

_GDIPlus_Shutdown()


$X = -1
$Y = -1
$aPos = WinGetPos("[RegexpTitle: - Paint]")
If IsArray($aPos) Then
  $X = $aPos[0] + 100
  $Y = $aPos[1] + 200
EndIf

SplashImageOn('', @ScriptDir & '\Resized.jpg', $W2, $H2, $X, $Y)

Local $hW1 = WinGetHandle("[RegexpTitle: - Paint]")
Local $hW2 = WinGetHandle("[CLASS:Static; INSTANCE:1]", "")
Local $gp1 = WinGetPos($hW1)
Local $gp2 = WinGetPos($hW2)
Local $tX = $gp1[0], $tY = $gp1[1]
WinMove($hW2, '', $tX, $tY)
WinSetOnTop($hW2, '', 1)
Local $wtop

While 1
    $gp1 = WinGetPos($hW1)
    If Not @error Then
        If $tX <> $gp1[0] Or $tY <> $gp1[1] Then
            $tX = $gp1[0]
            $tY = $gp1[1]
            WinMove($hW2, '', $tX, $tY)
        EndIf
    EndIf
    Sleep(10)
     If WinActive($hW1) Then
        WinSetOnTop($hW2, '', 1)
    Else
        WinSetOnTop($hW2, '', 0)
    EndIf
	
	#Region NEW
	
	If _IsPressed(01) Then
		While _IsPressed(01)
			Sleep(10)
		WEnd
			$gp3 = WinGetPos($hW1)
			If $gp3[0] <> $gp1[0] Or $gp3[1] <> $gp1[1] Then

				$aPos = WinGetPos("[RegexpTitle: - Paint]")
				If IsArray($aPos) Then
					$X = $aPos[0] + 100
					$Y = $aPos[1] + 200
				EndIf

				WinMove('[CLASS:AutoIt v3]','',$X, $Y)

				$gp1 = $gp3
			EndIf
	EndIf
	
	#EndRegion NEW
	
WEnd

Sleep(300)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
lixar21, зачем использовать GDI? если можно создать окно без заголовка и поместить в него картинку. потом двигать это окно
 
Автор
L

lixar21

Новичок
Сообщения
70
Репутация
0
joiner сказал(а):
lixar21, зачем использовать GDI? если можно создать окно без заголовка и поместить в него картинку. потом двигать это окно

Я просто не знаю как создать подобное беззаголовочное окно.
Думал, что это невозможно.
А не подскажете - как использовать подобное окно в моем коде ?
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
lixar21 сказал(а):
А не подскажете - как использовать подобное окно в моем коде ?

Наверное joiner имеет ввиду это

Код:
Global $x = 0, $y = 0

SplashImageOn('', @ScriptDir & '\Test.jpg', 100, 100, $x, $y, 1)

While 1
	$x = $x + 1
	$y = $y + 1
	WinMove('[CLASS:AutoIt v3]','',$x,$y)
	Sleep(100)
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
попробуй так
перемещаешь окно Paint, будет перемещаться окно скрипта с картинкой. координаты и размеры подставь свои
Код:
#include <WindowsConstants.au3>
HotKeySet('{ESC}', '_exit')
Local $hW2 = WinGetHandle('[Class:MSPaintApp]')
If @error Then Exit
Local $hW1 = GUICreate('', 300, 300, 1, 1, $WS_POPUP)
Local $pic = GUICtrlCreatePic(@ScriptDir & '\test.jpg', 0, 0, 300, 300)
GUISetState()
Local $gp1 = WinGetPos($hW1)
Local $gp2 = WinGetPos($hW2)
Local $tX = $gp2[0] - 300, $tY = $gp2[1]
WinMove($hW1, '', $tX, $tY)

While 1
	$gp2 = WinGetPos($hW2)
	If Not @error Then
		If $tX <> ($gp2[0] - 300) Or $tY <> $gp2[1] Then
			$tX = $gp2[0] - 300
			$tY = $gp2[1]
			WinMove($hW1, '', $tX, $tY)
		EndIf
	Else
		Exit
	EndIf
	Sleep(10)
WEnd

Func _exit()
	Exit
EndFunc   ;==>_exit
 
Автор
L

lixar21

Новичок
Сообщения
70
Репутация
0
Dima1337 , joiner - теперь буду знать.
Спасибо за ответы.
 
Верх