Button OnTop, über Pic Control

  • Hallo.

    Also, ich habe ein Pic Control, das ich mit GDI+ Funktionen mit Bildern fülle. Auf dem PicControl soll ein Button sein. Dadurch, dass die Bilder immer erneuert werden, wirkt auch das Ontop Attribut auf Controls nicht so auf den Button, wie ich es gern hätte, also bei einem neuen Bild ist der Button weg, wenn man mit der Maus rübergeht wieder da. Hier mal ein simples Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    _GDIPlus_Startup()

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

    Dim $bTimer = True

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

    GUICreate("test", 200, 200)
    $Pic = GUICtrlCreatePic("", 0, 0, 200, 200)

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

    $ButtnHelp = GUICtrlCreateButton("?", 0, 0, 20, 20)
    GUICtrlSetState(-1, 2048) ;OnTop

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $ButtnHelp
    MsgBox(0,"","Button geklickt")
    Case -3
    _GDIPlus_Shutdown()
    Exit
    EndSwitch

    If $bTimer = True Then
    $vTimer = TimerInit()
    $bTimer = False
    EndIf

    If TimerDiff($vTimer) >= 2000 Then
    CreatePic()
    $bTimer = True
    EndIf
    Sleep(50)
    WEnd

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

    Func CreatePic()
    $hWnd = GUICtrlGetHandle($Pic)
    $hGraphicGUI = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hImage = _GDIPlus_BitmapCreateFromGraphics(200, 200, $hGraphicGUI)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
    _GDIPlus_GraphicsClear($hGraphic, 0xFF000000)

    $hBitmap = _GDIPlus_ImageLoadFromFile("bild.jpg")
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBitmap, Random(0, 213), Random(0, 100), 200, 200, 0, 0, 200, 200)

    $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $vCall = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", 0x0172, "int", 0, "int", $hBitmap2)
    ;_WinAPI_RedrawWindow($hGUI, "", "", BitOR(0x0001, 0x0100, 0x0400))

    If $vCall[0] <> 0 Then _WinAPI_DeleteObject($vCall[0])
    _WinAPI_DeleteObject($hBitmap2)
    _GDIPlus_GraphicsDispose($hGraphicGUI)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hImage)
    _GDIPlus_BitmapDispose($hBitmap)
    EndFunc

    [/autoit]

    Hier das Bild:
    [Blockierte Grafik: http://www.imagebanana.com/img/tm1o9a00/bild.jpg]

    Das Bild muss im selben Ordner sein wie das Script und "bild.jpg" heißen.
    Was für Alternativen gibt es für mich?

    MfG NoName

    Einmal editiert, zuletzt von NoName (3. Februar 2010 um 23:59)

  • Die Teile die geschnitten werden sind aber Random. Also sie sind jedesmal anders^^ (s. Beispiel)

  • WinAPI_RedrawWindow hat nicht geholfen.

    Das mit der ExtraGUI Funktioniert! Wenn man allerdings minimiert und das Fenster wieder aufruft, dauert es ja etwas, bis das Fenster wieder da ist (Windows-Effekt), Der Button ist allerdings sofort da.. Lässt sich da noch eine Schönheitskorrektur machen?^^

    Code

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    _GDIPlus_Startup()

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

    Dim $bTimer = True

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

    $hGUI = GUICreate("test", 200, 200)
    $Pic = GUICtrlCreatePic("", 0, 0, 200, 200)

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

    $hGUIButton = GUICreate("", 20, 20, 0, 0, 0x80880000, 0x00000040, $hGUI) ;$WS_POPUPWINDOW, $WS_EX_MDICHILD
    $ButtnHelp = GUICtrlCreateButton("?", 0, 0, 20, 20)

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

    GUISetState(@SW_SHOW, $hGUI)
    GUISetState(@SW_SHOW, $hGUIButton)

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

    While 1
    Switch GUIGetMsg()
    Case $ButtnHelp
    MsgBox(0,"","Button geklickt")
    Case -3
    _GDIPlus_Shutdown()
    Exit
    EndSwitch

    If $bTimer = True Then
    $vTimer = TimerInit()
    $bTimer = False
    EndIf

    If TimerDiff($vTimer) >= 2000 Then
    CreatePic()
    $bTimer = True
    EndIf
    Sleep(50)
    WEnd

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

    Func CreatePic()
    $hWnd = GUICtrlGetHandle($Pic)
    $hGraphicGUI = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hImage = _GDIPlus_BitmapCreateFromGraphics(200, 200, $hGraphicGUI)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
    _GDIPlus_GraphicsClear($hGraphic, 0xFF000000)

    $hBitmap = _GDIPlus_ImageLoadFromFile("bild.jpg")
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBitmap, Random(0, 213), Random(0, 100), 200, 200, 0, 0, 200, 200)

    $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $vCall = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", 0x0172, "int", 0, "int", $hBitmap2)

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

    If $vCall[0] <> 0 Then _WinAPI_DeleteObject($vCall[0])
    _WinAPI_DeleteObject($hBitmap2)
    _GDIPlus_GraphicsDispose($hGraphicGUI)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($hImage)
    _GDIPlus_BitmapDispose($hBitmap)
    EndFunc

    [/autoit]

    Edit: Ich merke gerade, dass es nicht die beste Lösung ist, da ich in vielen Situationnen die GUI Hide, wieder zeige, und es noch andere Childs gibt. Ich müsste also an vielen Stellen Code verändern, weil der Button sichtbar bleibt, wenn ich das Hauptfenster Hide.
    Bin auch für weitere Vorschläge offen.

    Kann ich einem Childfenster nicht sagen, dass es sich genauso verhalten soll wie das Hauptfenster? Also ich Hide das Hauptfenster -> Child hidet sich auch usw. Es ist ja auch fest fixiert auf dem Hauptfenster.

    Edit: Ich habe das jetzt mit dem Child eingebaut, aufwändig, aber es funktioniert. Danke für deine Hilfe!

    2 Mal editiert, zuletzt von NoName (4. Februar 2010 um 00:00)