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 09.01.2000

Diese Seite wurde zuletzt aktualisiert am 09.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 mailto:jkrumsiek@aboutvb.de

Vielleicht programmieren Sie ja gerade eine Anwendung mit einem wunderschönen Design Ihrer Forms - und die "hässliche" Titelleiste stört Sie dabei gewaltig. Die Schaltflächen zum Minimieren, Maximieren und Schließen des Forms würden Sie ja mit CommandButtons einfach nachbilden können. Aber wie ermöglichen Sie es dem Anwender, das Form weiterhin mit der Maus verschieben zu können, wenn die Titelleiste fehlt? Oder möchten Sie es dem Anwender ermöglichen, ein beliebiges Steuerelement, etwa eine PictureBox, frei im Form verschieben zu können?


Verschieben eines Forms oder eines Steuerelements auch ohne Titelleiste oder mit eigener, alternativer Titelleiste

Das ist kein großes Problem. Denn glücklicherweise können wir auf den gleichen Mechanismus zurückgreifen, den Windows im Prinzip auch intern verwendet.

Die Titelleiste gehört aus der Sicht von Windows nicht mehr zum Arbeitsbereich ("Client-Bereich") eines Forms ("Fensters") - das merken Sie ja auch daran, dass Sie dort keine Steuerelemente platzieren können. Naheliegenderweise wird der Bereich zwischen dem Client-Bereich und der eigentlichen Fenster-Außenkante als "Non-Client-Bereich" bezeichnet, und er wird von Windows auf eigene Weise verwaltet. So werden alle Mausaktivitäten in diesem Bereich dem Fenster über spezielle "Nachrichten" mitgeteilt (Die Funktionsweise dieses Nachrichten-Systems hier zu erläutern, würde den Rahmen dieses Beitrags sprengen - wenn es Sie näher interessiert, finden Sie in der MSDN-Library - Windows MessagesMSDN-Library jede Menge Informationen darüber.).

Für unseren Zweck benötigen wir hier die Nachricht MSDN Library - API WM_NCLBUTTONDOWNWM_NCLBUTTONDOWN. Diese Nachricht wird immer dann an ein Fenster gesendet, wenn die linke Maustaste in jenem Non-Client-Bereich niedergedrückt wird. Dieser Bereich ist in mehrere Unterbereiche unterteilt. Uns interessiert hier wiederum nur der Unterbereich, der von Windows so identifiziert werden soll, als wenn es die Titelleiste ("Caption") wäre. Wir simulieren also einfach das Klicken auf die Titelleiste. Das Senden von Nachrichten an Windows erfolgt mit Hilfe der API-Funktion MSDN Library - API SendMessageSendMessage, der neben dem Fenster-Handle (hWnd-Eigenschaft des zu verschiebenden Forms oder Steuerelements) der Konstantwert der Nachricht selbst (WM_NCLBUTTONDOWN) und der Konstantwert MSDN Library - API HTCAPTIONHTCAPTION als weiterer Parameter übergeben werden.

Da wir ja den Non-Client-Bereich-Mausklick an einer Stelle innerhalb des Client-Bereichs simulieren wollen, müssen wir Windows zuvor ein wenig austricksen. Infolge der Mausbewegung über dem Client-Bereich hat Windows den Mauszeiger sozusagen eingefangen, um ihn verfolgen zu können ("Captured"). Im MouseDown-Ereignis des zu verschiebenden Objekts rufen wir die Hilfsfunktion MoveObject auf und übergeben ihr eine Referenz auf das Objekt. In dieser Funktion weisen wir Windows mit dem Aufruf der API-Funktion MSDN Library - API ReleaseCaptureReleaseCapture als erstes an, den Mauszeiger aus der Aufsicht zu entlassen. Danach folgt das Senden der Nachricht mit der SendMessage-Funktion - und schon "klebt" das gewünschte Objekt so lange unter dem Mauszeiger, bis der Anwender die Maustaste wieder los lässt.

Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" _
 Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
 ByVal wParam As Long, lParam As Any) As Long

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, _
 Y As Single)
  If Button = vbLeftButton Then
    MoveObject Me
  End If
End Sub

Sub MoveObject(Obj As Object)
  Const WM_NCLBUTTONDOWN = &HA1
  Const HTCAPTION = 2

  ReleaseCapture
  SendMessage Obj.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
End Sub

Zum Verschieben eines Forms oder Steuerelements gaukeln Sie Windows vor, der Anwender hätte auf die Titelleiste geklickt


Beispiel-Projekt MoveObjectTest (moveobj.zip - ca. 1,8 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