Что нового

[Элементы GUI] Наслаивание одной картинки на другую при перемещении, передний, задний план

Статус
Закрыто для дальнейших ответов.

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
mmsgeorge
как определить, что за картинка, под той которую перемещаю
Код:
GUIGetCursorInfo($GUI)[4]
Покажет самую нижнюю картинку в точке мыши или себя, если под ней ничего нет (картинка фона не считается - она заблокирована).
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
InnI
создал тему http://autoit-script.ru/index.php?topic=21774.msg127821#msg127821
к сожалению сделал не через твой вариант добавление фото, как теперь подстроить твой метод узнавания что под картинкой при перемещении под мое,не знаю, эхх


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

InnI
В моем случае картинки, тоже отключаются, если не отключать, приобретают,окрас фона за ними.
Код:
$ID = GUICtrlCreatePic($KV, $Informaciya_okna[0], $Informaciya_okna[1], $informaciya_objekta[2], $informaciya_objekta[3])
GUICtrlSetState(-1,$GUI_DISABLE)



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

InnI
еще заметил такую штуку, что . что в твоем варианте, что в варианте joiner, если изменить размеры картинки, а потом вернуть обратно, съезжает все куда то. как исправить? или как менять размеры картинки, чтобы не съезжала потом фотка, или так сказать текстура
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
mmsgeorge
если изменить размеры картинки, а потом вернуть обратно, съезжает все куда. как исправить?
Это всё - слова. Как вы меняете размеры, как возвращаете, что из себя представляет картинка и чем она отличается от фотки? Всё это может влиять на конечный результат.

Лучше всего создайте новую тему с рабочим примером. А там... может кто и разберётся.
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
InnI
ну попробуй в своем варианте изменить размеры командой GUICtrlSetPos ( $aPics[1] -1 ,-1,59,59)
Кстати решается у joiner , если просто включить , выключить картинку, в твоем варианте не получилось
Код:
GUICtrlSetState(-1,$GUI_ENABLE)
GUICtrlSetState(-1,$GUI_DISABLE)



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

joiner
Оказывается, не обязательно удалять и пересоздавать картинку, хватает лишь, по новой одеть шкурку GUICtrlSetImage, ;)
Код:
While 1
    If _IsPressed('01', $hDLL) Then

        $aInfo = GUIGetCursorInfo($Form1)

            If $oDict.Exists($aInfo[4]) Then
                $ID = $aInfo[4]
                $KV = $oDict.Item($ID)

                $PC = ControlGetPos($Form1, '', $ID)
                $XD = $aInfo[0] - $PC[0]
                $YD = $aInfo[1] - $PC[1]
                GUICtrlSetImage($ID ,$KV)
                While _IsPressed('01', $hDLL)
					 $aInfo = GUIGetCursorInfo($Form1)
					If  $XDD<>$aInfo[0] or $YDD<> $aInfo[1] then
                    GUICtrlSetPos($ID, $XDD, $YDD, $PC[2], $PC[3])
                    $aInfo = GUIGetCursorInfo($Form1)

                    $XDD = $aInfo[0] - $XD
                    $YDD = $aInfo[1] - $YD
					Else
                  Sleep(6)
                     EndIf
                WEnd
            EndIf
    EndIf
    Sleep(1)
	WEnd

и чтобы не было мельтешения при клике еще можно сделать такую задержку
Код:
If  $XDD<>$aInfo[0] or $YDD<> $aInfo[1] then
                   GUICtrlSetPos($ID, $XDD, $YDD, $PC[2], $PC[3])
                    $aInfo = GUIGetCursorInfo($Form1)

                    $XDD = $aInfo[0] - $XD
                    $YDD = $aInfo[1] - $YD
Else
                    Sleep(6)
