Что нового

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

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

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
mmsgeorge
Вы можете конкретно написать что вы хотите сделать?
Игру пятнашки, приложение для просмотра картинок и т. д.
Исходя из задачи вам могут подсказать более грамотное решение.
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Garrett
Что тут непонятно?
возьмем именно этот случай DllCall("user32.dll", "hwnd", "GetParent", "hwnd", GUICtrlGetHandle($ChildId))
"hwnd"- понятно, дескриптор окна
"GetParent"- это что такое?
почему потом опять - "hwnd"?
GUICtrlGetHandle($ChildId) -это примерно понятно

далее
If Not @error Then DllCall("user32.dll", "bool", "BringWindowToTop", "hwnd", $aRet[0])
что за - "BringWindowToTop"
$aRet[0] - что означает индекс 0 и почему именно 0, и вообще в первом случает просто без индекса $aRet = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", GUICtrlGetHandle($ChildId))

далее более сложная конструкция
DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
shell32.dll - не знаю что за библиотека
"DragQueryFile" - что это
$wParam - что это и почему именно тут
0xFFFFFFFF - что это :shok:
"ptr" - что это
0, "int", 255 - и вот это, я вообще не понимаю этой конструкции.

и еще много в коде этих библиотек и именно такого строения, вот это сложно.


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

Garrett
будет программа


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

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

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
mmsgeorge, видимо, вы и вправду не закончите проект, т.к. задачу вы себе поставили на данный момент, мягко говоря, не по зубам. Уровень ваших знаний ну никак не сочитается с тем, что вы хотите сделать. Мой вам совет, начните с изучения WinAPI. В справке есть масса замечательных примеров.
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Garrett
на самом деле мне много чего не понятно, а мне не понятно , почему вы так удивляетесь? Я что обязан знать и понимать все?! хватит мне писать -
Вы хоть заглянули по ссылке?
Конечно заглянул!
Если вам непонятно что третий параметр это название функции, то тему пора закрывать.
- какой функции , это понял , что какой то функции. Не в этом дело! Что вы ко мне пристали? )


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

Yashied
О, Уважаемый Yashied , я все думал, интересно а мне напишет когда нибудь Yashied :smile:
Написал!
НУ мы еще посмотрим, по зубам или нет. Бота делал в кликермане по игре лотро, было нелегко и тут нелегко, а кто сказал, что в жизни кроме деградации, вообще что то легко?! Не сразу и города строились!


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

Yashied
Интересует такой вопрос, у меня созданы картинки в дочерних окнах. Как узнать какое именно дочернее окно активировано? У Inni сделанно через другой режим
Код:
Do
  $Msg = GUIGetMsg()
  Switch $Msg
    Case $aPics[0] To $aPics[3]
      ChildToTop($Msg)
      GUICtrlSetState($Msg, $GUI_DISABLE)
      MouseDown("left")
      While GUIGetCursorInfo($GUI)[2]
      WEnd
      GUICtrlSetState($Msg, $GUI_ENABLE)
    Case $GUI_EVENT_CLOSE
      Exit
    Case $GUI_EVENT_DROPPED
      GUICtrlSetState($pic_dobavit_kartinku, $GUI_SHOW)
      MsgBox(0, "Drag", GUICtrlRead($Edit), 0, $GUI)
  EndSwitch
Until 0

у него передается через $Msg

у меня же сделано через
Код:
Opt("GUIOnEventMode", 1)


то есть каждой картинке присваивается
Код:
GUICtrlSetOnEvent (  $fotka[$schet], "peremeshenie_kartinki" )
думаю на тем, как узнать ID картинки, на которое нажато...
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Yashied
точно, вот пока забываю такие вещи, ничего дело в опыте. Все получилось, но теперь остается небольшой шлейф за картинкой) вот код.
Код:
#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>
Opt("GUIOnEventMode", 1)
_ScreenCapture_Capture(@ScriptDir & "\TempScrBack.jpg", 100, 100, 1024, 768)
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
Global $aPics[11], $put_fotki[11]
Global $b, $schet
Global $gaDropFiles[1], $Okno_Fotka[11]
Local $i

