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 08.09.2003

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

Fensterplätze

Zurück...


Anzeige

(-hg) mailto:hg_ctlsizepos@aboutvb.de

Nach der Verwendung von API-Funktionen, die das Fenster eines UserControls positionieren, wird die neue Position manchmal nicht korrekt von Visual Basic erkannt und wiedergegeben. Die Eigenschaften Left, Top, Width und Height enthalten dann noch die alten Werte, direkt sowohl aus der Sicht des Containers (Form usw.) als auch beim Extender-Objekt aus der Sicht des UserControls selbst.

Sie können jedoch die aktuelle, tatsächliche Position und Größe über API-Funktionen ermitteln. Das Rechteck des UserControl-Fensters erhalten Sie über die Funktion GetWindowRect - allerdings in Bildschirm-Koordinaten. Von der Funktion MapWindowPoints können Sie die Koordinaten in die Koordinaten bezogen auf das Eltern-Fenster (Container des UserControls) umrechnen lassen , dessen Fenster-Handle Sie über die Funktion GetParent erhalten.

Die folgende Hilfs-Funktion CtlSizePosAPIFromHandle liefert die Positions-Koordinaten und die Abmessungen in Pixels, wenn Sie ihr das Fenster-Handle des betreffenden UserControls übergeben. Da das innerhalb der Funktion ermittelte Rechteck des Fensters nicht wie in VB gewohnt die Breite und Höhe des Rechtecks direkt liefert, sondern API-üblich die Koordinaten der rechten unteren Ecke, werden die Breite und Höhe daraus berechnet und in Form der benutzerdefinierten Variablen SizePosPixels zurückgegeben.

Public Type SizePosPixels
  Left As Long
  Top As Long
  Width As Long
  Height As Long
End Type

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

Private Declare Function GetParent Lib "user32" _
 (ByVal hWnd As Long) As Long
Private Declare Function GetWindowRect Lib "user32" _
 (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function MapWindowPoints Lib "user32" _
 (ByVal hwndFrom As Long, ByVal hwndTo As Long, lppt As Any, _
 ByVal cPoints As Long) As Long

Public Function CtlSizePosAPIFromHandle(ByVal hWnd As Long) _
 As SizePosPixels

  Dim nRect As RECT
  
  GetWindowRect hWnd, nRect
  MapWindowPoints 0, GetParent(hWnd), nRect, 2
  With CtlSizePosAPIFromHandle
    .Left = nRect.Left
    .Top = nRect.Top
    .Width = nRect.Right - nRect.Left
    .Height = nRect.Bottom - nRect.Top
  End With
End Function

Sie können die Position und Abmessungen auch in der Maßeinheit (ScaleMode) des Containers, auf dem das Steuerelement platziert ist, erhalten. Dazu brauchen Sie jedoch das Parent-Form, in dem das UserControl bzw. dessen Container platziert ist. Sie brauchen dieses jedoch nicht selbst zu ermitteln, sondern können dies der folgenden Variante der oben stehenden Funktion überlassen. Anstelle des bloßen Fenster-Handles des UserControls übergeben Sie der Funktion CtlSizePosAPI das UserControl aus der Sicht des Forms (also den Steuerelement-Namen aus dessen Sicht) oder das Extender-Objekt aus der Sicht des UserControls. Im optionalen Parameter ScaleMode ist der Wert vbContainerSize voreingestellt, der dafür sorgt, dass die Angaben in der Maßeinheit des Containers geliefert werden. Sie können jedoch auch jeden anderen sinnvollen ScaleMode (vbTwips bis vbCentimeters) angeben, in dessen Maßeinheit Sie die Werte erhalten möchten. Die Funktion CtlSizePosAPI gibt die Werte in der benutzerdefinierten Variablen SizePos zurück, deren Elemente als Single-Datentyp deklariert sind.

Public Type SizePos
  Left As Single
  Top As Single
  Width As Single
  Height As Single
End Type

Public Function CtlSizePosAPI(Control As Control, _
 Optional ByVal ScaleMode As ScaleModeConstants = _
 vbContainerSize) As SizePos

  Dim nRect As RECT
  Dim nWnd As Long
  Dim nParent As Object
  Dim nContainer As Object
  
  With Control
    nWnd = .hWnd
    Set nParent = .Parent
    Set nContainer = .Container
  End With
  GetWindowRect nWnd, nRect
  MapWindowPoints 0, GetParent(nWnd), nRect, 2
  Select Case ScaleMode
    Case vbContainerSize
      With CtlSizePosAPI
        .Left = nParent.ScaleX(nRect.Left, vbPixels, _
         nContainer.ScaleMode)
        .Top = nParent.ScaleY(nRect.Top, vbPixels, _
         nContainer.ScaleMode)
        .Width = nParent.ScaleX(nRect.Right - nRect.Left, _
         vbPixels, nContainer.ScaleMode)
        .Height = nParent.ScaleY(nRect.Bottom - nRect.Top, _
         vbPixels, nContainer.ScaleMode)
      End With
    Case vbPixels
      With CtlSizePosAPI
        .Left = nRect.Left
        .Top = nRect.Top
        .Width = nRect.Right - nRect.Left
        .Height = nRect.Bottom - nRect.Top
      End With
    Case vbTwips To vbCentimeters
      With CtlSizePosAPI
        .Left = nParent.ScaleX(nRect.Left, vbPixels, ScaleMode)
        .Top = nParent.ScaleY(nRect.Top, vbPixels, ScaleMode)
        .Width = nParent.ScaleX(nRect.Right - nRect.Left, _
         vbPixels, ScaleMode)
        .Height = nParent.ScaleY(nRect.Bottom - nRect.Top, _
         vbPixels, ScaleMode)
      End With
  End Select
End Function

Wenn Sie diese zweite Funktion verwenden und das UserControl aus der Sicht des Forms übergeben, sollten Sie daran denken, die Eigenschaft hWnd des UserControls offen zu legen:

Public Property Get hWnd() As Long
  hWnd = UserControl.hWnd
End Property

Beispiel-Projekt und Modul modCtlSizePos (ctlsizepos.zip - ca. 3,1 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