EndIf
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
mmsgeorge
изменить размеры командой GUICtrlSetPos
Похоже, вы так ничего и не поняли :(
В моём примере для каждой картинки создаётся своё собственное дочернее окно. Когда вы уменьшаете картинку - вы видите её окно. Следовательно, нужно дополнительно изменять размеры дочернего окна картинки. Другой вариант, установить картинкам автоизменение размеров. Тогда при изменении размеров дочернего окна картинки, будет пропорционально "искажаться" и сама картинка
Код:
...
For $i = 0 To 3
  ; создание дочернего окна
  GUICreate("", 100, 100, 100 * $i, 100 * $i, $WS_CHILD, $WS_EX_CONTROLPARENT, $GUI)
  ; создание картинки на дочернем окне
  $aPics[$i] = GUICtrlCreatePic(@ScriptDir & "\TempScr" & $i & ".jpg", 0, 0, 0, 0)
  ; установка автоизменения размера картинки
  GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
  ; отображение дочернего окна
  GUISetState()
  ; перемещение дочернего окна картинки на самый верх
  ; относительно других дочерних окон
  ChildToTop($aPics[$i])
Next
...
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
InnI
Благодарю, за пояснение! Завтра попробую. :smile: Просто я 4-5 дней только делаю в autoit, поэтому и не могу сходу понять, что для чего и как, до это в кликермане делал, но там нету GUI, но за то , там очень удобная привязка к окну. А тут через winapi, которых я пока не понимаю.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
отключаются картинки, чтобы на них можно было отобразить другие элементы. к примеру, надпись (label).

mmsgeorge [?]
Оказывается, не обязательно удалять и пересоздавать картинку, хватает лишь, по новой одеть шкурку GUICtrlSetImage,
конечно можно и так.
применив к окну стили
Код:
GUICreate("Form1", 500, 500, -1, -1, $GUI_SS_DEFAULT_GUI + $WS_CLIPCHILDREN+$WS_CLIPSIBLINGS)


НО!!!. Если ты возьмешь первую картинку и перетащишь ее на вторую, прямо совместишь со второй картинкой. потом опять решишь перетащить первую, то перемещаться будет вторая. почему? потому что она создана позднее первой, а значит находится поверх нее. такова иерархия расположения элементов окна.
если же ты пересоздаешь элемент, то он становится последним в списке созданных, а значит поверх всех
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
joiner
Просто при пересоздании, (ну удаление , создание картинки), картинка моргает. Вряд ли получится побороть это.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
mmsgeorge
вот поэтому я сразу и предложил вариант с окном. нечто подобное уже в коде реализовал InnI
я бы не создавал окна-картинки, а как говорил, при перетаскивании скрывать картинку и создавать окно в котором будет она отображаться. перетащил, отпустил кнопку мыши, на том месте создался элемент $Pic. но это я примерно.
видишь ли, методы выбираются исходя из идеи построения всего проекта, если на мини-примере все будет работать, то в проекте может глючить. так что.....
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
joiner
Ну пускай так то мигает, получается типа эффекта что я ее выбрал, помоги пожалуйста с другим, как определить картинку за ней(которую перетаскиваю). То есть я перетаскиваю картинку, после чего, когда отпускаю кнопку мышки, картинка встает на координаты другой картинки, которая за ней.


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

InnI
подумал, подумал и решил буду переделывать под твой вариант. скажи как менять размер дочернего окна?



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

InnI
и вот эти моменты вообще не поняты у тебя, то есть dllcallвообще темный лес для меня, но если ты пояснишь, то будет понятно
Код:
Func ChildToTop($ChildId)
  Local $aRet = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", GUICtrlGetHandle($ChildId))
  If Not @error Then DllCall("user32.dll", "bool", "BringWindowToTop", "hwnd", $aRet[0])
EndFunc



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

InnI
еще предстоит все переделывать под режим , так как уже весь код в этом режиме OnEvent да и он мне интуитивно понятен OnEvent


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

InnI
И вот это не понятно
Код:
Case $aPics[0] To $aPics[3]
      ChildToTop($Msg)
      GUICtrlSetState($Msg, $GUI_DISABLE)
      MouseDown("left")
      While GUIGetCursorInfo($GUI)[2]
      WEnd
      GUICtrlSetState($Msg, $GUI_ENABLE)

зачем
Код:
MouseDown("left")

поясни пожалуйста все это и начну трудиться
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
mmsgeorge
как менять размер дочернего окна
Как и любого другого
Код:
WinMove()


Чтобы понять достаточно закомментировать и посмотреть ;)
Я пояснял, что для перетаскивания картинка должна быть заблокирована. А чтобы по ней прошло событие, она должна быть доступной. Когда вы нажимаете кнопку мыши, отрабатывает событие от картинки. Теперь её надо заблокировать, чтобы перетащить окно. Но, т.к. вы кнопку мыши не отпускали, система считает картинку доступной и не хочет перетаскивать её окно. Для этого имитируется дополнительное нажатие мыши, т.к. (насколько я понимаю) именно в момент нажатия кнопки проверяется доступность картинки и, следовательно, возможность перемещения окна.

