Wie ordnet man überlappende Controls an?

  • Hallo,

    ich habe mehrere überlappende Controls ähnlich den Spielkarten á la Windows Solitär mit GUICtrlCreatePic erstellt. Wie kann ich nun steuern, welche Karte sich im Vordergrund, an 2. Stelle, an 3. Stelle, etc. befinden soll?

    Gruß,
    Styrx

  • ...dann bin ich so frei und zeige mal den Code:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <Color.au3>
    #Include <Array.au3>

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

    Opt('MustDeclareVars', 1)

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

    Local $hGUI, $hPics[100][5]
    Local $Search, $File
    Local $Color, $i
    Local $Pos[4]

    $hGUI = GUICreate("", 1024, 600, 0, 0, $WS_POPUP)
    GUISetBkColor(0x000000)
    GUISetState(@SW_SHOW, $hGUI)

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

    $Pos[0] = -1
    $Pos[1] = -1
    $Pos[2] = -1
    $Pos[3] = -1

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

    $Search = FileFindFirstFile("Card*.jpg")
    If $search = -1 Then
    MsgBox(0, "Error", "Keine Karten gefunden!")
    Exit
    EndIf

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

    $i = 0
    While 1
    $File = FileFindNextFile($Search)
    If @error Then ExitLoop
    $i += 1
    $hPics[$i][0] = GUICtrlCreatePic($File, 0, 0, 246, 343)
    If $hPics[$i][0] > 0 Then
    $Color = _ColorGetRGB(PixelGetColor(244, 2, $hGUI))
    $hPics[$i][1] = _GetColor($Color)
    If $hPics[$i][1] < 4 Then
    $Pos[$hPics[$i][1]] += 1
    $hPics[$i][2] = $Pos[$hPics[$i][1]]
    GUICtrlSetPos($hPics[$i][0], $hPics[$i][1]*256+5, $hPics[$i][2]*30+3)
    EndIf
    EndIf
    GUICtrlSetState($hPics[$i][0], $GUI_HIDE)
    WEnd

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

    FileClose($search)

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

    ; bis hierhin werden die Karten schon mal wunderbar erzeugt und positioniert

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

    For $i = 0 to UBound($hPics) - 1
    GUICtrlSetState($hPics[$i][0], $GUI_SHOW)
    Next

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

    ; nun werden sie auch in ihrer ausgangsposition wunderbar in 4 Spalten angezeigt

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

    _ArrayDisplay($hPics)

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

    For $i = 0 to UBound($hPics) - 1
    GUICtrlSetState($hPics[$i][0], $GUI_ONTOP)
    sleep(500)
    Next

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

    ; aber die karten nun einfach mal nacheinander in den vordergrund zu holen funktioniert nicht
    ; und wie sich ein Z-Index à la HTML nutzen ließe weiß ich auch noch nicht.

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

    _ArrayDisplay($hPics)

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

    GUIDelete()

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

    Func _GetColor(ByRef $Color)
    Select
    Case $Color[0]>$Color[1]+64 and $Color[2]>$Color[1]+64 and abs($Color[0]-$Color[2])<16
    Return 0
    Case $Color[1]>$Color[0]+64 and $Color[1]>$Color[2]+64 and abs($Color[0]-$Color[2])<16
    Return 0
    Case $Color[0]>$Color[1]+64 and $Color[0]>$Color[2]+64 and abs($Color[1]-$Color[2])<16
    Return 1
    Case $Color[0]<192 and abs($Color[0]-$Color[1])<16 and abs($Color[1]-$Color[2])<16
    Return 2
    Case $Color[2]>$Color[0]+64 and $Color[2]>$Color[1]+64 and abs($Color[0]-$Color[1])<16
    Return 1
    Case $Color[0]>$Color[2]+64 and $Color[1]>$Color[2]+64
    Return 3
    Case Else
    Return 4
    EndSelect
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Styrx (14. Januar 2010 um 23:07)

  • ..., allerdings einen ganz anderen Lösungsansatz mit GDI+


    Mit GDI+ hab ich schon eine funktionierende Version, die allerdings enorm träge ist. Der Bildaufbau dauert hier viel zu lang; insbesondere auf meinen Netbook, für den die Sache letztlich konzipiert wurde.

    Gruß,
    Styrx