déplacer une fenêtre sans barre de titre ... - Delphi/Pascal - Programmation
Marsh Posté le 07-06-2002 à 11:15:01
OnMouseMove, et là dedans tu sais voir si le bouton est enfoncé ou non
Marsh Posté le 07-06-2002 à 11:17:33
ben nan justement, tu peux connaître si le bouton est enfoncé QUE dans OnMouseDown ou dans OnMouseUp ... c'est tout mon problème
Marsh Posté le 07-06-2002 à 11:19:36
Citation : |
if ssLeft in Shift then
... le bouton gauche est enfoncé ...
Marsh Posté le 07-06-2002 à 11:24:21
euh ... désolé ... je comprends pas trop ton texte là ...
Marsh Posté le 07-06-2002 à 11:31:27
voila le truc
procedure TForm1.Form1(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
//deplacement en cliquant sur la form
ReleaseCapture;
Form1.Perform(WM_SYSCOMMAND, $F012, 0);
end;
Marsh Posté le 07-06-2002 à 11:44:36
Impeccable ta procédure 3Phach4 !
Seulement j'aimerais pouvoir contôler la position de la fenêtre enfonction de sa position sur l'écran. On peut, avec ta méthode, connaitre les coordonnées de la fenêtre (ou de la souris) pendant le déplacement ?
Marsh Posté le 07-06-2002 à 12:11:02
Bon en fait, j'ai fini par comprendre ce que tu me disais antp, et voici ce que je fais (dans OnMouseMove):
if (ssLeft in Shift) then
Form1.Top := Form1.Top + Y;
Et ça marche puisque je voulais la délacer uniquement verticalement.
Maintenant, j'ai plus qu'à la faire docker en haut ou en bas de l'écran ...
Merci à tous les 2 =)
Marsh Posté le 07-06-2002 à 15:50:28
euh ... cela dit, tant qu'on y est, quelqu'un connait la manip pour connaître les coordonnées X et Y de la souris par rapport à l'écran et pas par rapport à la fenêtre qui gère le OnMouseMove ?
Marsh Posté le 07-06-2002 à 16:20:47
fenetre.ClientToScreen(Point(x,y))
Marsh Posté le 07-06-2002 à 16:23:13
ah ?
en fait depuis que j'ai posté ma question j'ai trouvé une réponse, mais elle est différente. J'utilise Mouse.CursorPos
L'une est mieux que l'autre ?
Marsh Posté le 07-06-2002 à 16:27:41
Bhen ça dépend si tu veux la position de la souris au moment de l'appel de la fonction ou si tu veux convertir des coordonnées relatives en coordonnées absolues...
Marsh Posté le 07-06-2002 à 16:37:00
ouais, j'ai regardé dans l'Aide la différence entre les 2 : je peux me servir des deux sans problème, mais peut-être qu'il y en a une qui est plus gourmande en ressources que l'autre ?
Marsh Posté le 07-06-2002 à 16:46:45
à mon avis le CursorPos est plus léger (faudrait voir le code de Borland pour être sûr, si t'as la version Pro ou Entreprise tu sais le voir facilement)
Marsh Posté le 07-06-2002 à 16:53:00
on a ici la version entreprise, mais je sais pas voir ce code
Marsh Posté le 07-06-2002 à 17:59:30
Clic de droite sur une fonction, find declaration, et normalement tu le vois.
Si il trouve pas, bhen fallait choisir d'installer les sources
Marsh Posté le 08-06-2002 à 16:24:25
Allons allons, y a une autre solution plus propre
Tu rajoutes ca en private
procedure WMNCHitTest(var Msg: TWMNCHitTest);message WM_NCHITTEST;
Puis
procedure TfoMain.WMNCHitTest(var Msg: TWMNCHitTest);
begin
inherited;
Msg.Result := HTCAPTION;
end;
Si tu veux le limiter au bouton gauche, tu sais rajouter un test genre
if (Msg.Result = HTCLIENT) and (HiWord(GetAsyncKeystate(VK_LBUTTON))>0) then
et si tu veux ne pas le faire sur un composant (ce serait pas mal de pas bouger sur un bouton par exemple), tu fais un truc du genre
begin
inherited;
if (Msg.Result = HTCLIENT) and (HiWord(GetAsyncKeystate(VK_LBUTTON))>0) then
begin
p.x:=Msg.Pos.x;
p.y:=Msg.Pos.y;
p:=self.ScreenToClient(p);
control:=self.ControlAtPos(p,true);
if (control<>nil) then
if (Control.Name <> 'BUSpeedButton1' and
(Control.Name <> 'BUSpeedButton2' then
Msg.Result := HTCAPTION;
end;
end;
Marsh Posté le 12-06-2002 à 17:37:18
merci bcp Zion, mais ton code utilise des méthodes un peu complexes pour moi ... mais merci bcp d'avoir fait l'effort de m'écrire tout ça !!
Je vais le garder dans un coin quand même et j'essayerai de le comprendre mieux plus tard =)
Pour l'instant je me contente de mon code pas top mains simple =)
Merci encore !!
Marsh Posté le 12-06-2002 à 19:46:26
pour bouger un composant tu peux aussi utiliser le truc décrit par 3phach4, tu peux aussi t'en servir pour les redimensionner en utilisant les constantes :
const
ResizeLeft = $F001;
ResizeRight = $F002;
ResizeTop = $F003;
ResizeTopLeft = $F004;
ResizeTopRight = $F005;
ResizeBottom = $F006;
ResizeBottomLeft = $F007;
ResizeBottomRight = $F008;
MoveComponent = $F012;
Marsh Posté le 15-06-2002 à 17:15:09
_tantemerde a écrit a écrit : merci bcp Zion, mais ton code utilise des méthodes un peu complexes pour moi ... mais merci bcp d'avoir fait l'effort de m'écrire tout ça !! Je vais le garder dans un coin quand même et j'essayerai de le comprendre mieux plus tard =) Pour l'instant je me contente de mon code pas top mains simple =) Merci encore !! |
T'as tord de pas l'utiliser, en simplifié, quand tu cliques sur une fenêtre, windows te demande si le mec clique sur la barre de titre, et la tu réponds oui tout le temps, tout simplement... Contrairement à la solution d'antp ou tu fais le déplacement toi même, et ca mêne parfois à des petits bugs d'affichages
Marsh Posté le 07-06-2002 à 11:11:28
Salut à tous
Voilà, j'ai créé sous Delphi 6 une sorte de 'barre des tâches', et cette barre n'a pas de barre de titre.
Je voudrais pouvoir la faire bouger, mais c'est impossible quand il n'y a pas de barre de titres.
J'ai essayé avec le OnMouseDown, mais ça bouge à chaque click : moi je voudrais que ça bouge tant que je n'ai pas relaché le click.
Apparament les fonction de drag et drop ne fonctionnent qu'entre plusieurs fenêtres entre elles ...
Donc je suis un peu perdu ... quelqu'un a une idée pour me sortir de là ?
Merci d'avance =)