$GUI = GUICreate("", 1024, 768, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSE_okno_dobavit_novosti")
GUICreate("", 1024, 768, 0, 0, $WS_CHILD, -1, $GUI)
$pic_dobavit_kartinku = GUICtrlCreatePic(@ScriptDir & "\TempScrBack.jpg", 0, 0, 1024, 768)
GUICtrlSetState(-1, $GUI_DISABLE)

GUISetState()

GUISwitch($GUI)

GUISetState()

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

Func CLOSE_okno_dobavit_novosti()
	; GUIDelete($GUI)
	Exit
EndFunc   ;==>CLOSE_okno_dobavit_novosti

Func peretaskivanie_dobavit_kartinku()

	; создание дочернего окна
	For $i = 0 To UBound($gaDropFiles) - 1
		$put_fotki[$schet] = $gaDropFiles[$i]
		$Okno_Fotka[$schet] = GUICreate("", 800, 600, 0, 0, $WS_CHILD, $WS_EX_CONTROLPARENT, $GUI)
		; создание картинки на дочернем окне
		$aPics[$schet] = GUICtrlCreatePic($put_fotki[$schet], 0, 0, 800, 600)
		GUICtrlSetCursor($aPics[$schet], 0)
		GUICtrlSetOnEvent($aPics[$schet], "peremeshenie_kartinki")
		GUISetState()
		; установка автоизменения размера картинки
		GUICtrlSetResizing($aPics[$schet], $GUI_DOCKAUTO)

		; отображение дочернего окна
		WinMove($Okno_Fotka[$schet], -1, 120 * $schet, 120, 120, 120)

		; перемещение дочернего окна картинки на самый верх
		; относительно других дочерних окон
		ChildToTop($aPics[$schet])

		$schet = $schet + 1
		GUISetState()
	Next

	;GUISetState(@SW_SHOW, $GUI)
EndFunc   ;==>peretaskivanie_dobavit_kartinku

Func peremeshenie_kartinki()
	$Vibranna_kartinka = GUIGetCursorInfo($GUI)
	;MsgBox(4096,"","gg")
	ChildToTop($Vibranna_kartinka[4])
	GUICtrlSetState($Vibranna_kartinka[4], $GUI_DISABLE)
	MouseDown("left")
	While GUIGetCursorInfo($GUI)[2]
	WEnd
	GUICtrlSetState($Vibranna_kartinka[4], $GUI_ENABLE)
EndFunc   ;==>peremeshenie_kartinki
Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)

	;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   ;==>WM_DROPFILES_FUNC
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   ;==>ChildToTop
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Хотите сделать хорошо, используйте GDI+. Координаты, размеры и прочую информацию по каждой картинке держите в специальном массиве. По-сути у вас будет одна большая картинка, содержащая все ваши добавленные изображения. При клике в какую-либо область в пределах GUI, вы сверяете координаты с массивом данных и, в случае попадания, производите соответствующие действия. Забудьте про control'ы, они всеегда будут мерцать, т.к. обновляются при перерисовке.
 
Автор
M

mmsgeorge

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


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

joiner
Интересует как узнать какая картинка под той которую перетаскиваю (когда нажатием мыши, я перетаскиваю картинку на другую, нужно определить , id той , которая снизу, чтобы та, которую перетаскиваю стала на ее место) можно сверить просто сверяя координаты, ну или на прямую через GUIGetCursorInfo, Но она мне показывает ID, которую перетаскиваю. а надо, что за ней.
А как в твоем скрипте, вытаскивать id картинок, кроме той которую перетаскиваю, ведь они там начинаются не с 0 (про ID)
Я нашел
Код:
$Array = $Objekt_massiv.Keys()

Теперь просто циклом пройду по всем картинкам, сверю их координаты с координатами , перетаскиваемой картинки и все.
правда может найду все таки способ через GUIGetCursorInfo


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

joiner
Блин так тупо, что они тут не с 0 индекса идут
Код:
Global $Objekt_massiv = ObjCreate('Scripting.Dictionary')
$Objekt_massiv.CompareMode = 1 ;типа режим массива = текстовый



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

можно просто добавить дополнительный массив
Код:
$Massiv_Kartinka_ID = $Objekt_massiv.Keys()

теперь в новом массиве индексы пойдут с 0
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
mmsgeorge [?]
Я что обязан знать и понимать все?!
Нет.
Тогда справедливо и другое. Вам никто не обязан что-нибудь объяснять!
- какой функции , это понял , что какой то функции.
Ничего вы не поняли!
Это не какая-то функция, это функция которую вы вызываете из dll.
Дело в том, что вы хотите быстрого результата без усилий со своей стороны.
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Garrett
OffTopic:
вот пристал(

Отвечу на последние твои сообщения! (Тему можно закрывать)
Нет.
Тогда справедливо и другое. Вам никто не обязан что-нибудь объяснять!
И так уже никто , ничего, не объясняет, последние сообщения - общение самим с собой!
Ничего вы не поняли!
Это не какая-то функция, это функция которую вы вызываете из dll.
Точно?!
Дело в том, что вы хотите быстрого результата без усилий со своей стороны.
Очень хочу!) Но так не бывает!
Эту часть я закончил! Огромная благодарность всем кто отписался и терпел меня :rofl:
Особенно хочу поблагодарить joiner - его скрипт оказался самым удачным и больше всего подошел. Также огромная Благодарность InnI. Очень многому научил! Можно сказать я попробовал реализовать эту задачу , разными путями.Ну и конечно же Garrett, который терял на меня время и общался со мной. Ну и Yashied, который, очень адекватный и отзывчивый! Жду вас в новой теме, с меня чай и печеньки! :smile:






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

Могу изменить скрипт joiner как у меня и выложить тут, на благо ищущих! Надо?
 
Статус
Закрыто для дальнейших ответов.
Верх