Sie können beim Schließen eines Forms dessen aktuelle Position
in der Windows-Registrierung ablegen. Beim nächsten Laden können
Sie die abgelegten Werte einlesen und so das Form an gleicher Stelle
wieder erscheinen lassen. Sie dazu auch den Wert der
WindowState-Eigenschaft ablegen, um das Form gegebenenfalls beim
Laden gleich wieder maximiert oder minimiert erscheinen zu lassen.
Der Nachteil dabei ist allerdings, dass bei einem maximierten
oder minimierten Form beim Schließen die Werte eben dieser
maximierten oder minimierten Position in der Registrierung abgelegt
würden. Würde so ein maximiertes Form nach dem Laden und der
Maximierung entsprechend der Speicherung wieder normal angezeigt,
würde die normale Position der maximierten Position und Größe
entsprechen. Um die tatsächliche normale Größe und Position
ablegen zu können, müssten Sie eigentlich diese Werte vorsorglich
nach jedem Verschieben des Forms, oder zumindest vor jedem Wechsel
von der normalen in die maximierte oder minimierte Position
festhalten, um sie beim Schließen des Forms korrekt ablegen zu
können.
Einen bequemeren Ausweg liefert die API-Funktion GetWindowPlacement.
Über diese Funktion können Sie jederzeit die normale Position und
Größe eines Forms erfahren, egal in welchem Anzeigezustand es sich
gerade befinden mag. Sie übergeben der Funktion das Fenster-Handle
(hWnd-Eigenschaft) des betreffenden Forms und eine
benutzerdefinierte Variable des Typs WINDOWPLACEMENT,
deren Byte-Länge Sie zuvor im ersten Element der Variablen
angegeben haben. Diese Byte-Länge erhalten Sie über die VB-Fuktion
Len. Das Element rcNormalPosition dieser Variablen, das selbst
wiederum eine benutzerdefinierte Variable des Typs RECT ist,
enthält nach dem Aufruf die gewünschten Angaben.
Die Hilfs-Funktion GetFormNormalSizePos vereinfacht den Aufruf
für ein in ihrem ersten Parameter übergebenes, beliebiges Form und
gibt in den weiteren Parametern die Werte für Left, Top, Width und
Height gleich VB-gerecht in Twips umgerechnet zurück.
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type WINDOWPLACEMENT
Length As Long
flags As Long
showCmd As Long
ptMinPosition As POINTAPI
ptMaxPosition As POINTAPI
rcNormalPosition As RECT
End Type
Private Declare Function GetWindowPlacement Lib "user32" _
(ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
Public Function GetFormNormalSizePos(Form As Form, _
Left As Single, Top As Single, Width As Single, _
Height As Single)
Dim nWindowPlacement As WINDOWPLACEMENT
With nWindowPlacement
.Length = Len(nWindowPlacement)
GetWindowPlacement Form.hwnd, nWindowPlacement
With .rcNormalPosition
Left = .Left * Screen.TwipsPerPixelX
Top = .Top * Screen.TwipsPerPixelY
Width = (.Right - .Left) * Screen.TwipsPerPixelX
Height = (.Bottom - .Top) * Screen.TwipsPerPixelY
End With
End With
End Function
Mit Hilfe der beiden folgenden Prozeduren GetFormSettings und
SaveFormSettings automatisieren Sie die Ablage der Position, der
Größe und des Anzeigestatus eines Forms in der
Window-Registrierung und das Wiederherstellen nach dem Laden.
GetFormSettings rufen Sie im Form_Load-Ereignis mit der Angabe der
Schlüssel auf, und SaveFormSettings entsprechend im
Form_Unload-Ereignis.
Public Sub GetFormSettings(Form As Form, AppName As String, _
Section As String, -
Optional ByVal RestoreWindowState As Boolean = True)
Dim nLeft As Single
Dim nTop As Single
Dim nWidth As Single
Dim nHeight As Single
nWidth = CSng(GetSetting(AppName, Section, "Width", 0))
With Form
If nWidth Then
nHeight = CSng(GetSetting(AppName, Section, "Height", 0))
nLeft = CSng(GetSetting(AppName, Section, "Left", 0))
nTop = CSng(GetSetting(AppName, Section, "Top", 0))
.Move nLeft, nTop, nWidth, nHeight
End If
If RestoreWindowState Then
.WindowState = CInt(GetSetting(AppName, Section, "WindowState", 0))
End If
End With
End Sub
Public Sub SaveFormSettings(Form As Form, AppName As String, _
Section As String)
Dim nWindowPlacement As WINDOWPLACEMENT
With nWindowPlacement
.Length = Len(nWindowPlacement)
GetWindowPlacement Form.hwnd, nWindowPlacement
With .rcNormalPosition
SaveSetting AppName, Section, "Left", _
.Left * Screen.TwipsPerPixelX
SaveSetting AppName, Section, "Top", _
.Top * Screen.TwipsPerPixelY
SaveSetting AppName, Section, "Width", _
(.Right - .Left) * Screen.TwipsPerPixelX
SaveSetting AppName, Section, "Height", _
(.Bottom - .Top) * Screen.TwipsPerPixelY
End With
End With
SaveSetting AppName, Section, "WindowState", Form.WindowState
End Sub
|