Что нового

Управление PNG изображением с прозрачными участками

Yuriy_V.

Новичок
Сообщения
22
Репутация
0
Добрый день.

Пересмотрел кучу тем в форуме, но так и не могу решить задачу.
Есть окно в котором фон JPG изображение и две кнопки. Нужно, что бы при нажатии на "кнопку 1" появлялось в окне на фоне изображение PNG (в этом изображении есть прозрачные участки), а при нажатии на "кнопку 2" PNG изображение исчезало, а фон оставался.

Пока что пробовал просто наложить два изображения, но естественно PNG картинка накладывается на белом фоне.

Код:
$Fon = GUICreate("", 1920, 1080,-1,-1)
$Pic = GUICtrlCreatePic("", 0, 0, 1920, 1080)
_SetImage($Pic, "Путь к файлу фона")
GUISetState(@SW_SHOW, $Fon)
Sleep(1000)
$Icon = GUICreate("Icon", 1169, 1080,-1,-1, $WS_POPUP, 0, $Fon)
$Pic2 = GUICtrlCreatePic("Icon", 0, 0, 1169, 1080)
_SetImage($Pic2, "Путь к файлу PNG")
GUISetState(@SW_SHOW, $Icon)
Sleep(2000)


А нужно так как на риснуке.

Заранее благодарен за любую помощь.
 

Вложения

  • Forum.jpg
    Forum.jpg
    24.1 КБ · Просмотры: 21

InnI

AutoIT Гуру
Сообщения
4,947
Репутация
1,443
Картинки приложены
Код:
#include <GDIPlus.au3>
#include <WinAPISys.au3>
#include <GuiConstants.au3>

$JpgPath = @ScriptDir & "\fon.jpg"
$PngPath = @ScriptDir & "\ico.png"

$Fon = GUICreate("")
$Pic = GUICtrlCreatePic($JpgPath, 0, 0, 400, 400)
GUICtrlSetState(-1, $GUI_DISABLE)
$BtnShow = GUICtrlCreateButton("Показать", 10, 370)
$BtnHide = GUICtrlCreateButton("Скрыть", 340, 370)
GUISetState(@SW_SHOW, $Fon)

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($PngPath)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

$Icon = GUICreate("", 200, 200, -1, -1, $WS_POPUP, $WS_EX_LAYERED, $Fon)
GUISetState(@SW_SHOW, $Icon)
_WinAPI_UpdateLayeredWindowEx($Icon, -1, -1, $hBitmap, 255, True)

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $BtnShow
      WinSetState($Icon, "", @SW_SHOW)
    Case $BtnHide
      WinSetState($Icon, "", @SW_HIDE)
  EndSwitch
Until 0
 

Вложения

  • pics.zip
    95.1 КБ · Просмотры: 27
  • Like
Реакции: Norm

Norm

Продвинутый
Сообщения
289
Репутация
76
Спасибо InnI за отличный пример

Я сделал так же себя в GUI. Всё прекрасно работает, вот только заметил, что если окно с задним фоном перетаскивается,
то PNG-картинка наложенная на это окно, остается висеть на месте и не перетаскивается вместе с окном.

Подскажите, как это можно устранить, а точнее прикрепить эту картинку к "родительскому" окну?
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>

_GDIPlus_Startup()
Global $hBitmapBk = _GDIPlus_ImageLoadFromFile("1.jpg")
Global $hBitmapIt = _GDIPlus_ImageLoadFromFile("2.png")

Global $aSize = _GDIPlus_ImageGetDimension($hBitmapBk)

Global $iX = 125
Global $iY = 125

Global $hGUI = GUICreate(@ScriptName,500,550)
Global $iPic = GUICtrlCreatePic("",0,0,500,500)
Global $iBtnShow = GUICtrlCreateButton("Show",10,510,100,30)
Global $iBtnHide = GUICtrlCreateButton("Hide",120,510,100,30)
GUISetState()

_Update()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $iBtnShow
            _Update(True)
        Case $iBtnHide
            _Update()
    EndSwitch
WEnd

Func _Update($bShow = False)

    Local $hBitmap = _GDIPlus_BitmapCloneArea($hBitmapBk,0,0,$aSize[0],$aSize[1])
    Local $hGraphics =  0

    If $bShow Then
        $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsDrawImage($hGraphics,$hBitmapIt,$iX,$iY)
        _GDIPlus_GraphicsDispose($hGraphics)
    EndIf

    _PicSetBitmap($iPic, $hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)

EndFunc


Func _PicSetBitmap($idPic, $hBitmap)

    Local $hHBitmap = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
    If $hHBitmap = 0 Then Return SetError(1, 0, 0)
    Local $hPrevImage = GUICtrlSendMsg($idPic, 0x0172, 0, $hHBitmap) ; $STM_SETIMAGE = 0x0172
    _WinAPI_DeleteObject($hPrevImage)
    _WinAPI_DeleteObject($hHBitmap)
    _WinAPI_RedrawWindow(_WinAPI_GetParent(GUICtrlGetHandle($idPic)))

EndFunc


1.jpg2.png
 
Последнее редактирование:

Norm

Продвинутый
Сообщения
289
Репутация
76
SECTOR
Функцию Вашу прикрутил у себя, всё прекрасно работает.
Огромное Вам спасибо.
Заметил у себя что при повторном запуске окна с такой графикой происходить проподание картинки.
Это происходило из за того что отсутствовали команды на освобождение объектовб а именно:
После их добавления этого уже не происходило.
Код:
_GDIPlus_BitmapDispose($hBitmapBk)
_GDIPlus_BitmapDispose($hBitmapIt)

P.S.
Сегодня ещё раз проверял этот код и нашёл очень простое решение для примера InnI
Нужно было просто добавить Ex-стиль $WS_EX_MDICHILD. После этого лишь указать вместо (-1) нужные координаты (если необходимо).
 
Последнее редактирование:
Верх