По поводу функции ChildToTop. Там используются две API-функции. Одна находит родителя картинки (т.е. её окно), а другая перемещает это окно на самый верх относительно таких же окон.
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
InnI
Вот посмотри я твой код под свое подстроил, почему то уползают добавленные фото, за изображение. Просто за раз перенеси несколько фотографий на форму.
Код:
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ListBoxConstants.au3>
#include <StaticConstants.au3>
#include <Misc.au3>
#include <GuiButton.au3>
#include <WinAPI.au3>
#include <ScreenCapture.au3>
_ScreenCapture_Capture(@ScriptDir & "\TempScrBack.jpg", 100, 100, 400, 400)
Opt("GUIOnEventMode", 1)
Global $aPics[4],$put_fotki[11]
global $b, $schet
Global $gaDropFiles[1]
local $i
$GUI = GUICreate("Добавить новость", 860, 580, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSE_okno_dobavit_novosti")

;GUICreate("", 860, 580, 0, 0, $WS_CHILD, -1, $GUI)
$pic_dobavit_kartinku = GUICtrlCreatePic(@ScriptDir & "\TempScrBack.jpg", 50, 0, 860, 580)
GUICtrlSetState(-1, $GUI_DISABLE)

GUIRegisterMsg ($WM_DROPFILES, "WM_DROPFILES_FUNC")
GUISwitch($GUI)
GUISetState()

While 1
  Sleep(1000)  ; Цикл ожидания
WEnd

Func CLOSE_okno_dobavit_novosti()
 ; GUIDelete($GUI)
  exit
EndFunc

Func peretaskivanie_dobavit_kartinku()
  ; создание дочернего окна
  for $i = 0 To UBound($gaDropFiles) - 1
$put_fotki[$schet]=$gaDropFiles[$i]
 $b= GUICreate("", 100, 100, 100 * $i, 100 , $WS_CHILD, $WS_EX_CONTROLPARENT, $GUI)
  ; создание картинки на дочернем окне
  $aPics[$schet] = GUICtrlCreatePic($put_fotki[$schet], 0, 0, 0, 0)
  ; установка автоизменения размера картинки
  GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
  ; отображение дочернего окна
  GUISetState()
  ; перемещение дочернего окна картинки на самый верх
  ; относительно других дочерних окон
  ChildToTop($aPics[$schet])

$schet=$schet+1
GUISetState(@SW_SHOW, $GUI)

  Next

  EndFunc


Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
MsgBox(4096,"","ff")
	;GUICtrlSetState($otobragenie_kartinki,$GUI_ENABLE)
    Local $nSize, $pFileName
   Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)

	For $i = 0 To $nAmt[0] - 1
		 ;$schet=$schet+1
        $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
        $nSize = $nSize[0] + 1
        $pFileName = DllStructCreate("char[" & $nSize & "]")
        DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
        ReDim $gaDropFiles[$i+1]
        $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
        $pFileName = 0
    Next
	peretaskivanie_dobavit_kartinku()
EndFunc
Func ChildToTop($ChildId)
  Local $aRet = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", GUICtrlGetHandle($ChildId))
 If Not @error Then DllCall("user32.dll", "bool", "BringWindowToTop", "hwnd", $aRet[0])
EndFunc



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

joiner
посмотри пожалуйста, код в последнем сообщении, там просто перетащи картинки на форму.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
mmsgeorge
почему то уползают добавленные фото, за изображение
Потому что вы, не разобравшись, закомментировали создание дочернего окна для фоновой картинки
Код:
GUICreate("", 860, 580, 0, 0, $WS_CHILD, -1, $GUI)
Это окно как раз и служит для того, чтобы другие дочерние окна не "прилипали" к рабочей области главного окна, т.е. чтобы не "прятались" под фоновую картинку. И не забудьте это окно отобразить с помощью GUISetState().
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
InnI
1)а если не закомментирую, то картинка которая ставится фоном, не отображается.
я его не просто же закомментировал, я уже чего только не попробовал(
2) картинки , которые добавляю не в размер маленьких дочерних окон.


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

