[VB] Déplacer une image à la souris [résolu !]

Déplacer une image à la souris [résolu !] [VB] - VB/VBA/VBS - Programmation

Marsh Posté le 30-06-2003 à 12:43:11    

Bonjour !
Dans un petit programme, j'aimerai qu'on puisse déplacer une image avec la souris, un peu comme un glisser-déposer. J'ai mis en dessous le code que j'utilise. Cependant cette méthode a pour inconvénient de faire clignoter l'image quand elle passe par dessus d'autres contrôles, car elle est sans cesse redessinée.
J'ai fait des recherches du coté de DragDrop, mais lors du déplacement, seul le contour de l'image est affiché, alors que j'aimerai qu'on puisse voir son contenu.  
Comment puis-je procéder autrement ?
Merci :)
 

Code :
  1. Private Sub img_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  2. If Button = vbLeftButton Then
  3.         ' Mémorise le point ou l'on a cliqué
  4.         sOffsetX = X
  5.         sOffsetY = Y
  6. End If
  7. End Sub
  8. Private Sub Img_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  9.     Dim sNewLeft As Single, sNewTop As Single
  10.     If Button = vbLeftButton Then
  11.         With img
  12.             ' Calcule les nouvelles coordonées de l'image
  13.             sNewLeft = .Left - (sOffsetX - X)
  14.             sNewTop = .Top - (sOffsetY - Y)
  15.             ' Empêche l'image de sortir de la fenêtre
  16.             If sNewLeft < 0 Then
  17.                 sNewLeft = 0
  18.             ElseIf sNewLeft + .Width > ScaleWidth Then
  19.                 sNewLeft = ScaleWidth - .Width
  20.             End If
  21.             If sNewTop < 0 Then
  22.                 sNewTop = 0
  23.             ElseIf sNewTop + .Height > ScaleHeight Then
  24.                 sNewTop = ScaleHeight - .Height
  25.             End If
  26.             ' Déplace l'image à ce point
  27.             .Move sNewLeft, sNewTop
  28.         End With
  29.     End If
  30. End Sub


Message édité par Gnub le 03-07-2003 à 23:12:59
Reply

Marsh Posté le 30-06-2003 à 12:43:11   

Reply

Marsh Posté le 30-06-2003 à 15:12:44    

vous pensez qu'il faut que j'utilise DirectDraw ?  [:gnub]

Reply

Marsh Posté le 30-06-2003 à 15:20:28    

Les autres contrôles, ils sont de quels types ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 30-06-2003 à 15:42:27    

d'autres images...

Reply

Marsh Posté le 30-06-2003 à 16:44:25    

Y'a pas un truc AutoRedraw en VB ?
VB je connais mal. Une solution 100% VB je sais pas.
Mais sinon y'a des solutions, sans passer par DirectX.
Il va surement falloir te gérer les bitmap (=> GDI, blit, ...) toi même et non pas utiliser un composant tout pret.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 30-06-2003 à 18:36:41    

je regarde du coté des api BitBlt et StretchBlt, qui semblent pouvoir convenir dans mon cas, mais ça m'a l'air un tantinet ardu à utiliser  [:gnub]  
 
enfin après tout, stune bonne occasion d'apprendre :)


Message édité par Gnub le 30-06-2003 à 18:37:39
Reply

Marsh Posté le 03-07-2003 à 10:35:14    

Si j'y pense ce soir, faut que je regarde dans VB3, doit y avoir un exemple livré avec, ou du moins un exemple externe à Krosoft, c'est "vieux".
En essayant de changer l'attribut AutoRedraw des boutons (ou que certains), contrôles survolés, ça change qq chose ?
 
Imposer les coordonnées (.x = , .top = , etc..) au lieu de faire un move, je sais plus si ça change le comportement Windowsien ?

Reply

Marsh Posté le 03-07-2003 à 10:36:53    

Y'a aussi l'attribut clipchildren ou je sais plus quoi à voir non ?
Fait des recherches avec le mot clé "flickering"


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 03-07-2003 à 20:46:44    

CARBON_14 a écrit :

Si j'y pense ce soir, faut que je regarde dans VB3, doit y avoir un exemple livré avec, ou du moins un exemple externe à Krosoft, c'est "vieux".
En essayant de changer l'attribut AutoRedraw des boutons (ou que certains), contrôles survolés, ça change qq chose ?
 
Imposer les coordonnées (.x = , .top = , etc..) au lieu de faire un move, je sais plus si ça change le comportement Windowsien ?


 
Autoredraw ne change pas grand chose :/ J'ai aussi tenté d'imposer les coordonées, mais c'est presque pire que Move (qui est a mon avis plus rapide car elle regroupe deux déplacements en une seule fonction). Si tu retrouve ton exemple je suis preneur :)
 
Je vais faire des recherches du coté de clipchildren et flickering ; merci pour vos réponses :)

Reply

Marsh Posté le 03-07-2003 à 22:34:59    

Ai pas encore trouvé ce que je voulais mais avais un exemple avec API BilBlt et masque négatif etc.. Faudrait que je regarde comment ça pourrait s'adapter (pas totalement adapté, PictureBox). Dans un vieux PC Expert y avait méthode pour déplacer un poisson sur un fond quelconque, mais code C incomplet.
 
Sous VB3, bouger une PictureBox avec le code indiqué fonctionne à la perfection ! Mais une Image, ça cafouille (redessiné pas assez vite, moche). PC 486/100MHz, ss Win 3.11.
 
Ai écrit un truc pour déplacer du texte en C, faut que je regarde comment je faisais pour transposer. Si rien trouvé entre temps, je m'y replonge.
 
Ca ne serait pas possibler de mettre l'image dans une PictureBox (si ça existe encore dans les VB modernes), ça aiderait .


Message édité par Carbon_14 le 03-07-2003 à 22:42:35
Reply

Marsh Posté le 03-07-2003 à 22:34:59   

Reply

Marsh Posté le 03-07-2003 à 23:08:24    

tiens, je vais en effet tout de suite tester le coup de la picturebox : ce serait en effet une solution rapide et pratique...
 
Si ça ne marche pas, et qu'il esxiste dans d'autres langages des fonctions permettant de faire ça, je suis prenneur :) par contre pour intégrer ça au programme en vb, je ne sais pas si c'est façilement faisable...
Merci pour ton aide :)

Reply

Marsh Posté le 03-07-2003 à 23:12:38    

Miraculeux ! Ca marche en effet a la perfection avec la pictureBox. En fait je n'avais pas pensé a l'utiliser, car d'après ce que j'ai compris, ce composant utilise un peu plus de ressources que l'image. Cependant, puisque ça marche avec la PictureBox, je ne vais pas m'en priver :)
Un grand merci !

Reply

Marsh Posté le 04-07-2003 à 08:44:44    

Quad on regarde de près, une Image, en VB3 du moins, c'est "rien", juste les coordonnées d'une image qui y est "collée". Un emplacement géographique en fait.
 
Une PictureBox, c'est plus sophistiqué, c'est un conteneur à image (BMP, WMF, ..) qui a un mode de dessin, qui peut être réduite ou agrandie pour resizer son contenu, etc... Quand on la déplace, elle gère elle-même son contenu (avec les 4 BitBlt() de l'exemple de PC Expert).

Reply

Marsh Posté le 04-07-2003 à 10:04:35    

ok, je comprends mieux la différence :)

Reply

Sujets relatifs:

Leave a Replay

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