Si vous développez des applications graphiques ou multimédias, vous vous demandez peut-être comment déplacer un formulaire sans utiliser sa barre de titre. En fait, il suffit de faire glisser la zone client du formulaire avec la souris.
Première méthode
Voici la manière la plus courante d'accomplir la fonction ci-dessus : ajoutez l'instruction de procédure suivante dans la section instruction PRivate du formulaire :
procédure WMNCHitTest(var Msg:TWMNCHitTest);message WM_NCHITTEST;
Ajoutez ensuite le code suivant dans la section implémentation :
procédure TForm1{ou le nom du formulaire que vous avez défini}.WMNCHitTest(var Msg:TWMNCHitTest);
commencer
Gestionnaire par défaut (Msg);
si Msg.Result = HTCLIENT alors
Msg.Result := HTCAPTION ;
fin;
Cette méthode fait croire à Windows que la barre de titre a été cliquée lorsque la souris clique sur la zone client du formulaire.
Deuxième méthode
Voici une autre façon de déplacer un formulaire normal avec la souris.
procédure TForm1.FormMouseMove(Sender : TObject ; Shift : TShiftState ; X, Y : Integer) ;
commencer
if (ssLeft dans Shift) alors commencez
LibérationCapture ;
SendMessage(Form1.Handle,WM_SYSCOMMAND,SC_MOVE+1,0);
fin;
fin;
Imperfections des méthodes ci-dessus
Voyons ce qui se passe lorsque l'option "Afficher le contenu de la fenêtre pendant le déplacement" est désactivée. Il s'agit d'un paramètre pour Windows. Vous pouvez trouver cette propriété dans "Menu Démarrer --> Paramètres --> Options des dossiers --> Affichage --> Paramètres avancés". Sous Windows95, vous devez modifier le registre. Lorsque cette propriété est définie sur invalide, le formulaire se transforme en contour carré lorsqu'il est déplacé. Peut-être que vous utilisez une forme irrégulière, mais elle montre toujours des contours.
Lorsque vous souhaitez que votre formulaire soit ancré en bord de l'écran (par exemple : WinAmp, lorsque vous faites glisser le formulaire vers une position précise en haut de l'écran, le formulaire sera proche du haut de l'écran), si vous utilisez la deuxième étape ci-dessus. De cette façon, vous ne pourrez pas gérer la position du formulaire tant que le bouton de la souris n'est pas relâché, et vous ne pourrez pas gérer les problèmes d'ancrage.
Ci-dessous, j'utiliserai des méthodes simples pour résoudre deux problèmes :
Premièrement, quel que soit le paramètre, le contour ne sera pas affiché lorsque vous faites glisser le formulaire ;
Deuxièmement, la détection de position est effectuée lorsque le formulaire est déplacé et il est ancré à un emplacement spécifique lorsque la position est appropriée.
De nombreuses personnes ont peut-être résolu ces problèmes, mais peut-être que le code ci-dessous vous aidera.
Troisième méthode
Le code suivant peut être copié directement dans Delphi, à condition que vous enregistriez Form1 sous uMain.pas et Form2 sous uDock.pas. Les événements utilisés sont : OnMouseDown, OnMouseMove, OnMouseUp, OnShow (Form1).
Il s'agit d'une méthode permettant de déplacer un formulaire en fonction du mouvement de la souris, comprenant deux formulaires, uMain et uDock (Form1 et Form2). Form2 est ouvert via Form1 et peut être ancré au bas de Form1. Une fois ancré, Form2 se déplacera avec Form1 jusqu'à ce que vous écartiez Form2.
Formulaire1
unité uMain ;
interface
utilise
Windows, messages, SysUtils, classes, graphiques, contrôles, formulaires, boîtes de dialogue ;
taper
TForm1 = classe(TForm)
procédure FormMouseDown(Sender:TObject; Button:TMouseButton;Shift:TShiftState;X,Y: Integer);
procédure FormMouseMove(Expéditeur : TObject ; Shift : TShiftState ;X,Y : Integer) ;
procédure FormMouseUp(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y: Integer);
procédure FormShow(Expéditeur : TObject);
privé
{Déclarations privées}
publique
DocktoForm : booléen ;
{Déclarations publiques}
fin;
var
Formulaire1 : TForm1 ;
CanMove, CanMoveX, CanMoveY : booléen ;
OldX, OldY : entier ;
F1X,F1Y,F2X,F2Y : entier ;
Zone de travail : TRect ;
mise en œuvre
utilise uDock ;
{$R *.DFM}
procédure TForm1.FormMouseDown(Expéditeur : TObject ; Bouton : TMouseButton ; Shift : TShiftState ; X, Y : Integer) ;
commencer
CanMoveX := vrai;
CanMoveY := vrai;
CanMove := vrai ;
VieuxX := X;
AncienY := Y ;
siDocktoForm alors
commencer
F1X := Form1.Left;
F1Y := Form1.Top;
F2X := Form2.Left;
F2Y := Form2.Top;
fin;
fin;
procédure TForm1.FormMouseMove(Sender : TObject ; Shift : TShiftState ; X, Y : Integer) ;
commencer
si (CanMove) alors
commencer
si CanMoveX alors
Form1.Left := Form1.Left + (X - OldX);
si CanMoveY alors
Form1.Top := Form1.Top + (Y - OldY);
//Cette section se verrouille en haut
si (Form1.Top < WorkArea.Top + 10) et (Form1.Top > WorkArea.Top-10) alors
commencer
Form1.Top := WorkArea.Top;
si (Y-OldY > 10) ou (Y-OldY < -10) alors
CanMoveY := vrai
autre
CanMoveY := Faux;
fin;
//Cette section se verrouille sur le côté gauche
si (Form1.Left < WorkArea.Left+10) et (Form1.Left > WoskArea.Left-10) alors
commencer
Form1.Left := WorkArea.Left;
si (X-OldX > 10) ou (X-OldX < -10) alors
CanMoveX := vrai
autre
CanMoveX := Faux ;
fin;
//Cette section se verrouille sur le côté droit
si (Form1.Left > WorkArea.Right-Form1.Width-10) et (Form1.Left < WorkArea.Right-Form1.Width+10) alors
commencer
Form1.Left := WorkArea.Right-Form1.Width;
si (X-OldX > 10) ou (X-OldX < -10) alors
CanMoveX := vrai
autre
CanMoveX := Faux ;
fin;
//Cette section se verrouille sur la barre des tâches
siDocktoForm alors
commencer
si (Form1.Top > WorkArea.Bottom-Form1.Height-Form2.Height-10) et (Form1.Top < WorkArea.Bottom-Form1.Height-Form2.Height+10) alors
commencer
Form1.Top := WorkArea.Bottom-Form1.Height-Form2.Height;
si (Y-OldY > 10) ou (Y-OldY < -10) alors
CanMoveY := vrai
autre
CanMoveY := Faux;
fin;
fin
sinon commencer
si (Form1.Top > WorkArea.Bottom-Form1.Height-10) et (Form1.Top < WorkArea.Bottom-Form1.Height+10) alors
commencer
Form1.Top := WorkArea.Bottom-Form1.Height;
si (Y-OldY > 10) ou (Y-OldY < -10) alors
CanMoveY := vrai
autre
CanMoveY := Faux;
fin;
fin;
siDocktoForm alors
commencer
Form2.Left := Form1.Left - (F1X-F2X);// + (X-OldX);
Form2.Top := Form1.Top+Form1.Height;
sortie;
fin;
//Cette section verrouille la playlist au centre de Form1
if (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) et (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Width div 2))+10) et
(Form2.Top > Form1.Top+Form1.Height-10) et (Form2.Top < Form1.Top+Form1.Height+10) puis
commencer
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
DocktoForm := Vrai ;
F1X := Form1.Left;
F1Y := Form1.Top;
F2X := Form2.Left;
F2Y := Form2.Top;
fin;
fin;
fin;
procédure TForm1.FormMouseUp(Expéditeur : TObject ; Bouton : TMouseButton ; Shift : TShiftState ; X, Y : Integer) ;
commencer
CanMove := faux;
fin;
procédure TForm1.FormShow(Expéditeur : TObject);
commencer
//Obtenir les paramètres de la zone de travail
SystemParametersInfo (SPI_GETWORKAREA, 0, @WorkArea, 0);
Form2.Show ;
fin;
fin.
Formulaire2
unité uDock;
interface
utilise
Windows, messages, SysUtils, classes, graphiques, contrôles, formulaires, boîtes de dialogue ;
taper
TForm2 = classe(TForm)
procédure FormMouseDown (Expéditeur : TObject ; Bouton : TMouseButton ; Shift : TShiftState ; X, Y : Integer) ;
procédure FormMouseMove (Expéditeur : TObject ; Shift : TShiftState ; X,Y : Integer) ;
procédure FormMouseUp (Expéditeur : TObject ; Bouton : TMouseButton ; Shift : TShiftState ; X, Y : Integer) ;
privé
{Déclarations privées}
publique
{Déclarations publiques}
fin;
var
Formulaire2 : TForm2 ;
CanMove, CanMoveX, CanMoveY, DocktoForm : booléen ;
OldX, OldY : entier ;
mise en œuvre
utilise uMain ;
{$R *.DFM}
procédure TForm2.FormMouseDown(Expéditeur : TObject ; Bouton : TMouseButton ; Shift : TShiftState ; X, Y : Integer) ;
commencer
CanMoveX := vrai;
CanMoveY := vrai;
CanMove := vrai ;
VieuxX := X;
AncienY := Y ;
fin;
procédure TForm2.FormMouseMove(Sender : TObject ; Shift : TShiftState ; X, Y : Integer) ;
commencer
si (CanMove) alors
commencer
si CanMoveX alors
Form2.Left := Form2.Left + (X - OldX);
si CanMoveY alors
Form2.Top := Form2.Top + (Y - OldY);
//Cette section se verrouille en haut
si (Form2.Top < WorkArea.Top + 10) et (Form2.Top > WorkArea.Top-10) alors
commencer
Form2.Top := WorkArea.Top;
si (Y-OldY > 10) ou (Y-OldY < -10) alors
CanMoveY := vrai
autre
CanMoveY := Faux;
fin;
//Cette section se verrouille sur le côté gauche
si (Form2.Left < WorkArea.Left+10) et (Form2.Left > WorkArea.Left-10) alors
commencer
Form2.Left := WorkArea.Left;
si (X-OldX > 10) ou (X-OldX < -10) alors
CanMoveX := vrai
autre
CanMoveX := Faux ;
fin;
//Cette section se verrouille sur le côté droit
si (Form2.Left > WorkArea.Right-Form2.Width-10) et (Form2.Left < WorkArea.Right-Form2.Width+10) alors
commencer
Form2.Left := WorkArea.Right-Form2.Width;
si (X-OldX > 10) ou (X-OldX < -10) alors
CanMoveX := vrai
autre
CanMoveX := Faux ;
fin;
//Cette section se verrouille sur la barre des tâches
si (Form2.Top > WorkArea.Bottom-Form2.Height-10) et (Form2.Top < WorkArea.Bottom-Form2.Height+10) alors
commencer
Form2.Top := WorkArea.Bottom-Form2.Height;
si (Y-OldY > 10) ou (Y-OldY < -10) alors
CanMoveY := vrai
autre
CanMoveY := Faux;
sortie;
fin;
//Cette section se verrouille en bas du lecteur
si (Form2.Top > Form1.Top+Form1.Height-10) et (Form2.Top < Form1.Top+Form1.Height+10) et (Form2.Left > Form1.Left-Form2.Width) et (Form2. Gauche < Form1.Left + Form1.Width) puis
commencer
Form2.Top := Form1.Top+Form1.Height;
si (Y-OldY > 10) ou (Y-OldY < -10) alors commencez
CanMoveY := vrai;
Form1.DockToForm := False;
fin
sinon commencer
CanMoveY := Faux;
Form1.DockToForm := True ;
fin;
fin;
//Cette section verrouille la playlist au centre de Form1
if (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) et (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Width div 2))+10) et
(Form2.Top > Form1.Top+Form1.Height-10) et (Form2.Top < Form1.Top+Form1.Height+10) puis
commencer
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
si (X-OldX > 10) ou (X-OldX < -10) ou (Y-OldY > 10) ou (Y-OldY < -10) alors
CanMoveX := vrai
autre
CanMoveX := Faux ;
fin;
fin;
fin;
procédure TForm2.FormMouseUp(Expéditeur : TObject ; Bouton : TMouseButton ;Shift : TShiftState ; X, Y : Integer) ;
commencer
CanMove := faux;
fin;
fin.
J'espère que ce qui précède sera utile à ceux qui ont des difficultés avec un contenu similaire.