InnI
фоновая картинка почему то ставится на рабочееt GUI


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

InnI
ты запускал скрипт , который я выложил?


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

InnI
что за дебилизм(( смотри вот так отображает
Код:
$GUI = GUICreate("", 860, 580, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUICreate("", 860, 580, 0, 0, $WS_CHILD, -1, $GUI)
$pic_dobavit_kartinku = GUICtrlCreatePic(@ScriptDir & "\TempScrBack.jpg", 0, 0, 860, 580)
GUICtrlSetState(-1, $GUI_DISABLE)

GUISetState()

GUISwitch($GUI)

GUISetState()

а вот так , нет
Код:
$GUI = GUICreate("", 860, 580, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUICreate("", 860, 580, 0, 0, $WS_CHILD, -1, $GUI)
$pic_dobavit_kartinku = GUICtrlCreatePic(@ScriptDir & "\TempScrBack.jpg", 0, 0, 860, 580)
GUICtrlSetState(-1, $GUI_DISABLE)

;GUISetState()

GUISwitch($GUI)

GUISetState()

ничего не понимаю :shok:


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

InnI
GUISetState() - как он вообще работает? Блин вот не знаешь таких мелких нюансов и сидишь по 3 часа фигней маешься, так сделаешь, так сделаешь..жесть. А оказывается такой пустяк.
пожалуйста поясни, почему так? Я уже дальше боюсь делать, так как вот из такой фигни, я весь вечер просидел, а теперь еще , вот картинки которые. я переношу , они не в размерах маленьких дочерних окнах хоть я и использовал
Код:
GUICtrlSetResizing($put_fotki[$schet], $GUI_DOCKAUTO)

Блин. отличный сайт и форум, но так не удобно, так долго это все, был бы чат какой нибудь, общий, где все друг с другом общались и помогали. просто, вот есть вопрос, сидишь вот так по 3 часа, а потом оказывается в пустяке дело. Или еще чего хуже, переделывать все приходится. Не подумайте, что жалуюсь. но правда жалуюсь :rofl:


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

InnI
на самом деле, это все потому, что у меня нет полного представления о том как устроено все.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
mmsgeorge
вот так отображает <...> а вот так , нет <...> ничего не понимаю
Вы вообще мои сообщения читаете?
InnI
И не забудьте это окно отобразить с помощью GUISetState()
Код:
GUICreate("", 860, 580, 0, 0, $WS_CHILD, -1, $GUI) ; <= раскомментировать создание окна
$pic_dobavit_kartinku = GUICtrlCreatePic(@ScriptDir & "\TempScrBack.jpg", 50, 0, 860, 580)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState() ; <= добавить отображение окна с фоновой картинкой


ты запускал скрипт , который я выложил?
Не только запускал, но и проверял его работу, на основании чего дал вам рекомендации.
Я никогда не выкладываю нерабочие скрипты. А если вы их правите, совершенно не понимая, что делаете, то это не моя проблема. Ещё одна подобная претензия и моя помощь вам закончится.

картинки , которые добавляю не в размер маленьких дочерних окон
Когда вы в функции создания картинки в качестве размеров указываете ноль, то картинка вставится "как есть", т.е. в своих собственных размерах и будет обрезана по размерам окна. Либо вы увидите часть окна, если картинка меньше. Если у картинки есть свойство авторазмера, то при изменении окна будет пропорционально изменяться и картинка. НО. Изменяться будет созданная картинка. Например. У вас окно размером 100х100 и вы вставляете в него картинку размером 200х200, указав в функции 100х100. В результате картинка сожмётся. Теперь вы увеличиваете окно до 200х200 и видите увеличение сжатой картинки. Т.е. картинка не станет оригиналом. Поэтому логика должна быть следующей. Создаёте окно по размеру картинки и вставляете в него картинку "как есть". Теперь функцией WinMove можете изменять размеры окна в любую сторону - автоматически будет масштабироваться картинка. Когда окно получит размер картинки, то вы увидите картинку в оригинале, т.к. она изначально была такой создана. Примеров определения размеров картинки из файла на форуме более, чем достаточно.

у меня нет полного представления о том как устроено все
Совершенно верно. Вместо того, чтобы тратить время на изучение AutoIt методом тыка, выделите несколько часов на чтение справки. Она настолько подробная, что заменяет учебник по AutoIt. Если вы не в курсе, то есть русскоязычный вариант Развитие русской справки. Там же найдёте ответ на вопрос
GUISetState() - как он вообще работает?
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
InnI
Вы вообще мои сообщения читаете?
И не забудьте это окно отобразить с помощью GUISetState()
Отобразить окно, для вас может это и много чего значит , но для меня нет. 1 раз у меня было вставлено GUISetState(), откуда я знал, что нужно еще раз его вставлять после того, как я переключился на GUISwitch($GUI).
Совершенно верно. Вместо того, чтобы тратить время на изучение AutoIt методом тыка, выделите несколько часов на чтение справки. Она настолько подробная, что заменяет учебник по AutoIt. Если вы не в курсе, то есть русскоязычный вариант Развитие русской справки. Там же найдёте ответ на вопрос
Я только ее и читал, но там не всегда есть ответы на вопросы, так как ситуаций может быть очень много. к примеру там же нету как устроенна библиотека user32.dll, да и про функцию DllCall (то есть расширенной информации) тоже. Я же уже говорил, я пишу только 5 день.
Когда вы в функции создания картинки в качестве размеров указываете ноль, то картинка вставится "как есть", т.е. в своих собственных размерах и будет обрезана по размерам окна
Просто у тебя в коде по нулям, вот я и у себя сделал по нулям, откуда мне сразу знать , что для чего..
Код:
$aPics[$i] = GUICtrlCreatePic(@ScriptDir & "\TempScr" & $i & ".jpg", 0, 0, 0, 0)



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

InnI
Ещё одна подобная претензия и моя помощь вам закончится.
+ это не претензия была, а я просто спросил. а подумал я это из-за того, что думал, ты не за компьютером, поэтому не ответил про размеры картинки. Это был только вопрос.


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

InnI
еще сложность видишь в чем, говоря
И не забудьте это окно отобразить с помощью GUISetState()
в твоей голове, может это все выглядит логично, есть образ всего этого и что подразумевается, но для меня, пока у меня не такой большой опыт как у тебя, это могут оказаться лишь слова. Вот если бы мы образами могли общаться, то я срзу бы понял! ;)







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

InnI
Благодарю за ответы! Завтра буду продолжать :ok:
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Garrett
Я только ее и читал, но там не всегда есть ответы на вопросы, так как ситуаций может быть очень много. к примеру там же нету как устроенна библиотека user32.dll, да и про функцию DllCall (то есть расширенной информации) тоже. Я же уже говорил, я пишу только 5 день.
Есть такая информация, что чтобы что то запомнить конкретно, то надо прочитать это 33 раза. Я читал про эту функцию, но то что там записано, не отложилось в голове так хорошо. И вообще уже не по теме общаемся)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
mmsgeorge [?]
И вообще уже не по теме общаемся
Именно по теме, потому как она всё больше начинает напоминать детский сад.

Что вы так привязались к этой библиотеке? Что вам даст её внутренний код если вы в двух "ёлках" заблудились?
Скачайте MS VC++, там найдёте всё!

Что тут непонятно?
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Garrett
посмотри пожалуйста код выше, почему не меняется изображение в дочернем окне, хоть я и задал изначально размеры окна 1024 768 , и изображение такое же, потом функцией WinMove ( $Okno_Fotka[$schet], -1, 120 * $schet, 120 ,120,120 ) изменил их до такого, какой мне нужен, а она - картинка. не изменила масштаб.


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

Garrett
опять дело в этом долбанном GUISetState() , его чего после каждой функции вставлять надо, он не может что ли после всех изменений, отобразить(( вообще не понимаю как оно работает. кстати можешь не отвечать, метод тыка быстрее!
 
Статус
Закрыто для дальнейших ответов.
Верх