GUICtrlCreatePic - Beispiel3

  • Hallo Com ;D

    Habe vorher inner Shoutbox gefragt und da wurde mir gesagt ich solle inner Hilfe,
    unter GUICtrlCreatePic schauen.

    Da ich ein .png verwenden möchte was Transparente stellen hat , kam Beispiel 3 in frage.

    Ich habe den Code nun so abgewandelt :

    Spoiler anzeigen
    [autoit]


    ;========================== Includes (Anfang) ===========================
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <ProgressConstants.au3>
    #include <Misc.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    ;=========================== Includes (Ende) =============================
    ;=========================== Global (Anfang) =============================
    Global $Form1, $Pic1, $hGraphic, $hImage1
    ;=========================== Global (Anfang) =============================
    ;=========================== Func (Anfang) =============================
    _GDIPlus_Startup()
    $Pic1 = _GDIPlus_ImageLoadFromFile("images\logo w.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    GUISetState()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($Pic1)
    _GDIPlus_Shutdown()
    Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($Form1, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic, $Pic1, 0, 0)
    _WinAPI_RedrawWindow($Form1, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_PAINT

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

    ;=========================== Func (Ende) =============================

    [/autoit]

    Nun möchte ich das Bild (fals der code oben nicht falsch ist)

    hier einbinden :


    Spoiler anzeigen
    [autoit]

    Func _english()
    $Form1 = GUICreate("Multi-Game-Quest-Viewer by TheDarkCoderZ", 387, 242, 192, 124)
    $Button1 = GUICtrlCreateButton("KalOnline", 24, 80, 153, 33)
    $Button3 = GUICtrlCreateButton("Cooming soon!", 208, 80, 153, 33)
    $Button2 = GUICtrlCreateButton("Cooming soon!", 208, 136, 153, 33)
    $Button4 = GUICtrlCreateButton("Cooming soon!", 24, 136, 153, 33)
    $Button5 = GUICtrlCreateButton("Credits", 24, 192, 153, 33)
    $Exit = GUICtrlCreateButton("Exit", 208, 192, 153, 33)
    $Pic1 = GUICtrlCreatePic("images\logo w.jpg", 24, 8, 337, 73)
    GUISetState(@SW_SHOW)

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

    While 3
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Exit
    Exit
    Case $Button5
    _credits()

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

    EndSwitch
    WEnd
    EndFunc ;==>_english

    [/autoit]

    Und zwar genau da wo bei der Func _english() gerade $Pic1 ist.
    Wie gesagt habe ich mir die Hilfe angeschaut ;D

    Fals euch irgentein Teil vom Code fehlt den ich jetzt vergessen habe hier reinzusetzen sagt bescheid dann trage ich den nach .

    MfG

    Goldy

    Meine Projekte :

    Taschenrechner [X]
    JamLegend Auto-Player [Canceld]
    Launcher [X]
    Multi-Game-Quest-Viewer [Canceld]


    [autoit]

    If $goffy or not $brain Then $DeleteInetCable

    [/autoit]

    2 Mal editiert, zuletzt von Goldy (20. September 2010 um 02:47)


  • dann tu es und du wirst sehen ob es klappt,

    mfg autoBert


    Und wie mache ich das?

    Meine Projekte :

    Taschenrechner [X]
    JamLegend Auto-Player [Canceld]
    Launcher [X]
    Multi-Game-Quest-Viewer [Canceld]


    [autoit]

    If $goffy or not $brain Then $DeleteInetCable

    [/autoit]
  • Geht nun thx an alle die geholfen haben..

    EDIT : ES geht doch nicht :0

    Meine Projekte :

    Taschenrechner [X]
    JamLegend Auto-Player [Canceld]
    Launcher [X]
    Multi-Game-Quest-Viewer [Canceld]


    [autoit]

    If $goffy or not $brain Then $DeleteInetCable

    [/autoit]

    Einmal editiert, zuletzt von Goldy (20. September 2010 um 02:48)

  • Wenn du von TheDarkCoderZ bist, müsstest du das eigentlich können. Achja warum hast du bei While eine 3 statt eine 1 geschrieben? Hat das irgendwelche andere Auswirkungen, die ich noch nicht kenne?

  • Oder du machst es einfach hiermit

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    InetGet("http://upload.wikimedia.org/wikipedia/commons/7/7a/Basketball.png",@ScriptDir & "\Ball.png")

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

    $hGUI = GUICreate("")
    $cBasketball = GUICtrLCreatePng($hGUI,@ScriptDir & "\Ball.png",20,20)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    Case $cBasketball
    MsgBox(0,"","Du hast den Ball angeklickt!")
    EndSwitch
    WEnd

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

    Func GUICtrlCreatePng($hWnd, $sPath, $iX, $iY) ; SEuBo
    _GDIPlus_Startup()
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend, $hGUI
    Local $hImage = _GDIPlus_ImageLoadFromFile($sPath), $iWidth = _GDIPlus_ImageGetWidth($hImage), $iHeight = _GDIPlus_ImageGetHeight($hImage)
    $hGUI = GUICreate("", $iWidth, $iHeight, $iX, $iY, 0x80000000, BitOR(0x40, 0x80000), $hWnd)
    $cLabel = GUICtrlCreateLabel("", 0, 0, $iWidth, $iHeight)
    GUICtrlSetBkColor(-1, -2)
    GUISetState(@SW_SHOWNOACTIVATE, $hGUI)
    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate("int X;int Y")
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iWidth)
    DllStructSetData($tSize, "Y", $iHeight)
    $tSource = DllStructCreate("int X;int Y")
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 255)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
    GUISwitch($hWnd)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Return SetError(0,$hGUI,$cLabel)
    EndFunc ;==>GUICtrlCreatePng

    [/autoit]

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

  • @HellBoy,

    wenn es damit funktionieren würde, hätte ich es ihm vorgeschlagen, da ich diese func von SEuBo kenne. Sie ist wnderbar um ein Bild in einem Bereich anzuzeigen, in der sich keine Controls befinden. Sobald aber ein Control, das PNG (im Beispiel Basketball) überlappt verschwindet der überlappende Teil des Controls hinter dem Bild.
    Ausserdem hat Goldy mittlerweile gelöst (was mich zwar wundert, da es auch ein paar Falltüren hat), alle Achtung

    mfg autoBert

  • @m-obi,

    ich hatte es in Nacht gesehen, dass er gelöst hat, seinen Edit habe ich (da ich alle 5 Posts eine neue Seite aufmache) übersehen, sorry

    Goldy hier die Lösung bis auf die Überschrift und der Variable $hGui sollte alles wie in deinem Orihinal sein:

    Spoiler anzeigen
    [autoit]

    ;----- Beispiel 3 wie das ganze auch mit PNG funktioniert (von Zedna)
    #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]

    ; GUI erstellen
    $hGUI = GUICreate("PNG zeigen", 387, 242, 192, 124, -1)

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

    ; PNG Bild laden
    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile("..\GUI\Torus.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    $Button1 = GUICtrlCreateButton("KalOnline", 24, 80, 153, 33)
    $Button3 = GUICtrlCreateButton("Cooming soon!", 208, 80, 153, 33)
    $Button2 = GUICtrlCreateButton("Cooming soon!", 208, 136, 153, 33)
    $Button4 = GUICtrlCreateButton("Cooming soon!", 24, 136, 153, 33)
    $Button5 = GUICtrlCreateButton("Credits", 24, 192, 153, 33)
    $Exit = GUICtrlCreateButton("Exit", 208, 192, 153, 33)

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

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    GUISetState(@SW_SHOW)
    ;die folgenden Zeilen sind notwendig damit die Controls von Anfang an über dem PNG liegen
    ControlFocus($hGUI, "", $Button1)
    ControlFocus($hGUI, "", $Button2)
    ControlFocus($hGUI, "", $Button3)
    ControlFocus($hGUI, "", $Button4)
    ControlFocus($hGUI, "", $Button5)
    ControlFocus($hGUI, "", $Exit)

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

    While 3
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Exit
    Exit
    Case $Button5
    ;_credits()

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

    EndSwitch
    WEnd

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

    ; Ressourcen aufräumen
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

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

    ; PNG Bild zeichnen
    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 ;==>MY_WM_PAINT

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

    mfg autoBert

  • Also muss ich für jedes Bild also .png den Code den du mir gegeben hast neu schreiben ?

    Oder kann ich einfach mehre Bilder in den Code einbauen=

    Naja muss los Schule xD

    Heut zu Tage lernt man auch in Informatik Kurs nichts mehr :0

    Meine Projekte :

    Taschenrechner [X]
    JamLegend Auto-Player [Canceld]
    Launcher [X]
    Multi-Game-Quest-Viewer [Canceld]


    [autoit]

    If $goffy or not $brain Then $DeleteInetCable

    [/autoit]
  • Wenn man mit der GUI auserhalb des Desktops kommt, verschwinden die Buttons, denn das bild wird drüber gezeichente, erst beim erneuten drüberfahren der buttons sieht man sie wieder. Man müsste in die Func MY_WM_PAINT noch einbauen das die Buttons dadrüber kommen.
    Du kannst es ja auch mal mit

    [autoit]

    GUIGetCursorInfo()

    [/autoit]


    versuchen und dann immer abfragen wenn mous klick auf der einer Stelle (z.b. einem Bild das als Button dienen soll) dann exit oder sonst irg was.

  • Wenn man mit der GUI auserhalb des Desktops kommt, verschwinden die Buttons, denn das bild wird drüber gezeichente, erst beim erneuten drüberfahren der buttons sieht man sie wieder.


    Ups, gar nicht bemerkt, das ist das gleiche Problem das ich beim Erstellen der Gui hatte. Sie waren nämlich hinter dem Bild. Da ich kein GDI+ Spezialist bin war ich schon froh gewesen es über die einfache Weise mit ControlFocus zu beheben. Das wäre auch jetzt eine Möglichkeit, dann sollte man sich aber das Control merken, das den Focus hatte und danach wieder dafür sorgen, das es ihn auch wieder bekommt. Mir fällt aber (bisher) noch keine Möglichkeit hierfür ein. In dieser einen Gui von Goldy geht es zwar auch ohne, aber was wenn er das Schema af GUI's mit Input-/Edit-Feldern anwendet?

    Ich glaube du solltest erstmal die GDI+ Grundlagen verstehen.

    bin auch der Meinng dass er zuviele Baustellen gleichzeitig aufmacht,

    mfg autoBert