Button bleibt trotz Tab-Wechsel da

  • Ich habe eine Gui mit Hintergrundbild und 3 Tabs. Wenn ich einen Button erstelle im 1. Tab, dann bleibt er wenn ich in den 2. bzw. 3. wechsel da. Im 2. und 3. kann ich ihn erst gar nicht erstellen.
    Was muss ich ändern?

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    #include <GuiTab.au3>
    #include <TabConstants.au3>
    #include <WinAPIEx.au3>
    #include <WindowsConstants.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global Const $STM_GETIMAGE = 0x0173
    Global Const $PRF_CLIENT = 0x04

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

    Global $hPic, $hTab, $hDll, $pDll, $hProc

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

    GUICreate('MyGUI', 300, 300)
    GUICtrlCreatePic(@ScriptDir & '\Tech.bmp', 0, 0, 300, 300, $WS_CLIPCHILDREN)
    $hPic = GUICtrlGetHandle(-1)
    GUICtrlCreateTab(20, 20, 262, 261, $TCS_FOCUSONBUTTONDOWN)
    $hTab = GUICtrlGetHandle(-1)
    GUICtrlCreateTabItem('Tab 1')
    GUICtrlCreateButton("",100,100,20,20)
    GUICtrlCreateTabItem('Tab 2')
    GUICtrlCreateTabItem('Tab 3')
    GUICtrlCreateTabItem('')

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

    $hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
    $pDll = DllCallbackGetPtr($hDll)
    $hProc = _WinAPI_SetWindowLongEx($hTab, $GWL_WNDPROC, $pDll)

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

    _WinAPI_SetParent($hTab, $hPic)

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

    OnAutoItExitRegister('AutoItExit')

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

    GUISetState()

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

    Do
    Until GUIGetMsg() = -3

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

    Func _CreateClipRgn($hWnd)

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

    Local $tRect
    Local $Count = _GUICtrlTab_GetItemCount($hWnd)
    Local $Sel = _GUICtrlTab_GetCurSel($hWnd)
    Local $hRgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    Local $hTmp, $Ht

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

    For $i = 0 To $Count - 1
    $tRect = _GUICtrlTab_GetItemRectEx($hWnd, $i)
    If $i = $Sel Then
    $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRect, 1) - 2, DllStructGetData($tRect, 2) - 2, DllStructGetData($tRect, 3) + 2, DllStructGetData($tRect, 4))
    $Ht = DllStructGetData($tRect, 4) - DllStructGetData($tRect, 2) + 2
    Else
    If $i = $Count - 1 Then
    $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRect, 1), DllStructGetData($tRect, 2), DllStructGetData($tRect, 3) - 2, DllStructGetData($tRect, 4))
    Else
    $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRect, 1), DllStructGetData($tRect, 2), DllStructGetData($tRect, 3), DllStructGetData($tRect, 4))
    EndIf
    EndIf
    _WinAPI_CombineRgn($hRgn, $hRgn, $hTmp, $RGN_OR)
    _WinAPI_DeleteObject($hTmp)
    Next
    $tRect = _WinAPI_GetClientRect($hWnd)
    $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRect, 1), DllStructGetData($tRect, 2) + $Ht, DllStructGetData($tRect, 3) - 2, DllStructGetData($tRect, 4) - 1)
    _WinAPI_CombineRgn($hRgn, $hRgn, $hTmp, $RGN_OR)
    _WinAPI_DeleteObject($hTmp)
    Return $hRgn
    EndFunc ;==>_CreateClipRgn

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

    Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
    Local Const $WM_PRINTCLIENT = 0x0318
    If _WinAPI_IsThemeActive() Then
    Switch $iMsg
    Case $WM_ERASEBKGND
    Local $tRect[2]
    Local $hParent = _WinAPI_GetParent($hWnd)
    Local $hRgn = _CreateClipRgn($hWnd)
    Local $hPrev = _WinAPI_GetClipRgn($wParam)
    $tRect[0] = _WinAPI_GetWindowRect($hParent)
    $tRect[1] = _WinAPI_GetWindowRect($hWnd)
    _WinAPI_ExtSelectClipRgn($wParam, $hRgn, $RGN_DIFF)
    _WinAPI_DrawBitmap($wParam, DllStructGetData($tRect[0], 1) - DllStructGetData($tRect[1], 1), DllStructGetData($tRect[0], 2) - DllStructGetData($tRect[1], 2), _SendMessage($hParent, $STM_GETIMAGE))
    _WinAPI_SelectClipRgn($wParam, $hPrev)
    _WinAPI_DeleteObject($hRgn)
    Return 1
    Case $WM_PAINT
    Local $tPaint
    Local $hDC = _WinAPI_BeginPaint($hWnd, $tPaint)
    Local $hRgn = _CreateClipRgn($hWnd)
    _WinAPI_ExtSelectClipRgn($hDC, $hRgn, $RGN_AND)
    _WinAPI_CallWindowProc($hProc, $hWnd, $WM_PRINTCLIENT, $hDC, $PRF_CLIENT)
    _WinAPI_DeleteObject($hRgn)
    _WinAPI_EndPaint($hWnd, $tPaint)
    Return 0
    EndSwitch
    EndIf
    Return _WinAPI_CallWindowProc($hProc, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc ;==>_WinProc

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

    Func AutoItExit()
    _WinAPI_SetWindowLongEx($hTab, $GWL_WNDPROC, $hProc)
    DllCallbackFree($hDll)
    EndFunc ;==>AutoItExit

    [/autoit]
  • Spoiler anzeigen
    [autoit]


    #include <Constants.au3>
    #include <GuiTab.au3>
    #include <TabConstants.au3>
    #include <WinAPIEx.au3>
    #include <WindowsConstants.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global Const $STM_GETIMAGE = 0x0173
    Global Const $PRF_CLIENT = 0x04

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

    Global $hPic, $hTab, $hDll, $pDll, $hProc

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

    GUICreate('MyGUI', 300, 300)
    GUICtrlCreatePic(@ScriptDir & '\Tech.bmp', 0, 0, 300, 300, $WS_CLIPCHILDREN)
    $hPic = GUICtrlGetHandle(-1)
    GUICtrlCreateTab(20, 20, 262, 261, $TCS_FOCUSONBUTTONDOWN)
    GUICtrlCreateTabItem('Tab 1')
    $hTab = GUICtrlGetHandle(-1)
    GUICtrlCreateButton("",100,100,20,20)
    GUICtrlCreateTabItem('Tab 2')
    GUICtrlCreateTabItem('Tab 3')
    GUICtrlCreateTabItem('')

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

    $hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
    $pDll = DllCallbackGetPtr($hDll)
    $hProc = _WinAPI_SetWindowLongEx($hTab, $GWL_WNDPROC, $pDll)

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

    ;_WinAPI_SetParent($hTab, $hPic)

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

    OnAutoItExitRegister('AutoItExit')

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

    GUISetState()

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

    Do
    Until GUIGetMsg() = -3

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

    Func _CreateClipRgn($hWnd)

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

    Local $tRect
    Local $Count = _GUICtrlTab_GetItemCount($hWnd)
    Local $Sel = _GUICtrlTab_GetCurSel($hWnd)
    Local $hRgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    Local $hTmp, $Ht

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

    For $i = 0 To $Count - 1
    $tRect = _GUICtrlTab_GetItemRectEx($hWnd, $i)
    If $i = $Sel Then
    $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRect, 1) - 2, DllStructGetData($tRect, 2) - 2, DllStructGetData($tRect, 3) + 2, DllStructGetData($tRect, 4))
    $Ht = DllStructGetData($tRect, 4) - DllStructGetData($tRect, 2) + 2
    Else
    If $i = $Count - 1 Then
    $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRect, 1), DllStructGetData($tRect, 2), DllStructGetData($tRect, 3) - 2, DllStructGetData($tRect, 4))
    Else
    $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRect, 1), DllStructGetData($tRect, 2), DllStructGetData($tRect, 3), DllStructGetData($tRect, 4))
    EndIf
    EndIf
    _WinAPI_CombineRgn($hRgn, $hRgn, $hTmp, $RGN_OR)
    _WinAPI_DeleteObject($hTmp)
    Next
    $tRect = _WinAPI_GetClientRect($hWnd)
    $hTmp = _WinAPI_CreateRectRgn(DllStructGetData($tRect, 1), DllStructGetData($tRect, 2) + $Ht, DllStructGetData($tRect, 3) - 2, DllStructGetData($tRect, 4) - 1)
    _WinAPI_CombineRgn($hRgn, $hRgn, $hTmp, $RGN_OR)
    _WinAPI_DeleteObject($hTmp)
    Return $hRgn
    EndFunc ;==>_CreateClipRgn

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

    Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
    Local Const $WM_PRINTCLIENT = 0x0318
    If _WinAPI_IsThemeActive() Then
    Switch $iMsg
    Case $WM_ERASEBKGND
    Local $tRect[2]
    Local $hParent = _WinAPI_GetParent($hWnd)
    Local $hRgn = _CreateClipRgn($hWnd)
    Local $hPrev = _WinAPI_GetClipRgn($wParam)
    $tRect[0] = _WinAPI_GetWindowRect($hParent)
    $tRect[1] = _WinAPI_GetWindowRect($hWnd)
    _WinAPI_ExtSelectClipRgn($wParam, $hRgn, $RGN_DIFF)
    _WinAPI_DrawBitmap($wParam, DllStructGetData($tRect[0], 1) - DllStructGetData($tRect[1], 1), DllStructGetData($tRect[0], 2) - DllStructGetData($tRect[1], 2), _SendMessage($hParent, $STM_GETIMAGE))
    _WinAPI_SelectClipRgn($wParam, $hPrev)
    _WinAPI_DeleteObject($hRgn)
    Return 1
    Case $WM_PAINT
    Local $tPaint
    Local $hDC = _WinAPI_BeginPaint($hWnd, $tPaint)
    Local $hRgn = _CreateClipRgn($hWnd)
    _WinAPI_ExtSelectClipRgn($hDC, $hRgn, $RGN_AND)
    _WinAPI_CallWindowProc($hProc, $hWnd, $WM_PRINTCLIENT, $hDC, $PRF_CLIENT)
    _WinAPI_DeleteObject($hRgn)
    _WinAPI_EndPaint($hWnd, $tPaint)
    Return 0
    EndSwitch
    EndIf
    Return _WinAPI_CallWindowProc($hProc, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc ;==>_WinProc

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

    Func AutoItExit()
    _WinAPI_SetWindowLongEx($hTab, $GWL_WNDPROC, $hProc)
    DllCallbackFree($hDll)
    EndFunc ;==>AutoItExit

    [/autoit]

    probier es mal so XD

  • howdy ho!
    der trick ist es dem button eine variable zuzuweisen ;D
    funktioniert jedenfalls bei mir^^

    also einfach statt

    [autoit]

    GUICtrlCreateButton("",100,100,20,20)

    [/autoit]

    folgendes

    [autoit]

    $irgendeineVariable = GUICtrlCreateButton("",100,100,20,20)

    [/autoit]

    mfg
    sgtigram

  • weil es wohl noch probleme mit der erkennung gibt durch zeilen die du dir sparen kannst
    vorher:

    [autoit]

    GUICreate('MyGUI', 300, 300)
    GUICtrlCreatePic(@ScriptDir & '\Tech.bmp', 0, 0, 300, 300, $WS_CLIPCHILDREN)
    $hPic = GUICtrlGetHandle(-1)
    GUICtrlCreateTab(20, 20, 262, 261, $TCS_FOCUSONBUTTONDOWN)
    $hTab = GUICtrlGetHandle(-1)
    GUICtrlCreateTabItem('Tab 1')
    GUICtrlCreateButton("",100,100,20,20)
    GUICtrlCreateTabItem('Tab 2')
    GUICtrlCreateTabItem('Tab 3')
    GUICtrlCreateTabItem('')

    [/autoit]

    nachher

    [autoit]

    GUICreate('MyGUI', 300, 300)
    $hPic = GUICtrlCreatePic(@ScriptDir & '\Tech.bmp', 0, 0, 300, 300, $WS_CLIPCHILDREN)
    $hTab = GUICtrlCreateTab(20, 20, 262, 261, $TCS_FOCUSONBUTTONDOWN)
    GUICtrlCreateTabItem('Tab 1')
    $blubb_Button = GUICtrlCreateButton("",100,100,20,20)
    GUICtrlCreateTabItem('Tab 2')
    GUICtrlCreateTabItem('Tab 3')
    GUICtrlCreateTabItem('')

    [/autoit]

    p.s.: button variable natürlich vorher definieren mit Global o.ä.

    mfg
    sgtigram

  • Meinst das so:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate('MyGUI', 300, 300)
    $Tab1 = GUICtrlCreateTab(20, 20, 262, 261, $TCS_FOCUSONBUTTONDOWN)
    $TabSheet1 = GUICtrlCreateTabItem("TabSheet1")
    $Button1 = GUICtrlCreateButton("Button1", 32, 64, 75, 25)
    $TabSheet2 = GUICtrlCreateTabItem("TabSheet2")
    $TabSheet3 = GUICtrlCreateTabItem("TabSheet3")
    GUICtrlCreateTabItem('')
    GUICtrlSetState(-1,$GUI_SHOW)
    GuiCtrlSetState(-1,$GUI_ONTOP)
    $hPic = GUICtrlCreatePic(@ScriptDir & '\Tech.bmp', 0, 0, 300, 300, $WS_CLIPSIBLINGS )
    GuiCtrlSetState(-1,$GUI_DISABLE)

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

    GUICtrlCreateTabItem("")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hallo retrokid,

    also chip 's Lösung funktioniert bei mir (Win XP SP3) einwandfrei,

    frohes neues Jahr

    autoBert

    Es funktioniert zwar das Tab-Menü, aber rechts neben den Tabs ist ein grauer Bereich, den ich nicht haben möchte. Ich hab zwar schon mehre Pic-Controls drübergelegt, aber dies ist immernoch sehr komisch und ich frage mich halt, ob es eine elegantere Lösung gibt, bei der kein Stück Grauzone übrigbleibt und zusätzlich die Tabs funktionieren. Bis jetzt wurde immer nur eines der beide Kriterien erfüllt.

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • Wie heißt es so schön. Man kann nicht alles haben.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ok, dann werde ich halt versuchen, die richtige Mischung aus euren Posts (Nochmal DANKE an alle dafür, die mir geholfen haben! :thumbup: ) und meinem Programm zu finden, um das beste rauszuholen und das Design möglichst gut hinzubekommen.

    Wer eine Lösung findet, kann sie natürlich immernoch gerne posten und ich wäre auch sehr dankbar dafür!
    Der Post bleibt solange auf -offen-

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • Wie wäre es wenn du eine Childgui in deine Maingui integrierst. Auf der Main ist nur das Bild, alle Controls sind auf dem Child. Wenn du dieses dann mit WinSetTrans teiltransparent machst hast du zwar einen ganz anderen Effekt als du vielleich vorhattest, sieht aber bestimmt auch gut aus,

    Hier mal ein Beispiel einer solchen GUI:
    autoit.de/wcf/attachment/14892/

    frohes neues Jahr

    autoBert

  • Ich habe es mal so gelöst (hier lösen lassen) das ser Klick auf den Tab ausgwertet wurde und
    infolgedessen welcher tab angeklickt wurde mit hide/show die Controls versteckt wurden.

    In meinem Fall ging es um das IP Control welches bei allen Tabs durchscheinte.

    Gruß N!ce

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Natürlich weis ich, dass man es so machen kann, ich habe selber ein IP-Control in meinem Programm, aber selbst das eine flackert schon manchmal beim Zeichnen und ich glaube, wenn ich 20 Controls habe wird es nicht gerade besser. Trotzdem Danke!

    Ich habe es mal so gelöst (hier lösen lassen) das ser Klick auf den Tab ausgwertet wurde und
    infolgedessen welcher tab angeklickt wurde mit hide/show die Controls versteckt wurden.

    In meinem Fall ging es um das IP Control welches bei allen Tabs durchscheinte.

    Gruß N!ce

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D