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 10.01.2000

Diese Seite wurde zuletzt aktualisiert am 10.01.2000
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...

Zurück...


Anzeige

Von Jan Krumsiek / -hg mailto:hg_focusrect@aboutvb.de

Das gepunktete Rechteck, wie es beispielsweise automatisch in einem Steuerelement erscheint, das den Fokus inne hat, kennen Sie bestimmt. Wenn Sie jedoch eigene Steuerelemente auf der Basis eines UserControls entwickeln wollen, müssen Sie selbst dafür sorgen, dass der Anwender die Fokusinhaberschaft erkennen kann. Dieses gepunktete Rechteck, kurz "Fokusrechteck" genannt, können Sie mittels der API-Funktion MSDN-Library - DrawFocusRectDrawFocusRect zeichnen.


Das Fokusrechteck in einem UserControl können Sie selbst zeichnen, wenn das Steuerlement den Fokus hat

Während in Visual Basic rechteckige Bereiche, wie etwa der eines Steuerelements, meistens über die Position der linken oberen Ecke und über die Angaben Breite und Höhe als separate Eigenschaften beschrieben werden, wird bei API-Funktionen in der Regel die benutzerdefinierte Datenstruktur MSDN-Library - RECTRECT erwartet, in der die Koordinaten der linken oberen und der rechten unteren Ecke angegeben werden, meistens in der Maßeinheit Pixels:

Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Zum Zeichnen eines Fokusrechtecks rufen Sie die API-Funktion DrawFocusRect auf, und übergeben ihr den sogenannten MSDN-Library - Device ContextDevice-Kontext aus der Eigenschaft hDC (etwa eines UserControls, eines Forms, einer PictureBox usw.) und eine Variable des Typs RECT, in der Sie die gewünschten Koordinaten angegeben haben. Denken Sie daran, dass Die Angabe in Pixels erfolgen muss.

Declare Function DrawFocusRect Lib "user32" _
 (ByVal hDC As Long, lpRect As RECT) As Long

Dim FocusRect As RECT

With FocusRect
  .Top = 50
  .Left = 50
  .Bottom = 200
  .Right = 200
End With
DrawFocusRect MeineForm.hDC, FocusRect

Das so gezeichnete Fokusrechteck verschwindet jedoch, sobald die Zeichenfläche aktualisiert wird. Sie müssen es jedes Mal im Anschluss daran neu zeichnen. Dieses "im Anschluss" daran ist wichtig, denn nur dann können Sie sich eine interessante Eigenschaft der Funktion DrawFocusRect zunutze machen. Zeichnen Sie nämlich das Fokusrechteck erneut an gleicher Stelle darüber, wird das zuvor gezeichnete Fokusrechteck wieder gelöscht.

DrawFocusRect zeichnet die punktierten Linien des Rechtecks nämlich nicht in einer bestimmten Farbe, sondern invertiert einfach an jedem einzelnen Punkt die dort vorhandene Farbe. Ein zweimaliges Zeichnen an derselben Stelle ergibt damit eine doppelte Invertierung - der gezeichnete Punkt erscheint wieder in seiner ursprünglichen Farbe. Daraus ergibt sich logischerweise, dass das Fokusrechteck als letztes gezeichnet werden muss. Denn würden Sie noch etwas anderes darüber zeichnen, würde DrawFocusRect unter Umständen beim nächsten Zeichnen zum Zwecke des Löschens an einzelnen Punkten eine andere Farbe antreffen und dann diese invertieren - was aber dort nicht mehr die Ursprungsfarbe ergäbe.

Wenn Sie in einem UserControl die Fokusinhaberschaft darstellen wollen, ist daher ein wenig mehr Aufwand notwendig, als einfach nur im MSDN Library - VB GotFocus (UserControl)GotFocus-Ereignis ein Fokusrechteck zu zeichnen. Zum einen müssen Sie sicherstellen, dass das Fokusrechteck jedes Mal nachgezeichnet wird, wenn der Inhalt des UserControls neu gezeichnet worden ist. Dieses Neuzeichnen sollte im Ereignis UserControl_Paint erfolgen, und dort gehört somit als letztes auch ein Aufruf der Funktion DrawFocusRect hin, wenn das UserControl den Fokus innehat.

