Что нового

[Элементы GUI] Как скрыть картинку PNG по клику мышки, а потом ее отобразить?

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

Коршун

Новичок
Сообщения
58
Репутация
1
Что-то у меня ничего не получается... Помогите плз
Нужно скрывать картинку по клику мыши, а потом (при повторном клике) ее отображать.

Код:
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>

$hGUI = GUICreate("Show PNG", 240, 240)
GUISetState()

_GDIPlus_StartUp()
$hImage   = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\1.png")
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, 50, 50, 30, 30)

$a = 0
While 1
   $iMsg = GUIGetMsg()
   Select
	  Case $iMsg = $GUI_EVENT_CLOSE
		 ExitLoop
	  Case $iMsg = $GUI_EVENT_PRIMARYDOWN
		 $a +=1
		 If $a = 1 Then
                        ;?????
		 Else
			;?????
			$a = 0
		 EndIf
   EndSelect
WEnd
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ShutDown()
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
361
Коршун
Может так?
Код:
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>

Global Const $STM_SETIMAGE = 0x0172
Global $hGUI = GUICreate('Show PNG', 240, 240)
Global $iPicEx = GUICtrlCreatePic('', 0, 0, 200, 200)
GUISetState()

_SetIntoPicControlEx($iPicEx, @ScriptDir & '\1.png', 200, 200)


While 1
	$iMsg = GUIGetMsg()
	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $GUI_EVENT_PRIMARYDOWN
			If GUICtrlGetState($iPicEx) = 80 Then
				GUICtrlSetState($iPicEx, $GUI_HIDE)
			Else
				GUICtrlSetState($iPicEx, $GUI_SHOW)
			EndIf
	EndSwitch
WEnd

Func _SetIntoPicControlEx($iPic, $sFile, $iW, $iH)
	_GDIPlus_Startup()
	Local $hPng = _GDIPlus_ImageLoadFromFile($sFile)
	Local $hDestination = _GDIPlus_CreateBitmapFromScan0($iW, $iH, 0, _GDIPlus_GetImagePixelFormat($hPng))
	Local $hGraphics = _GDIPlus_ImageGetGraphicsContext($hDestination)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hPng, 0, 0, $iW, $iH)
	Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hDestination)
	_GDIPlus_ImageDispose($hDestination)
	_WinAPI_DeleteObject(GUICtrlSendMsg($iPic, $STM_SETIMAGE, 0, $hBitmap))
	_WinAPI_DeleteObject($hBitmap)
	_GDIPlus_Shutdown()
EndFunc   ;==>_SetIntoPicControlEx

Func _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromScan0', 'int', $iWidth, 'int', $iHeight, 'int', _
			$iStride, 'int', $iPixelFormat, 'ptr', $pScan0, 'ptr*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Ret[6]
EndFunc   ;==>_GDIPlus_CreateBitmapFromScan0

Func _GDIPlus_GetImagePixelFormat($hImage)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImagePixelFormat', 'ptr', $hImage, 'uint*', 0)
	If (@error) Or ($Ret[0]) Then Return SetError(1, 0, 0)
	Return $Ret[2]
EndFunc   ;==>_GDIPlus_GetImagePixelFormat
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Коршун,
Мой вариант.
Код:
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>

Global $hImage, $hBitmap, $hGUI, $aSize, $iPic, $iLbl

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\1.png')
$aSize = _GDIPlus_ImageGetDimension($hImage)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

$hGUI = GUICreate('Show PNG', $aSize[0], $aSize[1])
$iPic = GUICtrlCreatePic('', 0, 0, $aSize[0], $aSize[1])
GUICtrlSendMsg($iPic, 0x0172, 0, $hBitmap)
$iLbl = GUICtrlCreateLabel('', 0, 0, $aSize[0], $aSize[1])
GUICtrlSetState($iLbl, $GUI_HIDE)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $iPic
			GUICtrlSetState($iPic, $GUI_HIDE)
			GUICtrlSetState($iLbl, $GUI_SHOW)
		Case $iLbl
			GUICtrlSetState($iLbl, $GUI_HIDE)
			GUICtrlSetState($iPic, $GUI_SHOW)
	EndSwitch
WEnd
_WinAPI_DeleteObject($hBitmap)

;~ func from GDIP.au3
Func _GDIPlus_ImageGetDimension($hImage)
	Local $aSize[2], $aResult

	$aResult = DllCall($ghGDIPDll, "uint", "GdipGetImageDimension", "hwnd", $hImage, "float*", 0, "float*", 0)
	If @error Then Return SetError(@error, @extended, -1)

	$GDIP_STATUS = $aResult[0]
	If $GDIP_STATUS Then Return -1

	$aSize[0] = $aResult[2]
	$aSize[1] = $aResult[3]
	Return $aSize
EndFunc   ;==>_GDIPlus_ImageGetDimension
 
Автор
К

Коршун

Новичок
Сообщения
58
Репутация
1
Спасибо вам большое! Оба скрипта работают) Не знаю теперь какой и выбрать))


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

Первый вариант - можно изменить размер картинки, но клик работает по всему окну (а не по картинке)
А второй вариант наоборот - клик работает по картинке, но не смог изменить размер картинки))

Как бы получить желаемое?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Коршун [?]
но не смог изменить размер картинки
А это уже в другую тему.

Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.
 
Автор
К

Коршун

Новичок
Сообщения
58
Репутация
1
В моем примере указано
Код:
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, 50, 50, 30, 30)
что говорит что я изменяю размер картинки. А во втором примере - этой функции не нашел... Я попробовал
Код:
$iPic = GUICtrlCreatePic('', 10, 10, 50, 50)
но картинка уменьшается только если свернуть окно
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Коршун,
Раз Вы не понимаете предупреждение, то тема закрыта.
 
Статус
Закрыто для дальнейших ответов.
Верх