Hätten Sie's gedacht? Sie können auf einem ähnlich einer PictureBox als Container angelegten UserControl platzierte Steuerelemente hinter interne ("konstituierende") Steuerelemente des UserControls verschieben. Oder umgekehrt ausgedrückt: Sie können konstituierende Steuerelemente eines Container-UserControls in den Vordergrund vor später auf diesem platzierte Steuerelemente holen.
Eigentlich sollte man ja davon ausgehen, dass die "innere" Oberfläche eines UserControls mit den zur Entwicklungszeit des UserControls darauf platzierten, so genannten "konstituierenden" Steuerelementen gemeinsam eine Abbildungsebene bilden würden, während die Steuerelemente, die später auf einem Container-UserControl (dessen Eigenschaft ControlContainer also True ist) platziert werden, alle zusammen in einer Ebene darüber liegen sollten.
Im Normalfall ist dies ja auch so: Sie können die auf einem Container-UserControl platzierten Steuerelemente beliebig in den Vordergrund oder in den Hintergrund versetzen - die konstituierenden Steuerelemente des UserControls bleiben trotzdem immer im Hintergrund und behalten ihre eigene, ursprüngliche Tiefenstaffelung unverändert bei.
Ändern Sie allerdings die Tiefenanordnung eines der konstituierenden Steuerelemente im UserControl per Aufruf der ZOrder-Methode dieses Steuerelements, können Sie es in den Vordergrund verschieben - und zwar in den Vordergrund auch vor später "von außen" auf dem Container-UserControl platzierte weitere Steuerelemente. Allerdings gibt es eine kleine Einschränkung: Dies gilt nur für Steuerelemente mit einem eigenen Fenster, und nicht für die einfachen grafischen Steuerelemente (Label, Image, Shape und Line). Diese bleiben immer im Hintergrund - und konstituierende grafische Steuerelemente bleiben zudem immer im hintersten Hintergrund.
Schauen Sie sich dazu einmal folgendes Beispiel an. Die PictureBox mit dem Icon befindet sich von vornherein als konstituierendes Steuerelement auf dem Container-UserControl, während die beiden Optionsschaltflächen nachträglich auf dem Container platziert wurden.
Hier ist das UserControl mit einer Eigenschaft ZState versehen, über die Sie im Eigenschaftenfenster oder zur Laufzeit die Ebene der PictureBox ändern können:
Public Enum ZStateConstants
ZForeground
ZBackground
End Enum
Private pZState As ZStateConstants
Public Property Get ZState() As ZStateConstants
ZState = pZState
End Property
Public Property Let ZState(New_ZState As ZStateConstants)
Select Case New_ZState
Case pZState
Case ZForeground, ZBackground
pZState = New_ZState
UserControl_Show
PropertyChanged "ZState"
Case Else
Err.Raise 380
End Select
End Property
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Me.ZState = PropBag.ReadProperty("ZState", 1)
End Sub
Private Sub UserControl_Show()
pic.ZOrder pZState
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "ZState", pZState, 1
End Sub
Beachten Sie, dass die Änderung der ZOrder im Show-Ereignis des UserControls erfolgt. Ein Aufruf der ZOrder-Methode hat nämlich nicht die gewünschte Wirkung, wenn das UserControl nicht sichtbar ist.
|