ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 26.02.2001

Diese Seite wurde zuletzt aktualisiert am 26.02.2001
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Selbstanpassung

Zurück...


Anzeige

(-hg) mailto:hg_uclautosize@aboutvb.de

Grundsätzlich ist es eine einfache Aufgabe, die Größe eines UserControls automatisch an eine von seinem Inhalt vorgegebene Größe anzupassen, so dass sie weder zur Laufzeit noch zur Entwicklungszeit geändert werden kann. Im Resize-Ereignis des UserControls werden über einen Aufruf der MSDN-Library - VB SizeSize-Methode des UserControls die gewünschte Breite und Höhe gesetzt. Die Maßeinheit für Breite und Höhe ist für die Size-Methode immer TWIPS, unabhängig von der Maßeinheit (ScaleMode) des Containers, auf dem das UserControl platziert ist.

Private Sub UserControl_Resize()
  UserControl.Size Breite, Höhe
End Sub
Selbstanpassung eines UserControls

Ein UserControl kann sich selbsttätig an eine vorgegebene Innengröße anpassen - beispielsweise an ein Image-Steuerelement

Beachten Sie, dass das Resize-Ereignis erneut ausgelöst wird, wenn hier tatsächlich die Größe geändert wurde. Stimmten Höhe und Breite des UserControls bereits mit den Werten von Breite und Höhe überein, wird das Ereignis nicht ausgelöst. Für den Fall des erneuten Auslösens ist es sinnvoll zu verhindern, dass weiterer gegebenenfalls vorhandener Code im Resize-Ereignis nicht erneut ausgeführt wird. Dies verhindern Sie mit Hilfe einer statischen Sperr-Variablen in diesem Ereignis (siehe: Aller guten Dinge ist eins"Aller guten Dinge ist eins").

Private Sub UserControl_Resize()
  Static sInProc
    
  If sInProc Then
    Exit Sub
  Else
    sInProc = True
  End If
  ' ... weiterer Code ...
  UserControl.Size Breite, Höhe
  ' ... weiterer Code ...
  sInProc = False
End Sub

Falls das UserControl einen Rahmen hat, also die Eigenschaft BorderStyle auf "1 - Fest einfach" gesetzt ist, müssen Sie zu den gewünschten Abmessungen noch die Rahmenstärke hinzufügen, damit die Abmessungen des sichtbare Innenbereichs auch tatsächlich mit den gewünschten Maßen übereinstimmen.

Die vertikale und die horizontale Rahmenstärke ermitteln Sie, indem Sie vor der Größenänderung jeweils die noch aktuelle Innenbreite (ScaleWidth) und Innenhöhe (ScaleHeight) des UserControls von den noch aktuellen Außenmaßen subtrahieren. Wenn die Maßeinheit de UserControls (ScaleMode) unverändert auf TWIPS gesetzt ist, können Sie die ScaleWidth- und ScaleHeight-Werte direkt von Width und Height des UserControls subtrahieren. Ist jedoch eine andere Maßeinheit eingestellt, müssen Sie die Werte von ScaleWidth und ScaleHeight zunächst mittels der ScaleX- bzw der ScaleY-Methode in TWIPS umrechnen.

Private Sub UserControl_Resize()
  Dim nBorderWidth As Single
  Dim nBorderHeight As Single

  Static sInProc
    
  If sInProc Then
    Exit Sub
  Else
    sInProc = True
  End If
  With UserControl
    If .BorderStyle = 1 Then
      nBorderWidth = .Width - .ScaleX(.ScaleWidth, .ScaleMode, _
       vbTwips)
      nBorderHeight = .Height - .ScaleY(.ScaleHeight, .ScaleMode, _
       vbTwips)
    End If
    .Size Breite + nBorderWidth, Höhe + nBorderHeight
  End With
  sInProc = False
End Sub

Sollen sich beispielsweise die Breite und die Höhe des UserControls nach einem auf diesem platzierten Steuerelement richten, etwa nach einem Bild-Element (Image-Steuerelement), und ist als ScaleMode nicht TWIPS gewählt, sind auch die Maße dieses Steuerelements in TWIPS umzurechnen. Dieses Steuerelement ist natürlich zuvor in die linke obere Ecke des UserControls zu verschieben.

    Image1.Move 0, 0
    .Size .ScaleX(Image1.Width, .ScaleMode, vbTwips) -
     + nBorderWidth, .ScaleY(Image1.Height, .ScaleMode, vbTwips) _
     + nBorderHeight

Diese Umrechnung ist immer notwendig, wenn die Maßangaben für Breite und Höhe in einer anderen Maßeinheit als TWIPS vorliegen.

Je nach Verwendungszweck des UserControls ist es vielleicht sinnvoll, diese selbsttätige Anpassung beliebig ein- und ausschalten zu können. Dazu verleihen Sie Ihrem Steuerelement eine eigene Eigenschaft wie etwa AutoSize, wie Sie von der PictureBox her kennen sollten. Im Resize-Ereignis des UserControls muss nun noch der Wert dieser Eigenschaft geprüft werden.

Private Sub UserControl_Resize()
  Dim nBorderWidth As Single
  Dim nBorderHeight As Single

  Static sInProc
    
  If sInProc Then
    Exit Sub
  Else
    sInProc = True
  End If
  If pAutoSize Then
    With UserControl
      If .BorderStyle = 1 Then
        nBorderWidth = .Width - .ScaleX(.ScaleWidth, .ScaleMode, _
         vbTwips)
        nBorderHeight = .Height - .ScaleY(.ScaleHeight, _
         .ScaleMode, vbTwips)
      End If
      .Size Breite + nBorderWidth, Höhe + nBorderHeight
    End With
  End If
  sInProc = False
End Sub

Die Eigenschaft AutoSize können sie wie folgt verwalten:

Private pAutoSize As Boolean

Public Property Get AutoSize() As Boolean
  AutoSize = pAutoSize
End Property

Public Property Let AutoSize(New_AutoSize As Boolean)
  If pAutoSize <> New_AutoSize Then
    pAutoSize = New_AutoSize
    UserControl_Resize
  End If
  PropertyChanged "AutoSize"
End Property

' ...

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  pAutoSize = PropBag.ReadProperty("AutoSize", False)
  ' ...
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  PropBag.WriteProperty "AutoSize", pAutoSize, False
  ' ...
End Sub

Beispiel-Projekt AutoSizeTest (uclautosize.zip - ca. 3,4 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche




Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer