Über die Eigenschaft Moveable eines Forms können Sie festlegen,
ob der Anwender das Form mit der Maus verschieben kann. Leider
können Sie diese Eigenschaft nur zur Entwicklungszeit setzen.
Damit Sie dies auch wahlweise zur Laufzeit festlegen können,
müssen Sie auf API-Funktionen zurückgreifen. Eine Möglichkeit
wäre, das Form zu subclassen, so die Nachricht WM_WINDOWPOSCHANGING
abzufangen und in den mitgelieferten Positionswerten jegliche
Änderung zu verwerfen.
Einfacher geht es über eine kleine Manipulation des Systemmenüs
des Forms. Wird aus dem Systemmenü der Menüpunkt
"Verschieben" entfernt, kann das Form auch nicht mehr mit
der Maus verschoben werden.
Dazu ermitteln Sie mittels der API-Funktion GetSystemMenu
das Menü-Handle des Systemmenüs und entfernen über die
API-Funktion RemoveMenu
den Menüpunkt.
Für den umgekehrten Weg, um das Form wieder verschiebbar zu
machen, genügt ein Aufruf von GetSystemMenu, diesmal mit dem Wert
True im zweiten Parameter. Dadurch wird das Systemmenü wieder in
seinen Ursprungszustand zurück versetzt. Der einzige kleine Haken
hierbei ist, dass dabei auch alle weiteren Änderungen, die Sie
vielleicht aus anderen Gründen noch am Systemmenü vorgenommen
haben, rückgängig gemacht werden - Sie müssen diese Änderungen
danach erneut vornehmen.
Private Declare Function GetSystemMenu Lib "user32" _
(ByVal hWnd As Long, ByVal bRevert As Long) As Long
Private Declare Function RemoveMenu Lib "user32" _
(ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Private Const MF_BYCOMMAND = &H0&
Private Const SC_MOVE = &HF010&
Public Sub FormMoveable(Frm As Form, ByVal Moveable As Boolean)
Select Case Moveable
Case False
RemoveMenu GetSystemMenu(Frm.hWnd, False), SC_MOVE, _
MF_BYCOMMAND
Case True
GetSystemMenu Frm.hWnd, True
End Select
End Sub
 |
Mit der Funktion FormMoveable legen Sie zur
Laufzeit fest, ob ein Form vom Anwender verschoben werden kann

|
Eine Version als UserControl (OCX) finden Sie in Verschieb'
mich doch! - II
|