GUI nach minimieren weg

  • Kaum hab ich mein erstes Problem gelöst, kommt schon das nächste.
    Wenn ich meine GUI minimiere, und dann wieder über die Taskbar öffne, ist nur noch mein Hintergrundbild da, alles andere ist weg.
    Wie kann ich die GUI neu zeichnen lassen, wenn man sie über die Taskbar wieder sichtbar macht ?
    Mit

    [autoit]

    GUIRegisterMsg(0x000F,"_gui")

    [/autoit]


    Wird meine GUI dauerhaft neu gezeichnet, das bringt mir nix..
    Mit

    [autoit]

    GUISetOnEvent($GUI_EVENT_RESTORE, "_gui",$GUISUB)
    GUISetOnEvent($GUI_EVENT_RESTORE, "_gui",$GUI)

    [/autoit]


    passiert auch nix..
    Hier mein Script:
    [Spoiler]

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    #include <ButtonConstants.au3>
    Opt("TrayMenuMode", 1 + 2)
    FileInstall("logo.png", @TempDir & "\logo.png", 1)
    FileInstall("Buttons/about.png", @TempDir & "\about.png", 1)
    FileInstall("Buttons/cheats.png", @TempDir & "\cheats.png", 1)
    FileInstall("Buttons/donate.png", @TempDir & "\donate.png", 1)
    FileInstall("Buttons/findgames.png", @TempDir & "\findgames.png", 1)
    FileInstall("Buttons/forum.png", @TempDir & "\forum.png", 1)
    FileInstall("Buttons/forumlogin.png", @TempDir & "\forumlogin.png", 1)
    FileInstall("Buttons/help.png", @TempDir & "\help.png", 1)
    FileInstall("Buttons/helpthread.png", @TempDir & "\helpthread.png", 1)
    FileInstall("Buttons/language.png", @TempDir & "\language.png", 1)
    FileInstall("Buttons/modifications.png", @TempDir & "\modifications.png", 1)
    FileInstall("Buttons/mods.png", @TempDir & "\mods.png", 1)
    FileInstall("Buttons/open premium options.png", @TempDir & "\open premium options.png", 1)
    FileInstall("Buttons/patchcheck.png", @TempDir & "\patchcheck.png", 1)
    FileInstall("Buttons/play.png", @TempDir & "\play.png", 1)
    FileInstall("Buttons/projects.png", @TempDir & "\projects.png", 1)
    FileInstall("Buttons/trainer.png", @TempDir & "\trainer.png", 1)
    FileInstall("Buttons/upgrade to premium.png", @TempDir & "\upgrade to premium.png", 1)
    FileInstall("Buttons/visit homepage.png", @TempDir & "\visit homepage.png", 1)
    fileinstall("reiter+exit+minimize/downloadsdark.png",@TempDir & "\downloadsdark.png",1)
    fileinstall("reiter+exit+minimize/downloadswhite.png",@TempDir & "\downloadswhite.png",1)
    fileinstall("reiter+exit+minimize/infosdark.png",@TempDir & "\infosdark.png",1)
    fileinstall("reiter+exit+minimize/infoswhite.png",@TempDir & "\infoswhite.png",1)
    fileinstall("reiter+exit+minimize/newsdark.png",@TempDir & "\newsdark.png",1)
    fileinstall("reiter+exit+minimize/newswhite.png",@TempDir & "\newswhite.png",1)
    fileinstall("reiter+exit+minimize/minimize.png",@TempDir & "\minimize.png",1)
    fileinstall("reiter+exit+minimize/close.png",@TempDir & "\close.png",1)
    Global $PNGSRCGUIBK = @TempDir & "\logo.png"
    Global $show = False
    Global Const $AC_SRC_ALPHA = 1
    Global Const $PROCESS_SUSPEND_RESUME = 2048
    Global Const $PROCESS_TERMINATE = 1
    Global $tray1 = TrayCreateItem("Hide/Restore")
    Global $tray2 = TrayCreateItem("Exit")
    _gui()
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $Button1
    _play()
    Case $Button23
    ENDE()
    Case $Button22
    _hr()
    EndSwitch
    $TMSG = TrayGetMsg()
    switch $TMSG
    case $tray1
    _hr()
    case $tray2
    ENDE()
    EndSwitch
    WEnd

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

    func _hr()
    if $show = True then
    WinSetState($GUI, "", @SW_MINIMIZE)
    WinSetState($GUISUB, "", @SW_MINIMIZE)
    $show = False
    Else
    GUISetState(@SW_SHOW, $GUI)
    GUISetState(@SW_SHOW, $GUISUB)
    $show = True
    EndIf
    EndFunc

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

    func _gui()
    guidelete()
    Global $GUI = GUICreate("", 550, 700, -1, -1, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_LAYERED))
    _GDIPlus_Startup()
    Global $HIMAGEGUIBK = _GDIPlus_ImageLoadFromFile($PNGSRCGUIBK)
    SETBITMAP($GUI, $HIMAGEGUIBK, 255)
    Global $GUISUB = GUICreate("", 550, 700, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $GUI)
    GUISetBkColor(5789784)
    _WinAPI_SetLayeredWindowAttributes($GUISUB, 5789784)
    ;gta sa
    Global $Button1 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\play.png", 27, 173)
    Global $Button2 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\patchcheck.png", 27, 209)
    Global $Button3 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\helpthread.png", 27, 246)
    Global $Button4 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\trainer.png", 27, 282)
    Global $Button5 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\cheats.png", 27, 318)
    Global $Button6 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\mods.png", 27, 354)
    ;options
    Global $Button7 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\upgrade to premium.png", 27, 450)
    Global $Button8 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\findgames.png", 27, 486)
    Global $Button9 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\modifications.png", 27, 522)
    Global $Button10 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\language.png", 27, 558)
    Global $Button11 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\help.png", 27, 594)
    Global $Button12 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\help.png", 27, 630)
    ;
    Global $Button13 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\visit homepage.png", 27, 727)
    Global $Button14 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\projects.png", 27, 763)
    Global $Button15 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\about.png", 27, 799)
    Global $Button16 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\forum.png", 27, 835)
    Global $Button17 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\donate.png", 27, 871)
    Global $Button18 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\help.png", 27, 907)
    ;reiter
    Global $Button19 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\downloadswhite.png", 350,548)
    Global $Button20 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\infosdark.png", 467,548)
    Global $Button21 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\newsdark.png", 584,548)
    ;minimize+close
    Global $Button22 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\minimize.png", 950,35)
    Global $Button23 = _GuiCtrlCreatePic($GUISUB,@TempDir & "\close.png", 975,30)
    GUISetState(@SW_SHOW, $GUI)
    GUISetState(@SW_SHOW, $GUISUB)
    $show = True
    EndFunc

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

    func _play()
    msgbox(0,"","play gedrückt")
    if IniRead(@TempDir &"\inferno.ini","gta","true","1") = 1 Then
    $launcher = fileopendialog("Select GTA.exe","","*.exe",3)
    Iniwrite(@TempDir &"\inferno.ini","gta","true","2")
    iniwrite(@TempDir &"\inferno.ini","launcher","launcher",$launcher)
    Else
    $launcher = iniread(@TempDir &"\inferno.ini","launcher","launcher","1")
    ShellExecute($launcher)
    EndIf
    EndFunc
    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, $HSCRDC, 0, $PSIZE, $HMEMDC, $PSOURCE, 0, $PBLEND, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $HSCRDC)
    _WinAPI_SelectObject($HMEMDC, $HOLD)
    _WinAPI_DeleteObject($HBITMAP)
    _WinAPI_DeleteDC($HMEMDC)
    EndFunc ;==>SETBITMAP
    Func ENDE()
    GUIDelete()
    GUIDelete()
    Exit
    EndFunc ;==>ENDE

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

    Func _GuiCtrlCreatePic($gGui, $iPicture, $iX = 0, $iY = 0)
    $gImage = _GDIPlus_ImageLoadFromFile($iPicture)
    $gWidth = _GDIPlus_ImageGetWidth($gImage)
    $gHeight = _GDIPlus_ImageGetHeight($gImage)

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

    $iGui = GUICreate("", $gWidth, $gHeight, $iX, $iY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gGui)
    $iLabel = GUICtrlCreateLabel("", 0, 0, $gWidth, $gHeight)
    GUISetBkColor(0, $iGui)
    GUISetState(@SW_SHOW, $iGui)
    SetTransparentBitmap($iGui, $gImage)

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

    ;~ Local $iReturn[6] = [0, SetError(0, $iGui, $iLabel), $iX, $iY, $gWidth, $gHeight]

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

    Return SetError(0, $iGui, $iLabel)
    EndFunc

    [/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 ;==>SetTransparentBitmap

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

    (/Spoiler]

    Einmal editiert, zuletzt von v1Dr333s (3. Januar 2013 um 18:58)

  • omg,
    mehr sag ich mal zum script nicht

    GDI+ zeichnet bei dir deine bildchen nur einmalig in die gui's und dann nie wieder
    wird die gui einmal minimiert ist dadurch alles weg
    du musst es selbst via GDI neu zeichnen

    schau dir mal diese nette funktion an

    [autoit]

    #include <GDIPlus.au3> ; wird benötigt

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

    Func GUICtrlCreatePng($iPNG_Path, $iPNG_Top = "", $iPNG_Left = "")
    _GDIPlus_Startup()
    Local $hImagePNG = _GDIPlus_ImageLoadFromFile($iPNG_Path)
    Local $iPNG_Width = _GDIPlus_ImageGetWidth($hImagePNG)
    Local $iPNG_Height = _GDIPlus_ImageGetHeight($hImagePNG)
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImagePNG)

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

    Local $cPNG_PIC = GUICtrlCreatePic("", $iPNG_Left, $iPNG_Top, $iPNG_Width, $iPNG_Height)

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

    GUICtrlSendMsg($cPNG_PIC, 0x0172, 0, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($hImagePNG)
    _GDIPlus_Shutdown()

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

    Return $cPNG_PIC
    EndFunc ;==>GUICtrlCreatePng

    [/autoit]


    damit kannst du PNG datein als normales Pic ctrl erstellen (auch mit transparents etc.)
    und das kannst du ganz normal als Ctrl behandeln, GUICtrlSetOnEvent etc.
    und du musst nix neuzeichnen, passiert automatisch weil es ein picctrl halt ist :)

    mfg

  • omg,
    mehr sag ich mal zum script nicht

    GDI+ zeichnet bei dir deine bildchen nur einmalig in die gui's und dann nie wieder
    wird die gui einmal minimiert ist dadurch alles weg
    du musst es selbst via GDI neu zeichnen


    ach was, das problem hab ich nicht oben beschrieben ?
    ...

    ich hatte eigentlich nicht vor, meine gui anders darzustellen, gibt es keine möglichkeit zu sagen, wenn man das programm über die taskleiste wieder öffnet, dann wird die und die funktion aufgerufen ?

  • Da du deine PNG-Dateien nicht beigelegt hast kann man dein Skript (ohne unnötigen Aufwand)nicht testen. Du solltest dich einmal nach Großvater's GUICreateTransparent.au3 und GUICtrlPic.au3 umschauen. Diese beiden UDF's eignen sich wundebar für deinen Zweck.

    Edit: die verwendenten Bildnamen (cheats, trainer etc.) lassen eh Zweifel an der Forenregen Kompatibilität aufkommen.

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (3. Januar 2013 um 19:40)

  • GUISetOnEvent($GUI_EVENT_RESTORE, "_gui",$GUI)
    funktioniert bei mir wunderbar

    aber das reicht nicht, du musst deine Bilder immer neuzeichnen, wenn die GUI neugezeichnet wird, also:
    GUIRegisterMsg($WM_PAINT, "funktion")
    (einfach mal in die suche eingeben, da findet man einiges zu)

    aber das ist sehr suboptimal, weil du jedesmal mit _GuiCtrlCreatePic() eine neue GUI erstellst
    das bedeutet beim neuzeichnen musst du auch die alte gui löschen! also GUIDelete()

    also ich empfehle die dringend dein programm umzustellen, weil so wirst du nicht weit kommen
    guck dir am bessten mal die UDF's an die autoBert erwähnt hat :)

    mfg


  • Edit: die verwendenten Bildnamen (cheats, trainer etc.) lassen eh Zweifel an der Forenregen Kompatibilität aufkommen.


    Es wird ein Programm, das andere Programme öffnet, also nicht direkt ein trainer oder cheat, dürfte eigentlich kein problem mit den forenregeln geben..
    danke für eure hilfe, werd ich mir mal angucken :)