Ü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.
Im UserControl FormMoveable legen Sie über die Eigenschaft Moveable die Verschiebbarkeit des Forms fest, auf dem das Control platziert ist. Die Eigenschaft Moveable ist als voreingestellte Eigenschaft definiert, so dass Sie auf sie auch alleine über den Control-Namen im Form zugreifen können. Die Darstellung des Erscheinungsbildes des zur Laufzeit unsichtbaren UserControls erfolgt auf die in "Mehr scheinen als sein" gezeigte Weise.
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&
Private pMoveable As Boolean
Public Property Get Moveable() As Boolean
Moveable = pMoveable
End Property
Public Property Let Moveable(ByVal New_Moveable As Boolean)
pMoveable = New_Moveable
Select Case pMoveable
Case False
RemoveMenu GetSystemMenu(UserControl.Parent.hWnd, False), _
SC_MOVE, MF_BYCOMMAND
Case True
GetSystemMenu UserControl.Parent.hWnd, True
End Select
PropertyChanged "Moveable"
End Property
Private Sub UserControl_Initialize()
pMoveable = True
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Me.Moveable = PropBag.ReadProperty("Moveable", True)
End Sub
Private Sub UserControl_Resize()
Static sInProc As Boolean
If sInProc Then
Exit Sub
Else
sInProc = True
End If
UserControl.Size 32 * Screen.TwipsPerPixelX, _
32 * Screen.TwipsPerPixelY
sInProc = False
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "Moveable", pMoveable, True
End Sub
|
Über das Steuerelement FormMoveable können Sie zur Laufzeit festlegen, ob der Anwender ein Form verschieben kann

|
Wenn Sie statt eines bequemen Steuerelements lieber einen Prozeduraufruf in einem Modul hätten, finden Sie diese Variante in Verschieb' mich doch! - I
|