Что нового

[Элементы GUI] Работа с картинкой в окне GUI

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Я открываю в окне GUI картинку, которая размером больше чем окно GUI (вообще-то она больше чем экран).


На форуме нашел вот такой код, ну и взял его за основу.
Код:
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>

; Create GUI
$hGUI = GUICreate("карта", 660, 367)
GUISetState()
_GDIPlus_StartUp()

$hImageLoaded   = _GDIPlus_ImageLoadFromFile("C:\...\map.JPG")
$iWidth = _GDIPlus_ImageGetWidth($hImageLoaded)
$iHeight = _GDIPlus_ImageGetHeight($hImageLoaded)
$hImageInGUI = _GDIPlus_BitmapCloneArea($hImageLoaded, $iWidth-661, $iHeight-340, 661, 326); Картинка внутри GUI

$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImageInGUI, 0, 0) ;Показать картинку в GUI

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
         Case $GUI_EVENT_CLOSE
            Exit
     EndSwitch
WEnd

_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ShutDown()


Теперь чтобы нормально работать с картинкой мне нужны скролбары. Подскажите как их сделать.

И, собственно, основная задача: кликнув мышкой по отображаемой в GUI части картинки, мне нужно получить координаты этого пикселя относительно самой картинки.
У кого есть идеи как найти эти числа?
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Нарыл тут вот такую тему
http://autoit-script.ru/index.php/topic,7946.0.html

Весьма простой код
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>

$oIE = _IECreateEmbedded ()

GUICreate("", -1, -1,-1, -1)
GUICtrlCreateObj($oShell, 50, 50, 300, 200)
_IENavigate ($oIE,'http://ya.ru')

GUISetState()

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd


Сразу видно что скрол-бары есть. ;D
Как теперь в качестве объекта поставить картинку?
Пробую разные варианты, но пока не получается.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
C2H5OH
Что-то ничего непонятно - а предыдущий код у меня с какой-то ошибкой вываливается...

Нужен объект IE, показываающий картинку со скроллбарами?
Вот немного измененный пример, не оно?

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Example()

Func Example()
    Local $oIE, $GUIActiveX, $GUI_Button_Back, $GUI_Button_Forward
    Local $GUI_Button_Home, $GUI_Button_Stop, $msg
    $oIE = ObjCreate("Shell.Explorer.2")
   GUICreate("Embedded Web control Test", 300, 300, 1, 1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS, $WS_CLIPCHILDREN))
    $GUIActiveX = GUICtrlCreateObj ($oIE, 0, 0, 250, 250)
GUISetState()

    $oIE.navigate(@ScriptDir&"\test.jpg")


    While 1
        $msg = GUIGetMsg()

        Select
            Case $msg = $GUI_EVENT_CLOSE
                ExitLoop

        EndSelect
        
    WEnd

    GUIDelete()
EndFunc
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
WSWR,
в GUI нужно отобразить картинку размером больше чем окно GUI. Не сжимать картинку, а отбразить её со скрол-барами.
Следующий этап - по клику мышкой по отображаемой части картинки нужно получить координаты пикселя относительно самой картинки.
То есть вариант отображения в GUI окна IE в котором открыта картинка мне не очень подходит, потому что само окно IE будет мешать на 2-ом этапе. Мне нужно чтобы в рамке GUI прокручивалась картинка в чистом виде, а не в окне другого приложения.


А первый пример у тебя не работал, наверное, потому что ты путь к картине не поставил.
Вот тут
Код:
$hImageLoaded   = _GDIPlus_ImageLoadFromFile("C:\...\map.JPG")
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
C2H5OH
Вот код на основе примера экранной лупы с этого же форума.
Рисует кусок картинки в зависимости от положения курсора в дочернем окне, которое в свою очередь, "закреплено" внутри родительского(такой вариант вроде позволяет произвольно размещать картинку на главном окне, без дочернего у меня нормально не получилось).
По идее, можно взять слидеры и сделать прокрутку зависимой от них, как-то так.

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <GUIConstants.au3>
#include <WinAPI.au3>

Dim $coord[2], $oldCoord[2], $hBit, $hGraph, $side = 600, $zoom = 1, $desk = WinGetPos("Program Manager")

$hGUI = GUICreate("Example", 600, 600, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
$h_cGUI = GUICreate("Child GUI", 500, 500, 50, 50, $WS_CHILD, $WS_EX_CLIENTEDGE, $hGUI)		
GUISetState()
GUISwitch($hGUI)
GUISetState()
	
_GDIPlus_Startup()
$hBit = _GDIPlus_ImageLoadFromFile(@ScriptDir&"\test.jpg")

While 1
		$GUIMsg = GUIGetMsg()

		Switch $GUIMsg
			Case $GUI_EVENT_CLOSE
				ExitLoop
		EndSwitch
$coord = MouseGetPos()
    If $coord[0] <> $oldCoord[0] Or $coord[1] <> $oldCoord[1]  Then
        $oldCoord = $coord
        ;_GDIPlus_GraphicsDispose($hGraph)
        ;_GDIPlus_ImageDispose($hBit)
        ;_WinAPI_DeleteObject($pict)
        
		$hImageInGUI = _GDIPlus_BitmapCloneArea($hBit, $coord[0] - $side/2, $coord[1] - $side/2, $coord[0] + $side/2, $coord[1] + $side/2)
		$hGraph = _GDIPlus_GraphicsCreateFromHWND($h_cGUI)
        _GDIPlus_GraphicsDrawImageRectRect($hGraph, $hImageInGUI, 0, 0, $side, $side, 1, 1, $side*$zoom, $side*$zoom)
        
		If $coord[0] > $desk[2] - $side*($zoom + 0.5) - 2 Then $coord[0] = $coord[0] - $side*$zoom - $side - 2
        If $coord[1] > $desk[3] - $side*($zoom + 0.5) - 2 Then $coord[1] = $coord[1] - $side*$zoom - $side - 2        
    EndIf
    Sleep(10)
WEnd
_GDIPlus_Shutdown()
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Спасибо!
От двух GUI отказался, так как возникли сложности с определеним координат мыши при кликаньи по карте (координаты давало два раза относительно обоих GUI).
А так всё что хотел получилось. Вот результат
http://autoit-script.ru/index.php/topic,11104.msg73249.html#msg73249
;D
 
Верх