Sie können das Fokusrechteck erstmals zeichnen, wenn das UserControl den Fokus erhält, also in der Ereignisprozedur UserControl_GotFocus, und es beim Verlust des Fokus in der Ereignisprozedur UserControl_LostFocus wieder löschen. Falls jedoch das Steuerelement ähnlich einer Schaltfläche (hier ist es eine stärkere Umrandung) noch eine weitere Änderung seiner Darstellung erfordert, sollten Sie die gesamte Zeichnerei in eine separate private Funktion (z.B. zPaint) verlagern. Diese rufen Sie dann jeweils von den Ereignissen GotFocus und LostFocus als auch aus dem Paint-Ereignis auf, prüfen vor dem Aufruf von DrawFocusRect, ob das UserControl den Focus innehat, und zeichnen das Fokusrechteck nur dann, wenn dies der Fall ist. Die zuverlässigste Prüfung der Fokusinhaberschaft nehmen Sie über die API-Funktion MSDN-Library - GetFocusGetFocus vor. Diese gibt ein Fenster-Handle zurück - wenn es identisch mit dem des UserControls ist (Eigenschaft UserControl.hWnd), hat das UserControl den Fokus inne. Dann können die besondere Darstellung der Fokusinhaberschaft und anschließend das Fokusrechteck gezeichnet werden. Anderenfalls zeichnen Sie den Inhalt des UserControls in seiner normalen, fokuslosen Darstellung. Der Einfachheit halber stellen Sie die MSDN Library - VB ScaleModeScaleMode-Eigenschaft des UserControls auf vbPixels - dann brauchen Sie nicht ständig umzurechnen, und auch allgemein tun Sie sich wahrscheinlich leichter damit bei allen Zeichenvorgängen.

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private Declare Function DrawFocusRect Lib "user32" _
 (ByVal hdc As Long, lpRect As RECT) As Long
Private Declare Function GetFocus Lib "user32" () As Long

Private Sub UserControl_GotFocus()
  zPaint
End Sub

Private Sub UserControl_LostFocus()
  zPaint
End Sub

Private Sub UserControl_Paint()
  zPaint
End Sub

Private Sub zPaint()
  Dim nRect As RECT
  
  Const kDistanceToBorder = 4
  
  With UserControl
    If GetFocus() = .hWnd Then
      .BackColor = vbWindowBackground
      nRect.Left = kDistanceToBorder
      nRect.Top = kDistanceToBorder
      nRect.Right = .ScaleWidth - kDistanceToBorder
      nRect.Bottom = .ScaleHeight - kDistanceToBorder
      DrawFocusRect .hdc, nRect
    Else
      .BackColor = vbButtonFace
    End If
  End With
End Sub

So kann ein UserControl darstellen, dass es den Fokus inne hat

Eines soll hier allerdings nicht verschwiegen werden. Das Ereignis MSDN Library - VB LostFocus (UserControl)LostFocus wird von der internen Verwaltung in Visual Basic nur ausgelöst, wenn innerhalb der gleichen Anwendung der Fokus von Ihrem UserControl zu einem anderen Steuerelement wechselt. Den Wechsel von einer Anwendung zu einer anderen - und auch den Wechsel zurück - bekommt Ihr UserControl nicht mit. Um auch in diesem Fall den Verlust des Fokus darzustellen, müsste Ihr UserControl die Windows-internen Nachrichten verfolgen können. Dies erfordert jedoch ein sogenanntes Subclassing des UserControls - das ist jedoch eine Technik, deren Darstellung den Rahmen dieses Artikels sprengen würde...


Beispiel-Projekt DrawFocusRectTest (focusrect.zip - ca. 2,3 KB)






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