bunter Ladebalken auf einer Form mit GDI+

  • Huhu,
    ich möchte gerne den Ladebalken (GDIpProgress.au3) von Prog@ndy benutzen in meiner Form.
    Die Form ist eine PNG.
    Die Objecte die mit GUICtrlCreate erstellt werden, werden nicht angezeigt (leider).

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <GDIpProgress.au3>

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

    Global $iImagePfad = @ScriptDir & "\"

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

    _GDIPlus_Startup()

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

    $hGUI = GUICreate("Form", 450, 610, (@DesktopWidth / 2) - 400, -1, $WS_POPUP);, $WS_EX_LAYERED)
    $hImage = _GDIPlus_ImageLoadFromFile($iImagePfad & "bg.png")
    SetBitMap($hGUI, $hImage, 255)
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUISetState(@SW_SHOW, $hGUI)

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

    $Progress1 = _ProgressCreate(20, 186, 292, 14)
    _ProgressSetColors($Progress1, 0x09B8F8, 0x09B8F8, 0xFFFFFF, 0xFFFFFF)
    _ProgressSet($Progress1, 50)

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

    Sleep (5000)

    [/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", 1)
    _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 ;==>SetBitmap

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

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

    [/autoit]

    Weiß einer wie ich den Ladebalken sichtbar mache?

    • Offizieller Beitrag

    Dein Script ist nicht Lauffähig. Poste mal ein Beispiel, mit dem man arbeiten kann. Am besten noch die Hintergrundgrafik anhängen.

    • Offizieller Beitrag

    Kannst du noch die Include anhängen, hab jetzt keine Lust mir die UDF von Progandy zu suchen.
    So mal als Tipp: Immer NichtstandardUDF an die Posts anhängen, dann wird dir schneller geholfen.

  • Hallo freaky,

    hier eine Lösung für dein Problem (Ich habe einfach in ein skript von UEZ, den GDI-Progress von @progandy eingesetzt):

    Spoiler anzeigen
    [autoit]

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

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

    Global $hGUI, $hImage, $hGraphic, $hImage
    Global Const $SC_DRAGMOVE = 0xF012
    Global $iImagePfad = @ScriptDir & "\", $i

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

    ; Create GUI
    $hGUI = GUICreate("Show PNG", 575, 300, -1, -1, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_TOPMOST)
    GUISetBkColor(0x01, $hGUI)
    GUISetState()
    _WinAPI_SetLayeredWindowAttributes($hGUI, 0x01, 0xFF, 3)

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

    ; Load PNG image
    _GDIPlus_StartUp()
    $hImage = _GDIPlus_ImageLoadFromFile($iImagePfad & "bg.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)

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

    #cs
    $Input1 = GUICtrlCreateInput("Input1", 156, 132, 121, 21)
    $Input2 = GUICtrlCreateInput("Input2", 156, 156, 121, 21)
    $Input3 = GUICtrlCreateInput("Input3", 156, 180, 121, 21)
    $Slider1 = GUICtrlCreateSlider(128, 212, 150, 45)
    $Button1 = GUICtrlCreateButton("Start", 208, 276, 75, 25)
    #ce
    $Progress1 = _ProgressCreate(20, 186, 292, 14)
    _ProgressSetColors($Progress1, 0x09B8F8, 0x09B8F8, 0xFFFFFF, 0xFFFFFF)

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

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    AdlibRegister("_IncProgress",1000)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $GUI_EVENT_PRIMARYDOWN
    _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
    EndSwitch
    WEnd

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

    Func _IncProgress()
    if $i < 100 Then $i+=1
    _ProgressSet($Progress1, $i)
    EndFunc

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

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

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

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

    [/autoit]

    dein Skript hat ja nicht einmal das Hintergrundbild angezeigt wenn mann GDI-Progress herausgenommen hat,

    mfg autoBert

  • Danke, aber ich benutze ein Bild als Hintergrund und mein Bild ist nicht 4 eckig wie im Beispiel sondern hat eine Form und ist eine PNG.
    Damit das Beispiel geht musst du bei GUICreate das ); entfernen ^^

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <GDIpProgress.au3>

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

    Global $iImagePfad = @ScriptDir & "\"

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

    _GDIPlus_Startup()

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

    $hGUI = GUICreate("Form", 450, 610, (@DesktopWidth / 2) - 400, -1, $WS_POPUP, $WS_EX_LAYERED)
    $hImage = _GDIPlus_ImageLoadFromFile( "bg.png")
    SetBitMap($hGUI, $hImage, 255)
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUISetState(@SW_SHOW, $hGUI)

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

    $Progress1 = _ProgressCreate(20, 186, 292, 14)
    _ProgressSetColors($Progress1, 0x09B8F8, 0x09B8F8, 0xFFFFFF, 0xFFFFFF)
    _ProgressSet($Progress1, 50)

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

    Sleep (5000)

    [/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", 1)
    _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 ;==>SetBitmap

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

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

    [/autoit]
  • gr

    Danke, aber ich benutze ein Bild als Hintergrund und mein Bild ist nicht 4 eckig wie im Beispiel sondern hat eine Form und ist eine PNG.
    Damit das Beispiel geht musst du bei GUICreate das ); entfernen ^^

    ich habe das Beispiel getestet und es käuft (im Gegensatz zu deinem(. Es ist auch das von dir gepostete Bild verwendet, einzig deine Gui-Grösse habe ich vergessen anzupassen, aber das wirst du ha noch alleine schaffen.
    Wenn es trotzdem nicht das ist was du willst, liegt es wohl daran dass deine Angaben fehlerhaft waren (Stil $WS_POPUP und dein bereitgestelltes Blld)

    mfg autoBert

  • Hallo Freaky,

    da du ja ein anderes Bikl als das von dir in Post #1 eingestellte verwendest, solltest du dueses auch einstellen. Da ich mit dem von dir eingestellten Bild, dein Problem

    Aber mein Bild ist ziehmlich verpixelt an den runden Kanten und Ecken.

    nicht habe, darfst du von mir auch vorher keinen Support hierfür erwarten, Falls du mein Beispiel angepasst hast, solltest du auch das aktuelle Skript einstellen,

    mfg autoBert

  • Sorry, aber mein Display hat nur 1024*600. Aber wenn du so abändxerst sollte es klappen:

    Spoiler anzeigen
    [autoit]

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

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

    Global $hGUI, $hImage, $hGraphic, $hImage
    Global Const $SC_DRAGMOVE = 0xF012
    Global $iImagePfad = @ScriptDir & "\", $i
    _GDIPlus_StartUp()
    ; Load PNG image
    $hImage = _GDIPlus_ImageLoadFromFile($iImagePfad & "bg.png")
    $iWidth = _GDIPlus_ImageGetWidth($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage)
    ConsoleWrite($iWidth & " / " & $iHeight)
    ; Create GUI
    $hGUI = GUICreate("Show PNG", $iWidth, $iHeight, 0,0, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_TOPMOST)
    GUISetBkColor(0x01, $hGUI)
    $Progress1 = _ProgressCreate(20, $iHeight-35, $iWidth-40, 27)
    _ProgressSetColors($Progress1, 0x09B8F8, 0x09B8F8, 0xFFFFFF, 0xFFFFFF)
    _ProgressSetFont($Progress1, "Courier New", 14)
    GUISetState()
    _WinAPI_SetLayeredWindowAttributes($hGUI, 0x01, 0xFF, 3)

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)

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

    #cs
    $Input1 = GUICtrlCreateInput("Input1", 156, 132, 121, 21)
    $Input2 = GUICtrlCreateInput("Input2", 156, 156, 121, 21)
    $Input3 = GUICtrlCreateInput("Input3", 156, 180, 121, 21)
    $Slider1 = GUICtrlCreateSlider(128, 212, 150, 45)
    $Button1 = GUICtrlCreateButton("Start", 208, 276, 75, 25)
    #ce

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

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    AdlibRegister("_IncProgress",1000)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $GUI_EVENT_PRIMARYDOWN
    _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
    EndSwitch
    WEnd

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

    Func _IncProgress()
    if $i < 100 Then $i+=1
    _ProgressSet($Progress1, $i)
    EndFunc

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

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

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

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

    [/autoit]

    mfg autoBert

  • Zitat

    und das was transparent ist, ist blau :(


    Nein, aber der Hintergrund ist schwarz und die haltransparenten blauen Pixel erscheinen dadurch dunkelblau ;).
    Ich glaube das was du machen möchtest lässt sich nicht so einfach realisieren. Transparente GUIs und GDI+ haben noch nie gut miteinander harmoniert. Es müsste gehen, wenn du ein Fenster für das Hintergrundbild erstellst und eines für die Progressbar. Um ein Beispiel zu schreiben bin ich jetzt aber leider zu müde ;). :sleeping:

  • Jetzt habe ich ein weißen Hintergrund


    genau dass habe ich do geschrieben:

    dann hast du wess an den Teilen an denen das Bild transparent ist,


    Dann musst du das Bild nachbearbeiten, an den Stellen mit den störrenden Effekten,

    Edit: Ich habe zu Testzwecken deine Bilder abgeändert, damit klappt es dann einwandfrei:
    autoit.de/wcf/attachment/11985/autoit.de/wcf/attachment/11987/

    mfg autoBert

  • Probiere es mal hier mit:

    Spoiler anzeigen
    [autoit]


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

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

    Global $hGUI, $hImage, $hGraphic, $hImage
    Global Const $SC_DRAGMOVE = 0xF012
    Global $iImagePfad = @ScriptDir & "\", $i
    _GDIPlus_StartUp()
    ; Load PNG image
    $hImage = _GDIPlus_ImageLoadFromFile($iImagePfad & "bg.png")
    $iWidth = _GDIPlus_ImageGetWidth($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage)
    ConsoleWrite($iWidth & " / " & $iHeight)
    ; Create GUI
    $hGUI = GUICreate("Show PNG", $iWidth, $iHeight, 0,0, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_TOPMOST)
    $hGUI_child = GUICreate("", $iWidth, $iHeight, 0, 0, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_TOPMOST + $WS_EX_MDICHILD, $hGUI)
    GUISetBkColor(0, $hGUI_child)
    GUISetState(@SW_SHOW, $hGUI)
    GUISetState(@SW_SHOW, $hGUI_child)
    SetTransparentBitmap($hGUI, $hImage)
    _WinAPI_SetLayeredWindowAttributes($hGUI_child, 0x00, 0xff)

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI_child)
    _GDIPlus_GraphicsFillEllipse($hGraphic, 0, 0, 100, 100)
    $Progress1 = _ProgressCreate(20, $iHeight-35, $iWidth-40, 27)
    _ProgressSetColors($Progress1, 0x09B8F8, 0x09B8F8, 0xFFFFFF, 0xFFFFFF)
    _ProgressSetFont($Progress1, "Courier New", 14)

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

    ;~ _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)

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

    #cs
    $Input1 = GUICtrlCreateInput("Input1", 156, 132, 121, 21)
    $Input2 = GUICtrlCreateInput("Input2", 156, 156, 121, 21)
    $Input3 = GUICtrlCreateInput("Input3", 156, 180, 121, 21)
    $Slider1 = GUICtrlCreateSlider(128, 212, 150, 45)
    $Button1 = GUICtrlCreateButton("Start", 208, 276, 75, 25)
    #ce

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

    GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN")
    ;~ GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    AdlibRegister("_IncProgress",1000)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd

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

    Func _IncProgress()
    if $i < 100 Then $i+=1
    _ProgressSet($Progress1, $i)
    EndFunc

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

    ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic)
    ;~ _GDIPlus_ImageDispose($hImage)
    _ProgressDelete($Progress1)
    _GDIPlus_ShutDown()
    Exit

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

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

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

    Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
    _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
    EndFunc ;==>_WM_LBUTTONDOWN

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

    Func SetTransparentBitmap($hGUI, $hImage, $iOpacity = 0xFF)
    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", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, 0, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
    EndFunc ;==>SetBitmap

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (23. Dezember 2010 um 00:13)

  • UEZ vielen Dank, das ist mal ein Beispiel was sogar mit meienm Bild funktioniert.
    Ich werde das jetzt mal in mein anderes Script bauen und gucken wie es wird.

    Wenn ich probleme dabei haben werde, wende ich mich hier wieder.