Pic reapeat als GUI Hintergrund (ala CSS bei HTML)

  • Hier noch eine andere Variante:

    Spoiler anzeigen
    [autoit]


    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #Include <WinAPIEx.au3>
    #include <WindowsConstants.au3>

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

    Global $hGraphic, $hBitmap, $hBackbuffer, $hImage, $hTexture, $hBMP
    Global Const $STM_SETIMAGE = 0x0172, $vGUIWidth = 400, $vGUIHeight = 400

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

    #region GDI+
    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\test.jpg")
    $iW = _GDIPlus_ImageGetWidth($hImage)
    $iH = _GDIPlus_ImageGetHeight($hImage)
    $hGraphic= _GDIPlus_GraphicsCreateFromHWND(WinGetHandle(AutoItWinGetTitle()))
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($vGUIWidth, $vGUIHeight, $hGraphic)
    $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $hTexture = _GDIPlus_TextureCreate($hImage)
    _GDIPlus_GraphicsFillRect($hContext , 0, 0, $vGUIWidth, $vGUIHeight, $hTexture)
    $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    #endregion

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

    Global $hGUI = GUICreate("", $vGUIWidth, $vGUIHeight)
    GUISetBkColor(0x000000, $hGUI)
    Global $Pic = GUICtrlCreatePic("", 0, 0)
    GUICtrlSendMsg($Pic, $STM_SETIMAGE, 0, $hBmp)
    GUICtrlSetState(-1, $GUI_DISABLE)

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

    Global $b = GUICtrlCreateButton("Exit", 10, $vGUIHeight - 50)

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

    Global $lv = GUICtrlCreateListView("SPALTE1|SPALTE2", 10, 10, 200, 200, $LVS_NOCOLUMNHEADER)
    GUICtrlSetBkColor(-1, 0xE0E0F0)
    GUICtrlSetColor(-1, 0x002000)
    _GuiCtrlMakeTrans(-1, 0xE0)

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

    _SetXPStyle(0)
    Global $g = GUICtrlCreateGroup("Gruppe1", 220, 10, 160, 150)
    GUICtrlSetColor(-1, 0x000040)
    GUICtrlSetBkColor(-1, -2);...
    _SetXPStyle(1)

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

    GUISetState()

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

    For $i = 0 To 50
    _GUICtrlListView_AddItem($lv, Random(0x111111, 0xFFFFFF, 1))
    Next

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

    Do
    Until GUIGetMsg() = -3

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

    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_BrushDispose($hTexture)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    GUIDelete($hGUI)
    Exit

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

    Func _SetXPStyle($b_Set = 1); 0 = deactivate, 1 = activate
    DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", $b_Set * 7)
    EndFunc

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

    Func _GDIPlus_TextureCreate($hImage, $iWrapMode = 0)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateTexture", "hwnd", $hImage, "int", $iWrapMode, "int*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aResult[3]
    EndFunc ;==>_GDIPlus_TextureCreate

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

    Func _GuiCtrlMakeTrans($iCtrlID, $iTrans=255)
    Local $pHwnd, $nHwnd, $aPos, $a
    $hWnd = GUICtrlGetHandle($iCtrlID);Get the control handle
    If $hWnd = 0 then Return SetError(1,1,0)
    $pHwnd = DllCall("User32.dll", "hwnd", "GetParent", "hwnd", $hWnd);Get the parent Gui Handle
    If $pHwnd[0] = 0 then Return SetError(1,2,0)
    $aPos = ControlGetPos($pHwnd[0],"",$hWnd);Get the current pos of the control
    If @error then Return SetError(1,3,0)
    $nHwnd = GUICreate("", $aPos[2], $aPos[3], $aPos[0], $aPos[1], 0x80000000, 0x00080000 + 0x00000040, $pHwnd[0]);greate a gui in the position of the control
    If $nHwnd = 0 then Return SetError(1,4,0)
    $a = DllCall("User32.dll", "hwnd", "SetParent", "hwnd", $hWnd, "hwnd", $nHwnd);change the parent of the control to the new gui
    If $a[0] = 0 then Return SetError(1,5,0)
    If NOT ControlMove($nHwnd,'',$hWnd,0,0) then Return SetError(1,6,-1);Move the control to 0,0 of the newly created child gui
    GUISetState(@SW_Show,$nHwnd);show the new child gui
    WinSetTrans($nHwnd,"",$iTrans);set the transparency
    If @error then Return SetError(1,7,0)
    GUISwitch($pHwnd[0]);switch back to the parent Gui
    Return $nHwnd;Return the handle for the new Child gui
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯


  • Warum ? Hast du was gegen Child GUI's ?


    Wenn du so direkt fragst, eigentlich ja.

    Hatte damals in einem anderen Programm schonmal mit Child GUI's gearbeitet. Wenn jetzt z.B. das Fenster kurz hängt (passiert häufig bei mir wenn ich mit FTP's arbeite, oder auch bei anderen Funktionen) und Windows das Fenster solange deaktiviert und grau färbt, dann verschiebt Windows die HauptGUI, aber nicht das Child, sodass das Child hinterher nicht mehr genau da sitzt, wo es ursprünglich war.
    Außerdem: Wenn man das Hauptfenster minimiert und dann wieder anzeigen lässt, ist das Child augenblicklich sichtbar während sich das Hauptfenster noch aufbaut -> sieht doof aus^^

  • Ich bins nochma, mit etwas anderem:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    $hGUI=GUICreate("", 500, 500)
    GUISetBkColor(0xFF0000)
    $hPic = GUICtrlCreatePic("", 100, 100, 300, 300)
    GUISetState()

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

    Sleep(2000)
    _GDIPlus_Startup()
    $hGraphic=_GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($hPic))

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

    $hImage=_GDIPlus_ImageLoadFromFile("bg.jpg")

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

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

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

    Sleep(2000)

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

    Do
    Until GUIGetMsg() = -3

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

    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

    [/autoit]


    Wie kriege ich es jetzt hin, mit GraphicsClear (nach dem zweiten Sleep) die Grafik zu leeren, sodass der Hintergrund dahinter sichtbar ist? Die Grafik selbst soll nicht rot werden, sondern durchsichtig.

  • Ich verstecke das Control jetzt einfach. Bleibt GraphicsClear halt weg.
    Aber habe soeben ein neues Problem...

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

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

    $hGUI = GUICreate("")
    GUISetBkColor(0xDDDDDD)

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

    $vChildGUIColor = 0x000000

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

    $hGUIListView = GUICreate("", 178, 150, 100, 110, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_MDICHILD, $hGUI)
    GUISetBkColor($vChildGUIColor, $hGUIListView)

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

    $hSBotList = GUICtrlCreateListView(" ", 0, 0, 178, 150, $LVS_NOCOLUMNHEADER)
    GUICtrlSetBkColor(-1, $vChildGUIColor)
    _GUICtrlListView_SetColumnWidth($hSBotList, 0, 160)
    _GUICtrlListView_SetColumnWidth($hSBotList, 1, 0)

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

    _WinAPI_SetLayeredWindowAttributes($hGUIListView, $vChildGUIColor)

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

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

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

    For $i = 0 To 50
    GUICtrlCreateListViewItem(Random(0x111111, 0xFFFFFF, 1), $hSBotList)
    GUICtrlSetColor(-1, 0xff0000)
    Next

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

    Do
    Until GUIGetMsg() = -3

    [/autoit]


    Der Code stammt ja von UEZ (habe den ein bisschen geändert.
    Wenn man das jetzt startet, kann man oft die Items in der Liste nicht anklicken! Manchmal klappts allerdings. Nur ist das ja nicht Sinn der Sache...
    Es liegt an der Farbe, die im Child als Hintergrund für GUI und Control dient und mit die man in _WinAPI_SetLayeredWindowAttributes benutzt (im Code also $vChildGUIColor).
    Ist diese 0x000000, so tritt das Problem auf. Ist diese 0xABCDEF (wie sie standartmäßig bei UEZ war), tritt das Problem nicht auf =O

    Für mich ist es wichtig, 0x000000 nutzen zu können, damit die Schrift gut lesbar ist.
    Also woran liegt das und kann man das fixen?

    MfG
    NoName

  • Setze mal $vChildGUIColor = 0xDDDDDE. Dann ist auch die Schrift lesbar und die Liste ist auch anklickbar.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ok.
    Kannst du mir erklären, warum das so ist?

    Und liege ich richtig in der Annahme, dass ich für $vChildGUIColor einfach nur die Hintergrundfarbe für die HauptGUI + 1 nehmen muss?

  • Ok.
    Kannst du mir erklären, warum das so ist?

    Und liege ich richtig in der Annahme, dass ich für $vChildGUIColor einfach nur die Hintergrundfarbe für die HauptGUI + 1 nehmen muss?


    Die Farben müssen sich unterscheiden und Hauptfarbe + 1 ist eben am nächsten und macht die Schrift lesbar.

    Genauso gut könntest du auch -1 nehmen.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich bins wieder, mit einem neuen Problem:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    _GDIPlus_Startup()

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

    $hGUI = GUICreate("")
    GuiSetBKPicRepeat($hGUI, "stripes.jpg")

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

    $hPic = GUICtrlCreatePic("", 94, 94, 212, 212)
    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bild.jpg")
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)

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

    $hNewBitmapHandleMap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _SM_SetBitmapToCtrl(GUICtrlGetHandle($hPic), $hNewBitmapHandleMap)

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

    _WinAPI_DeleteObject($hNewBitmapHandleMap)
    _GDIPlus_BitmapDispose($hImage)

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

    GUISetState()

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

    Do
    $vCursor = GUIGetCursorInfo($hGUI)
    If IsArray($vCursor) Then ToolTip($vCursor[4] & @CRLF & $hPic)
    Until GUIGetMsg() = -3

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

    _GDIPlus_Shutdown()

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

    Func _SM_SetBitmapToCtrl($h_CtrlHandle, $h_Bitmap)
    Local $v_Return = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $h_CtrlHandle, "int", 0x0172, "int", 0, "int", $h_Bitmap)
    If $v_Return[0] <> 0 Then _WinAPI_DeleteObject($v_Call[0])
    EndFunc ;==>_SM_SetBitmapToCtrl

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

    Func GuiSetBKPicRepeat($hWnd, $sFile)
    $aPos = WinGetPos($hWnd)
    $hBit = _GDIPlus_BitmapCreateFromFile($sFile)
    $iH = _GDIPlus_ImageGetHeight($hBit)
    $iW = _GDIPlus_ImageGetWidth($hBit)
    _GDIPlus_BitmapDispose($hBit)
    For $i = 0 To $aPos[2] Step $iW
    For $j = 0 To $aPos[3] Step $iH
    GUICtrlCreatePic($sFile,$i,$j,$iW,$iH)
    GUICtrlSetState(-1,128);disable
    Next
    Next
    EndFunc

    [/autoit]


    Ich nutze jetzt die Methode mit vielen Controls, da GDI+ einige Probleme mit anderen Controls aufweist.
    Jetzt ist es allerdings so, dass das PicControl nicht oben ist. Also mit GUIGetCurserInfo frage ich das Control ab, über dem die Maus ist, wenn es über dem Pic ist, soll etwas bestimmtes passieren. Wenn man die Hintergrundbilder ausklammert (GuiSetBKPicRepeat($hGUI, "stripes.jpg")), klappt es ja auch, mit denen aber nicht.
    Wenn ich die Grafik direkt über das Pic Control erstelle funktioniert es zwar, allerdings muss ich das Bild dann drawen -> mehr CPU Auslastung (da ich in Wirklichkeit ein größeres Bild benutze).

    Jemand eine Idee?

    Das [Blockierte Grafik: http://img5.imagebanana.com/img/7n6rgmek/stripes.jpg] und das [Blockierte Grafik: http://img5.imagebanana.com/img/9o3fqrjr/bild.jpg] wird benötigt.