déplacer une fenêtre sans barre de titre ...

déplacer une fenêtre sans barre de titre ... - Delphi/Pascal - Programmation

Marsh Posté le 07-06-2002 à 11:11:28    

Salut à tous  :hello:  
 
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 ...  :sweat:  
Donc je suis un peu perdu ... quelqu'un a une idée pour me sortir de là ?  :ange:  
 
Merci d'avance =)

Reply

Marsh Posté le 07-06-2002 à 11:11:28   

Reply

Marsh Posté le 07-06-2002 à 11:15:01    

OnMouseMove, et là dedans tu sais voir si le bouton est enfoncé ou non


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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

Reply

Marsh Posté le 07-06-2002 à 11:19:36    

:heink:
 

Citation :


type TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;
 
property OnMouseMove: TMouseMoveEvent;


 
if ssLeft in Shift then
  ... le bouton gauche est enfoncé ...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 07-06-2002 à 11:24:21    

euh ... désolé ... je comprends pas trop ton texte là ... :pt1cable:

Reply

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;

Reply

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 ?

Reply

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 =)


Message édité par _tantemerde le 06-07-2002 à 12:11:41
Reply

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 ?

Reply

Marsh Posté le 07-06-2002 à 16:20:47    

fenetre.ClientToScreen(Point(x,y))


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 07-06-2002 à 16:20:47   

Reply

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 ?

Reply

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...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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 ?

Reply

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)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 07-06-2002 à 16:53:00    

on a ici la version entreprise, mais je sais pas voir ce code  :p

Reply

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 :p


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 08-06-2002 à 16:24:25    

Allons allons, y a une autre solution plus propre  :ange:  
 
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;
 
 
 :hello:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

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 !!  ;)  :)  :D  
Je vais le garder dans un coin quand même et j'essayerai de le comprendre mieux plus tard =)  :jap:  
 
Pour l'instant je me contente de mon code pas top mains simple =)
 
Merci encore !!  :hello:

Reply

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;

Reply

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 !!  ;)  :)  :D  
Je vais le garder dans un coin quand même et j'essayerai de le comprendre mieux plus tard =)  :jap:  
 
Pour l'instant je me contente de mon code pas top mains simple =)
 
Merci encore !!  :hello:  




 
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  ;)


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 26-06-2002 à 10:03:30    

:bounce:  OKi  :spookie:  
          :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed