PNG dateien anzeigen

  • Hallo

    ich hab probleme damit eine png datei in meinem gui anzuzeigen...

    mein gui hat keine rränder und is transparent
    deswegen wollte ich als hintergrund eine png einbauen und die buttons auch
    nur werden die warscheinlich nicht angenommen..
    ich hab
    GUICtrlCreatePic()
    dafür verwendet...

    Einmal editiert, zuletzt von jiyan006 (1. Januar 2009 um 19:52)

  • Spoiler anzeigen
    [autoit]

    $Form1 = GUICreate("BLA", 450, 610, 200, 130, BitOR($WS_POPUP,$DS_MODALFRAME,$DS_SETFOREGROUND), $WS_EX_ACCEPTFILES)
    GUISetBkColor(0x000000)$close = GUICtrlCreatePic("close1.png",17,470,100,25,0)

    [/autoit] [autoit][/autoit] [autoit]

    while 1
    switch guigetmsg()
    case $close
    exit

    [/autoit] [autoit][/autoit] [autoit]

    endswitch

    [/autoit] [autoit][/autoit] [autoit]

    wend

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • steht in der Hilfe:
    GUICtrlCreatePic:

    PNG can be used with GDI+. See example 3.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #Include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGUI, $hImage, $hGraphic, $hImage1

    [/autoit] [autoit][/autoit] [autoit]

    ; Create GUI
    $hGUI = GUICreate("Show PNG", 350, 301)

    [/autoit] [autoit][/autoit] [autoit]

    ; Load PNG image
    _GDIPlus_StartUp()
    $hImage = _GDIPlus_ImageLoadFromFile("MAIN.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Loop until user exits
    do
    until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit]

    ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_ShutDown()

    [/autoit] [autoit][/autoit] [autoit]

    ; Draw PNG image
    Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • THX :D
    jetzt mus ich das mit 25 pics machn ^^ :)

    EDIT:


    ich kann des Bild nicht in den Hintergrund setzten :S

    Einmal editiert, zuletzt von jiyan006 (30. Dezember 2008 um 11:25)

  • ich hab jetzt ein gui mit der png gemacht
    also durchsichtig mit "SetBitmap"
    und das gui mit "$WS_EX_LAYERED"
    jetzt ist natürlich der ganze andere kram hinter der png verschollen...
    kann man die jtzt iwie nach vorne bringen???

  • sry mal wieder vergessen ^^...

    Spoiler anzeigen
    [autoit]


    $hGui = GUICreate("WINDOW", 450, 610, -1, -1, BitOR($WS_POPUP,$DS_MODALFRAME,$DS_SETFOREGROUND),BitOR($WS_EX_ACCEPTFILES,$WS_EX_LAYERED))

    [/autoit] [autoit][/autoit] [autoit]

    $Button = Guictrlcreatebutton("ICH WERDE NICHT ANGEZEIGT!!",50,50,100,25)
    $hImage = _GDIPlus_ImageLoadFromFile("patch.png")SetBitMap($hGUI, $hImage, 220)
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    while 1
    $msg = guigetmsg()
    if $msg = -3 then exit
    wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
    $hScrDC = _WinAPI_GetDC(0) $hMemDC =
    _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize )
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth ($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha" , $iOpacity )
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hGUI, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC (0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC ($hMemDC)EndFunc
    Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    if ($hWnd = $hGUI) and ($iMsg = $WM_NCHITTEST) then Return $HTCAPTIONEndFunc

    [/autoit]


    hoffe es reicht...
    obwohl das mit WM_NICHTTEST wohl nix damit zu tun hätte

    Einmal editiert, zuletzt von jiyan006 (30. Dezember 2008 um 23:45)

    • Offizieller Beitrag

    Bei deinem Script kommen nur Fehler. Scheint nicht vollständig zu sein . Überprüf das mal. Und häng mal die PNG Datei mit an .


    Post Nummer 400 :D

  • So:

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $AC_SRC_ALPHA = 1
    _GDIPlus_Startup()
    $hGui = GUICreate("WINDOW", 450, 610, -1, -1, BitOR($WS_POPUP,$DS_MODALFRAME,$DS_SETFOREGROUND),BitOR($WS_EX_ACCEPTFILES,$WS_EX_LAYERED))

    [/autoit] [autoit][/autoit] [autoit]

    $Button = Guictrlcreatebutton("ICH WERDE NICHT ANGEZEIGT!!",50,50,100,25)
    $hImage = _GDIPlus_ImageLoadFromFile("Back.png")
    SetBitMap($hGUI, $hImage, 220)
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    while 1
    $msg = guigetmsg()
    if $msg = -3 then exit
    wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize )
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth ($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha" , $iOpacity )
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hGUI, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC (0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC ($hMemDC)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    if ($hWnd = $hGUI) and ($iMsg = $WM_NCHITTEST) then Return $HTCAPTION
    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von jiyan006 (31. Dezember 2008 um 16:57)

    • Offizieller Beitrag

    Dein Prog zeigt mal gar nix an . Kein Bild, keine Gui, kein Button. Nix. Ausser der Anzeige in der Tastleiste das ein Fenster offen ist, macht dein Prog nix.

  • Ich hab Dein Bild mal in meine Demo von oben eingebaut.

    Bitte die Unterschiede selber überprüfen und dementsprechend anpassen ;)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #Include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGUI, $hImage, $hGraphic, $hImage1

    [/autoit] [autoit][/autoit] [autoit]

    ; Create GUI
    $hGUI = GUICreate("Show PNG", 450, 550,-1,-1, BitOR($WS_POPUP,$DS_MODALFRAME,$WS_EX_LAYERED),$WS_EX_ACCEPTFILES);,$DS_SETFOREGROUND))

    [/autoit] [autoit][/autoit] [autoit]

    ; Load PNG image
    _GDIPlus_StartUp()
    $hImage = _GDIPlus_ImageLoadFromFile("Back.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Loop until user exits
    do
    until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit]

    ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_ShutDown()

    [/autoit] [autoit][/autoit] [autoit]

    ; Draw PNG image
    Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    • Offizieller Beitrag

    Probier mal das aus :

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #Include <WinAPI.au3>
    Global $hGUI, $hImage, $hGraphic, $hImage1
    ; Create GUI
    $hGUI = GUICreate("Show PNG", 450, 550,-1,-1, BitOR($WS_POPUP,$DS_MODALFRAME,$WS_EX_LAYERED),$WS_EX_ACCEPTFILES);,$DS_SETFOREGROUND))
    ; Load PNG image
    _GDIPlus_StartUp()
    $hImage = _GDIPlus_ImageLoadFromFile("Back.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    GUISetState()
    WinSetTrans("Show PNG","",210);Transparenz der Gui mit dem Bild
    ; Loop until user exits
    $gui = GUICreate("Child",100,17,125,250,$WS_POPUP,$WS_EX_LAYERED+$WS_EX_MDICHILD,$hGUI); Für jeden Button eine eigene Gui anlegen mit den Ausmaßen des Controls
    _WinAPI_SetLayeredWindowAttributes($gui,0x010203)
    $Test = GUICtrlCreateButton("Das ist Button 1",0,0,100,17);
    GUISetState()
    WinSetTrans($gui,"",210);Transparenz des Buttons $Test
    $gui1 = GUICreate("Child",100,17,125,280,$WS_POPUP,$WS_EX_LAYERED+$WS_EX_MDICHILD,$hGUI); Für jeden Button eine eigene Gui anlegen mit den Ausmaßen des Controls
    _WinAPI_SetLayeredWindowAttributes($gui,0x010203)
    $Test1 = GUICtrlCreateButton("Beenden ",0,0,100,17);
    GUISetState()
    WinSetTrans($gui1,"",210);Transparenz des Buttons $Test1
    do
    until GUIGetMsg() = $Test1

    [/autoit] [autoit][/autoit] [autoit]

    ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_ShutDown()
    ; Draw PNG image
    Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc
    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03
    If Not $isColorRef Then
    $i_transcolor = Hex(String($i_transcolor), 6)
    $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $dwFlages)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, _WinAPI_GetLastError(), 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_WinAPI_SetLayeredWindowAttributes

    [/autoit]


    Edit die Func _WinAPI_SetLayeredWindowsAttributes ist von Prog@ndy

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; Function Name: _WinAPI_SetLayeredWindowAttributes
    ; Description:: Sets Layered Window Attributes:) See MSDN for more informaion
    ; Parameter(s):
    ; $hwnd - Handle of GUI to work on
    ; $i_transcolor - Transparent color
    ; $Transparency - Set Transparancy of GUI
    ; $isColorRef - If True, $i_transcolor is a COLORREF( 0x00bbggrr ), else an RGB-Color
    ; Requirement(s): Layered Windows
    ; Return Value(s): Success: 1
    ; Error: 0
    ; @error: 1 to 3 - Error from DllCall
    ; @error: 4 - Function did not succeed - use
    ; _WinAPI_GetLastErrorMessage or _WinAPI_GetLastError to get more information
    ; Author(s): Prog@ndy
    ;
    ; Link : @@MsdnLink@@ SetLayeredWindowAttributes
    ; Example : Yes
    ;===============================================================================

    [/autoit]
  • aahh..
    THX :D
    eine eigene Gui für jede Button.. daran hätt ich nie gedacht :) ...
    THX nochmal :)

  • Warum denn für jeden Button? eine GUI für alle Controls reicht doch. (und eben eine fürs PNG)

    • Offizieller Beitrag

    @progandy : Ich habe für jeden Button eine Gui erstellt, weil wenn du mehrer in 1 Gui packst die Anzeige nicht richtig funzt. Wenn zwischen den Buttons "Luft" ist, dann wird diese nicht durchsichtig angezeigt. D.h. zwischen den Buttons ist das Hintergrundbild verschwunden .