Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3973 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

Réafficher des lignes tracées sur une feuille

n°204027
rufo
Pas me confondre avec Lycos!
Posté le 28-08-2002 à 16:28:54  profilanswer
 

Reprise du message précédent :
il faut bien, une fois mon bmp sauvegardé, que j'utilise la méthode Paint de ma form pour savoir quand le réafficher, non?

mood
Publicité
Posté le 28-08-2002 à 16:28:54  profilanswer
 

n°204028
karlkox
Posté le 28-08-2002 à 16:28:55  profilanswer
 

Numéro qui est en faite un pointeur ( void* )

n°204032
karlkox
Posté le 28-08-2002 à 16:31:05  profilanswer
 

BitBlt peut suffire, il suffit que tu transmette le hdc de ton bitmap en mémoire en tant que hdc source.

n°204038
Carbon_14
Posté le 28-08-2002 à 16:33:46  profilanswer
 

Dans l'évènement paint, on peut mettre le BitBlt qui fait le travail inverse : copie l'image de la mémoire sur la feuille. Elle aurait été sauvée avant, après affichage et tracé des traits dessus.
 
Ca devient vite lourd... Faudrait trouver une bonne âme "guru" qui ait le même VB, sous le même OS pour voir ce qui cloche. Ca tient des fois à quasiment "rien" ! Mais quand on change de version de Windows, y a des fois des surprises de comportements, changements, ..

n°204048
karlkox
Posté le 28-08-2002 à 16:41:13  profilanswer
 

rufo>tu pourrais me send ton prog et me dire exactement le résultat que tu veux, j'essayerais de voir ca en soirée (je suis au boulot la).

n°204380
Carbon_14
Posté le 29-08-2002 à 09:01:45  profilanswer
 

A tout hasard, le fait que ce soit un GIF et qu'il soit transparent, c'est indispensable ?
Avec un BMP (le GIF transformé), c'est pareil ?
 
(Ai pas pu essayer hier soir dans ce contexte, les contrôles graphiques VB3 ne savaient contenir que DIB, BMP, WMF, ICO).
 
Windows, c'est lequel ?

n°204417
rufo
Pas me confondre avec Lycos!
Posté le 29-08-2002 à 10:02:51  profilanswer
 

je suis sous Windows 2000. Et non, c'est obligé d'avoir un gif transparent...

n°204422
rufo
Pas me confondre avec Lycos!
Posté le 29-08-2002 à 10:05:00  profilanswer
 

KarLKoX a écrit a écrit :

rufo>tu pourrais me send ton prog et me dire exactement le résultat que tu veux, j'essayerais de voir ca en soirée (je suis au boulot la).




 
je te remercie beaucoup. Je vais encore chercher aujourd'hui et si j'ai rien trouvé, je t'envoie mon code. Le pb, c'est que c'est un soft qui affiche l'état de potentiomètres d'un matériel. Donc, faudra que tu remplaces l'affichage réel des positions des 2 potars par des valeurs fixes...

n°204429
karlkox
Posté le 29-08-2002 à 10:15:53  profilanswer
 

oki ca marche :)

n°204455
Carbon_14
Posté le 29-08-2002 à 10:40:28  profilanswer
 

Y a aussi une méthode "lourde" qui consiste à avoir une série d'images GIF (transparente) des différentes positions du curseur (à condition qu'il n'y ait pas trop de positions possibles !!).
 
En affichant le potar puis, dessus, le curseur graphique..?
 
Avec BitBlt, on doit même pouvoir avoir une seule image de curseur et la plaquer sur l'autre au déplacement voulu (vu qu'on donne les coordonnées X et Y).

mood
Publicité
Posté le 29-08-2002 à 10:40:28  profilanswer
 

n°204540
rufo
Pas me confondre avec Lycos!
Posté le 29-08-2002 à 13:23:26  profilanswer
 

carbon_14 a écrit a écrit :

Y a aussi une méthode "lourde" qui consiste à avoir une série d'images GIF (transparente) des différentes positions du curseur (à condition qu'il n'y ait pas trop de positions possibles !!).
 
En affichant le potar puis, dessus, le curseur graphique..?
 
Avec BitBlt, on doit même pouvoir avoir une seule image de curseur et la plaquer sur l'autre au déplacement voulu (vu qu'on donne les coordonnées X et Y).  




 
Tu pourrais m'écrire un petit ex avec un objet form qui possède un objet image, et je veux dessiner une ligne sur cet objet image (et que cette ligne ne soit pas effacée quand on place une autre fenêtre dessus). Ca me suffierait.
 
ps: impossible la solution de plusieurs images de curseurs : 256 positions!

n°204555
Carbon_14
Posté le 29-08-2002 à 14:05:04  profilanswer
 

Je vais voir ça. Je me suis replongé dans VisualBasic 3 hier soir dans un gros projet que j'avais écrit avant de le transcrire en C pour le rendre "ultra"-rapide (pb affichage de courbes de spectros sur PC lent). Vieux souvenirs...
 
Je peux que charger du BMP. Je vais regarder avec les API si on peut pas déja positionner un trait (j'ai le code pour), voir si on le perd ou pas. Si on peut dessiner une flèche (un V et un I). Je peux tester le résultat sous Win2000.
Il n'est aps dit que VB3 soit transposable directement en VB5 ou 6. Des choses ont changé, les int sont devenu des "long" de l'ancien temps, ...
 
J'ai regardé hier aussi, on peut faire des tableaux (array) de Line. J'étais pas sûr.
 
Voir quand même avec Karlkox s'il peut faire avancer le schmilblick "live".

n°204625
rufo
Pas me confondre avec Lycos!
Posté le 29-08-2002 à 14:51:43  profilanswer
 

carbon_14 a écrit a écrit :

Je vais voir ça. Je me suis replongé dans VisualBasic 3 hier soir dans un gros projet que j'avais écrit avant de le transcrire en C pour le rendre "ultra"-rapide (pb affichage de courbes de spectros sur PC lent). Vieux souvenirs...
 
Je peux que charger du BMP. Je vais regarder avec les API si on peut pas déja positionner un trait (j'ai le code pour), voir si on le perd ou pas. Si on peut dessiner une flèche (un V et un I). Je peux tester le résultat sous Win2000.
Il n'est aps dit que VB3 soit transposable directement en VB5 ou 6. Des choses ont changé, les int sont devenu des "long" de l'ancien temps, ...
 
J'ai regardé hier aussi, on peut faire des tableaux (array) de Line. J'étais pas sûr.
 
Voir quand même avec Karlkox s'il peut faire avancer le schmilblick "live".




 
le tableau de line, j'ai essayé ce matin
Dim TableauLines(12) as Line
 
with TableauLines(0)
    .X1 = 0: .Y1 = 0: .X2 = 50: .Y2 = 50: visible = True
end with
 
ça marche aps, qu'est-ce-que j'ai oublié???

n°204628
rufo
Pas me confondre avec Lycos!
Posté le 29-08-2002 à 14:52:52  profilanswer
 

au fait, comment on fait pour détruire un objet créé comme précédemment?

n°204629
rufo
Pas me confondre avec Lycos!
Posté le 29-08-2002 à 14:53:36  profilanswer
 

rufo a écrit a écrit :

au fait, comment on fait pour détruire un objet créé comme précédemment?




 
a moins qu'il soit détruit à la fermeture de l'appli, du reste, j'en suis sûr quand j'y réfléchis...

n°204659
karlkox
Posté le 29-08-2002 à 15:26:18  profilanswer
 

avec l'API DeleteObject

n°204677
Carbon_14
Posté le 29-08-2002 à 15:37:22  profilanswer
 

En VB, les objets restent (me semble-t-il) jusqu'à la fin. On peut les cacher (Hide True ou Visible False) ce qui peut être pratique pour une Image qui sert de conteneur dans la feuille. La bitmap est déja chargée (ça évite de la mettre avec le projet et de devoir la charger à l'éxécution, et on peut la copier, en extraire des bouts quand besoin), cachée, on l'affiche pas et ne la voit jamais.
 
Sous VB moderne, je sais pas (on peut peut-être créer dynamiquement des objets ?), mais sous VB3, quand on voulait faire un tableau d'objets, c'est au design que cela se passe/passait. On crée un objet (bouton, trait, case à cocher), on renseigne les champs utiles, puis on le sélectionne, le copie et le colle pour en faire un clone. On nous demande alors si on veut faire un array (j'utilise VB 3 Pro donc en anglais :)) ou non. Si oui, le premier sera renomé Ligne(1), le nouveau Ligne(2) si le contrôle Line a été nommé Ligne. Si on continue, on crée Ligne(x). Si on avait dit non, le nouvel objet aurait un autre nom.
 
On peut, par contre, créer un tableau de coordonnées pour tracer soi-même (Me.Line ou par API). Cela permet de savoir/précalculer les positions des lignes avant traçage. Il faut avoir x1, y1, x2, y2. Je sais pas si la structure RECT existe en VB, ça aiderait..
 
Les deux rectangles à tracer en plus du curseur, ils sont pleins ou c'est juste un "cadre" de 4 traits ?
 

n°204689
rufo
Pas me confondre avec Lycos!
Posté le 29-08-2002 à 15:48:04  profilanswer
 

carbon_14 a écrit a écrit :

En VB, les objets restent (me semble-t-il) jusqu'à la fin. On peut les cacher (Hide True ou Visible False) ce qui peut être pratique pour une Image qui sert de conteneur dans la feuille. La bitmap est déja chargée (ça évite de la mettre avec le projet et de devoir la charger à l'éxécution, et on peut la copier, en extraire des bouts quand besoin), cachée, on l'affiche pas et ne la voit jamais.
 
Sous VB moderne, je sais pas (on peut peut-être créer dynamiquement des objets ?), mais sous VB3, quand on voulait faire un tableau d'objets, c'est au design que cela se passe/passait. On crée un objet (bouton, trait, case à cocher), on renseigne les champs utiles, puis on le sélectionne, le copie et le colle pour en faire un clone. On nous demande alors si on veut faire un array (j'utilise VB 3 Pro donc en anglais :)) ou non. Si oui, le premier sera renomé Ligne(1), le nouveau Ligne(2) si le contrôle Line a été nommé Ligne. Si on continue, on crée Ligne(x). Si on avait dit non, le nouvel objet aurait un autre nom.
 
On peut, par contre, créer un tableau de coordonnées pour tracer soi-même (Me.Line ou par API). Cela permet de savoir/précalculer les positions des lignes avant traçage. Il faut avoir x1, y1, x2, y2. Je sais pas si la structure RECT existe en VB, ça aiderait..
 
Les deux rectangles à tracer en plus du curseur, ils sont pleins ou c'est juste un "cadre" de 4 traits ?
 
 




 
oui, RECT, ça existe, mais je peux pas utiliser ça pour les 2 rectangles : ils sont orientés dans le même sens que la pointe de la flèche... Et RECT ne fait que des rectangles à l'horizontal (pas obliques)...
 
Pour les tracer avec des composants Line, je joue sur la propriété BorderWidth.
 
Et pour l'instant, pour tracer mes lignes de la flèche, j'utilise Me.Line (mais ça s'efface, d'où mon pb :()


Message édité par rufo le 29-08-2002 à 15:48:32
n°204705
karlkox
Posté le 29-08-2002 à 16:04:08  profilanswer
 

Arf ! scuze, j'avais compris objet au niveau programmation et pas controle :-p

n°204709
rufo
Pas me confondre avec Lycos!
Posté le 29-08-2002 à 16:07:32  profilanswer
 

KarLKoX a écrit a écrit :

Arf ! scuze, j'avais compris objet au niveau programmation et pas controle :-p




 
non, c'est moi qui me suis mal exprimé : t'a raison, on dit contrôle quand c'est un élément graphique d'une feuille, sinon, c'est un objet.

n°204746
Carbon_14
Posté le 29-08-2002 à 16:37:09  profilanswer
 

Zut, craignant de ne pas être compris :pt1cable:, j'ai changé plein de contrôles de mon texte en objet... :(
 
Je teste API pour traits ce soir, si ça résoud le pb, ça suffira car pas la peine de grosse artillerie sauf quand pas moyen autrement. :D  
 
Y a donc trois traits pr flèche, et deux fois 4 pour les "losanges". Y a une API polygone je crois, on doit pouvoir dessiner des formes "bizarres" éventuellement remplies de couleur.

n°205307
Carbon_14
Posté le 30-08-2002 à 08:58:37  profilanswer
 

Essais sous VB3 : confirme que quand on a un dessin dans une Picture, toute tentative de dessin de trait au dessus échoue (caché derrière ??, inhibé par VB ? zone d'interdiction ? Mode "zéro_pen" ?).
 
Par BitBlt sur la feuille hors contrôle VB puis MoveToEx, LineTo, ça marche bien.
 
Exemple VB3/API envoyé par mail. Testé ss Win2K.

n°205309
rufo
Pas me confondre avec Lycos!
Posté le 30-08-2002 à 08:58:43  profilanswer
 

carbon_14 a écrit a écrit :

Zut, craignant de ne pas être compris :pt1cable:, j'ai changé plein de contrôles de mon texte en objet... :(
 
Je teste API pour traits ce soir, si ça résoud le pb, ça suffira car pas la peine de grosse artillerie sauf quand pas moyen autrement. :D  
 
Y a donc trois traits pr flèche, et deux fois 4 pour les "losanges". Y a une API polygone je crois, on doit pouvoir dessiner des formes "bizarres" éventuellement remplies de couleur.




 
à la limite, te fait pas chier. Si on me montre un exemple d'une ligne qui est tracée live (run-time) par-dessus un contrôle image et qu'elle ne s'efface pas quand une autre feuille passe par-dessus, ça me va. Je me débrouillerai ensuite pour faire ma flèche et mes 2 rectangles...

n°205479
Carbon_14
Posté le 30-08-2002 à 11:24:32  profilanswer
 

Cf mail pour voir si ça convient...

n°207136
rufo
Pas me confondre avec Lycos!
Posté le 02-09-2002 à 14:01:46  profilanswer
 

carbon_14 a écrit a écrit :

Cf mail pour voir si ça convient...




 
Je vais regarder ça aujourd'hui... je te tiens au cours. En tout cas, merci de ton aide :jap:

n°207761
rufo
Pas me confondre avec Lycos!
Posté le 03-09-2002 à 09:17:05  profilanswer
 

j'ai regardé ton code, il a l'air assez simple. J'ai bon espoir de pouvoir le réutiliser pour faire ce que je veux. Par contre, j'ai pas pu lancer l'exe, vu que j'ai pas le VBRUN300.dll

n°207771
Carbon_14
Posté le 03-09-2002 à 09:37:14  profilanswer
 

Je l'envoie pas mail compressé (on peut aussi le télécharger, par ex http://telecharger.01net.com/windo [...] 468.html).
 
J'espère qu'il n'y pas trop de modif pour adapter le source directement sous VB4, VB5, VB6, ..(déclaration des API poour le 32 bits, ..).

n°207862
rufo
Pas me confondre avec Lycos!
Posté le 03-09-2002 à 11:35:33  profilanswer
 

c'est bon, j'ai récupéré sur un site (ton lien marchait pas) la dll ; j'ai pu tester ton exe. Ca fait ce que je veux, donc, c'est cool :) Y'a plus qu'à trouver un moment pour utiliser ton code dans le mien... Merci de ton aide, en tout cas :jap:

n°207924
Carbon_14
Posté le 03-09-2002 à 13:25:21  profilanswer
 

L'URL comporte la parenthèse de fin et le point en trop, c'est pourquoi ça peut pas marcher. J'eusse dû ajouter un espace à la fin :) .
 
Ca fait du bien de se remettre une soirée à VB3, mais on se rouille vite !!  :jap:  :jap:

n°208436
rufo
Pas me confondre avec Lycos!
Posté le 04-09-2002 à 11:25:50  profilanswer
 

ca trace, mais ça se réaffiche toujours en-dessous de mon Image :cry:
Voici mon code :
 

Code :
  1. Private Sub Form_Paint()
  2.     Call ColleImage(Me, PictureTmp.Picture, ImgRondFloodLT(0).Left, ImgRondFloodLT(0).Top, ImgRondFloodLT(0).Width, ImgRondFloodLT(0).Height)
  3. End Sub
  4.       ......... 'on s'en fout ce qu'il y a ici
  5. Private Sub Affiche_Trame_C2S()
  6. Dim i, indiceTrame As Integer
  7. Dim x As Byte
  8.             ... ' on s'en fout ce qu'il y a ici
  9.         If (x And 2 ^ 1) = 2 ^ 1 Then
  10.             Call C2SPositionPotar(TrameC2S(1), 0, 240, 255, 300, 8, 8, 7, 255, 0, 0, 1, ImgRondFloodLT(0))    ' Affichage de la flèche en rouge car l'interrupteur est activé
  11.             Call C2SPositionMotifPotar(TrameC2S(1), 0, 240, 255, 300, 22, 3, 255, 255, 255, ImgPotarFloodLt(0))   ' Affichage du motif sur le potentiomètre
  12.         Else
  13.             Call C2SPositionPotar(TrameC2S(1), 0, 240, 255, 300, 8, 8, 7, 255, 255, 255, 1, ImgRondFloodLT(0))    ' Affichage de la flèche en blanc car l'interrupteur est désactivé
  14.             Call C2SPositionMotifPotar(TrameC2S(1), 0, 240, 255, 300, 22, 3, 255, 255, 255, ImgPotarFloodLt(0))   ' Affichage du motif sur le potentiomètre
  15.         End If
  16.         If (x And 2 ^ 2) = 2 ^ 2 Then
  17.             Call C2SPositionPotar(TrameC2S(2), 0, 240, 255, 300, 8, 8, 7, 255, 0, 0, 1, ImgRondFloodLT(1))    ' Affichage de la flèche en rouge car l'interrupteur est activé
  18.             Call C2SPositionMotifPotar(TrameC2S(2), 0, 240, 255, 300, 22, 3, 255, 255, 255, ImgPotarFloodLt(1))   ' Affichage du motif sur le potentiomètre
  19.         Else
  20.             Call C2SPositionPotar(TrameC2S(2), 0, 240, 255, 300, 8, 8, 7, 255, 255, 255, 1, ImgRondFloodLT(1))    ' Affichage de la flèche en blanc car l'interrupteur est désactivé
  21.             Call C2SPositionMotifPotar(TrameC2S(2), 0, 240, 255, 300, 22, 3, 255, 255, 255, ImgPotarFloodLt(1))   ' Affichage du motif sur le potentiomètre
  22.         End If
  23. End Sub
  24. '*******************************************************************************
  25. ' C2SPositionPotar :
  26. ' entrées :
  27. '       - Octet : valeur de l'octet de donnée.
  28. '       - ValOctetMin : valeur minimal de octet (valeur comprise entre 0 et 255)
  29. '       - ValAngleMin : valeur de l'angle en degrés associée à ValOctetMin (valeur comprise entre 0 et 360)
  30. '       - ValOctetMax : valeur minimal de octet (valeur comprise entre 0 et 255)
  31. '       - ValAngleMax : valeur de l'angle en degrés associée à ValOctetMin (valeur comprise entre 0 et 360)
  32. '       - LongueurFleche : longueur de la flèche (en pixel)
  33. '       - PetiteLongueurFleche : longueur du coté de la flèche (en pixel)
  34. '       - AngleFleche : angle opposé de la pointe de la flèche (en degrés)
  35. '       - CoulR, CoulV, CoulB : codes RVB de la couleur de la flèche (valeurs comprises entre 0 et 255)
  36. '       - ModeAffichage : 1 -> que la pointe de la flèche, 2 -> la ligne centrale, 3 -> toute la flèche
  37. '       - ctrl : controle servant à matérialiser la position du potar.
  38. ' sorties :
  39. '       - ctrl : controle servant à matérialiser la position du potar.
  40. ' retour : -
  41. '
  42. ' Gestion de l'affichage de la position d'un potentiomètre.
  43. ' Cette procédure fonctionne aussi bien en Twips qu'en pixels
  44. '
  45. ' date de création : 19/08/2002         auteur : C. Javouhey
  46. '
  47. ' Modification : 04/09/2002             auteur : C. Javouhey
  48. ' Réaffichage de la flèche quand celle-ci est effacée par une autre fenêtre
  49. '*******************************************************************************
  50. Private Sub C2SPositionPotar(ByVal Octet As Integer, ByVal ValOctetMin As Integer, ByVal ValAngleMin As Integer, ByVal ValOctetMax As Integer, ByVal ValAngleMax As Integer, ByVal LongueurFleche As Integer, ByVal PetiteLongueurFleche As Integer, ByVal AngleFleche As Integer, ByVal CoulR As Byte, ByVal CoulV As Byte, ByVal CoulB As Byte, ByVal ModeAffichage As Integer, ByRef ctrl As Control)
  51. Dim CoordCentrePotarX, CoordCentrePotarY, Rayon As Integer
  52. Dim X1, Y1, X2, Y2, X3, Y3, X4, Y4 As Integer
  53. Dim Unite, Angle As Double
  54. '---------------------------------
  55. Dim hdc As Long
  56. Dim hPen As Long
  57. Dim hPenOld As Long
  58. Dim rop As Long
  59. Dim Bid As Long
  60. Dim destScale As Integer
  61. '--------------------------------
  62. Const PI = 3.14159265358979
  63.     ' Prise en compte du mode d'affichage de la feuille : Pixel ou Twip
  64.     'If Me.ScaleMode = 1 Then
  65.     '    LongueurFleche = LongueurFleche * Screen.TwipsPerPixelX
  66.     '    PetiteLongueurFleche = PetiteLongueurFleche * Screen.TwipsPerPixelX
  67.     'End If
  68.    
  69.     '--------------------------------------------------------------------
  70.     destScale = Me.ScaleMode 'Store ScaleMode to restore later
  71.     Me.ScaleMode = PIXEL     'Set ScaleMode to pixels for Windows GDI
  72.     '--------------------------------------------------------------------
  73.     ' Calcul du centre du potar et de son rayon
  74.     CoordCentrePotarX = ctrl.Left + (ctrl.Width) \ 2
  75.     CoordCentrePotarY = ctrl.Top + (ctrl.Height) \ 2
  76.     Rayon = ctrl.Width \ 2
  77.    
  78.     ' Calcul de la correspondance entre la valeur de l'octet et l'angle
  79.     Unite = (ValOctetMax - ValOctetMin) / (360 - (ValAngleMax - ValAngleMin))
  80.     If (Octet >= ValOctetMin) And (Octet <= ValOctetMax) Then
  81.         Angle = -(ValAngleMin / (ValAngleMin * Unite - ValOctetMin)) * (Octet - ValAngleMin * Unite)
  82.    
  83.         ' Calcul des coordonnées de la pointe de la flèche
  84.         X1 = Rayon * Cos(Angle * PI / 180) + CoordCentrePotarX
  85.         Y1 = -(Rayon * Sin(Angle * PI / 180)) + CoordCentrePotarY    ' Pour le changement de repère
  86.    
  87.         ' Calcul des coordonnées des extrêmités centrale, droite et gauche de la flèche
  88.         X2 = (Rayon - LongueurFleche) * Cos(Angle * PI / 180) + CoordCentrePotarX
  89.         Y2 = -((Rayon - LongueurFleche) * Sin(Angle * PI / 180)) + CoordCentrePotarY
  90.    
  91.         X3 = ((Rayon - PetiteLongueurFleche) / Cos(AngleFleche * PI / 180)) * Cos((Angle + AngleFleche) * PI / 180) + CoordCentrePotarX
  92.         Y3 = -(((Rayon - PetiteLongueurFleche) / Cos(AngleFleche * PI / 180)) * Sin((Angle + AngleFleche) * PI / 180)) + CoordCentrePotarY
  93.         X4 = ((Rayon - PetiteLongueurFleche) / Cos(AngleFleche * PI / 180)) * Cos((Angle - AngleFleche) * PI / 180) + CoordCentrePotarX
  94.         Y4 = -(((Rayon - PetiteLongueurFleche) / Cos(AngleFleche * PI / 180)) * Sin((Angle - AngleFleche) * PI / 180)) + CoordCentrePotarY
  95.         '-------------------------------------------
  96.         ' Préparation du dessin de la flèche
  97.         hdc = GetDC(Me.hwnd)
  98.         hPen = CreatePen(PS_SOLID, 1, RGB(CoulR, CoulV, CoulB))
  99.         hPenOld = SelectObject(hdc, hPen)
  100.         rop = SetROP2(hdc, R2_COPYPEN)
  101.         '--------------------------------------------
  102.         ' Affichage de la pointe de la flèche
  103.         If (ModeAffichage And 2 ^ 0) = 2 ^ 0 Then
  104.             'Me.Line (X1, Y1)-(X3, Y3), RGB(CoulR, CoulV, CoulB)
  105.             'Me.Line (X1, Y1)-(X4, Y4), RGB(CoulR, CoulV, CoulB)
  106.             'Me.Line (X3, Y3)-(X4, Y4), RGB(CoulR, CoulV, CoulB)
  107.            
  108.             '-------------------------------------------------------
  109.             Call TraceTrait(hdc, X1, Y1, X3, Y3)
  110.             Call TraceTrait(hdc, X1, Y1, X4, Y4)
  111.             Call TraceTrait(hdc, X3, Y3, X4, Y4)
  112.             '-------------------------------------------------------
  113.         End If
  114.        
  115.         ' Affichage de la ligne centrale de la flèche
  116.         If (ModeAffichage And 2 ^ 1) = 2 ^ 1 Then
  117.             'Me.Line (X1, Y1)-(X2, Y2), RGB(CoulR, CoulV, CoulB)
  118.            
  119.             '-------------------------------------------------------
  120.             Call TraceTrait(hdc, X1, Y1, X2, Y2)
  121.             '-------------------------------------------------------
  122.         End If
  123.        
  124.         '----------------------------------------------------------
  125.         Bid = SetROP2(hdc, rop)            ' remet "comme avant"
  126.         Bid = SelectObject(hdc, hPenOld)   ' libère Object
  127.         Bid = DeleteObject(hPen)           ' détruit hPen
  128.         Bid = ReleaseDC(Me.hwnd, hdc)
  129.         '-----------------------------------------------------------
  130.     End If
  131.    
  132.     '-------------------------------------------------------------
  133.     Me.ScaleMode = destScale  'Restore ScaleMode of destination
  134.     '-------------------------------------------------------------
  135.    
  136. End Sub
  137. Private Sub ColleImage(dest As Form, ByVal srcBmp As Long, Xdest As Integer, Ydest As Integer, bmWidth As Integer, bmHeight As Integer)
  138.     Dim destScale As Integer
  139.     Dim srcDC As Long       'source bitmap (color)
  140.     Dim hPrevBmp As Long    'Bitmap holds previous bitmap selected in DC
  141.     Dim hSrcPrevBmp As Long 'Holds previous bitmap in source DC
  142.     Dim Success As Long     'Stores result of call to Windows API
  143.     destScale = dest.ScaleMode 'Store ScaleMode to restore later
  144.     dest.ScaleMode = PIXEL     'Set ScaleMode to pixels for Windows GDI
  145.     srcDC = CreateCompatibleDC(dest.hdc)      'Create DC to hold stage
  146.     hSrcPrevBmp = SelectObject(srcDC, srcBmp) 'Select bitmap in DC
  147.     Success = BitBlt(dest.hdc, Xdest, Ydest, bmWidth, bmHeight, srcDC, 0, 0, SRCCOPY)
  148.      
  149.     hPrevBmp = SelectObject(srcDC, hSrcPrevBmp)     'Select orig object
  150.     Success = DeleteDC(srcDC)          'Deallocate system resources.
  151.    
  152.     dest.ScaleMode = destScale 'Restore ScaleMode of destination.
  153. End Sub
  154. Private Sub TraceTrait(ByVal hdcT As Long, ByVal X1 As Integer, ByVal Y1 As Integer, ByVal X2 As Integer, ByVal Y2 As Integer)
  155. Dim i As Long
  156. Dim Pnt As POINTAPI
  157.     i = MoveToEx(hdcT, X1, Y1, Pnt)
  158.     i = LineTo(hdcT, X2, Y2)
  159. End Sub


 
Qu'est ce qui déconne? J'ai bien mis un PictureBox et je l'ai mis en autoredraw (mais en non autoredraw, ça marche pas mieux).
Au fait, pourquoi je vois rien s'afficher dans mon picturebox (vu que c'est lui qui sauvegarde le bout de bmp??? Merci de m'aider...

n°208530
Carbon_14
Posté le 04-09-2002 à 13:27:43  profilanswer
 

J'ai juste survolé, faudra que je copie/colle car boulot au labo :(.
 
Dans l'exemple donné, le PictureBox sert de conteneur. Faut le remplir sous VB au développement (ds membre Picture du PictureBox), ou en dynamique par un truc genre LoadImage().
Cette image était "cachée" pour justement ne pas la voir car elle sert de conteneur, pour faciliter son recollage à chaque PAINT (j'ai pas trouvé mieux en une soirée, je crois qu'on peut avoir HDC virtuel (in memory) mais faut voir).
 
Le ColleImage() colle l'image choisie sur la feuille Me hors TOUT CONTROLE, aux coordonnées désirées. Faut pas avoir de Picture ou Imagebox ou autre supplémentaire pour l'y coller. C'est comme un "Tag" par rapport à une "toîle de maître".
Je dis ça car j'espère que ImgRondFloodLT n'est pas un objet graphique mais juste un tableau de coordonnées.
 
Pas facile à gérer ... VB joue des tours ?
 
Dans mon exemple, en remplaçant mon image par la GIF transparente, ça donne quoi ? En la transformant en BMP (uniquement pour test voir si c'est le GIF ou le TRANSPARENT qui gène) ?
Peut-être que pas à pas, à partir de qq chose qui fonctionne, en modifiant ça puis ci.

n°208539
rufo
Pas me confondre avec Lycos!
Posté le 04-09-2002 à 13:39:57  profilanswer
 

carbon_14 a écrit a écrit :

J'ai juste survolé, faudra que je copie/colle car boulot au labo :(.
 
Dans l'exemple donné, le PictureBox sert de conteneur. Faut le remplir sous VB au développement (ds membre Picture du PictureBox), ou en dynamique par un truc genre LoadImage().
Cette image était "cachée" pour justement ne pas la voir car elle sert de conteneur, pour faciliter son recollage à chaque PAINT (j'ai pas trouvé mieux en une soirée, je crois qu'on peut avoir HDC virtuel (in memory) mais faut voir).
 
Le ColleImage() colle l'image choisie sur la feuille Me hors TOUT CONTROLE, aux coordonnées désirées. Faut pas avoir de Picture ou Imagebox ou autre supplémentaire pour l'y coller. C'est comme un "Tag" par rapport à une "toîle de maître".
Je dis ça car j'espère que ImgRondFloodLT n'est pas un objet graphique mais juste un tableau de coordonnées.
 
Pas facile à gérer ... VB joue des tours ?
 
Dans mon exemple, en remplaçant mon image par la GIF transparente, ça donne quoi ? En la transformant en BMP (uniquement pour test voir si c'est le GIF ou le TRANSPARENT qui gène) ?
Peut-être que pas à pas, à partir de qq chose qui fonctionne, en modifiant ça puis ci.




 
si, ImgRondFloodLT est un contrôle graphique qui contient mon image du potentiomètre...
par contre, j'ai pas compris ce que tu mettais dans le picturebox comme image de départ? ta flèche???

n°208541
rufo
Pas me confondre avec Lycos!
Posté le 04-09-2002 à 13:41:28  profilanswer
 

sinon, est ce qu'il y a un moyen de copier en mémoire une portion de ma feuille, avec ses composants qui se trouvent dans cette portion, sous forme de bmp??? Un genre d'imprime écran partiel...

n°208563
Carbon_14
Posté le 04-09-2002 à 14:06:27  profilanswer
 

Dans le PictureBox de mon exemple, c'est l'image du potentiomètre (ce que j'ai dessiné en vitesse, c'est pas artistique : rect blanc, rect noir, mais rapide :D), c'est pas non plus un vrai potar ...
 
Si on colle l'image sur elle même, ça ne permet pas de s'affranchir de la gestion Windows/VB.
Le but du jeu était de stocker cette fameuse image (sous réserve qu'elle ne soit pas altérée si elle est transparente (autre pb)) dans un conteneur (PictureBox est plus simple et rapide à gérer qu'un handle mémoire) qui soit dans le projet, dans la feuille, mais qu'on ne le voit pas (c'est pour cela que je l'ai mis assez bas, et que j'ai remonté le bord inférieur de la feuille).
 
BitBlt() recopie tous les bits de cette PictureBox à l'endroit qu'on veut, sur la feuille qu'on veut de notre projet. La picturebox sert de "bouteille à image".
 
Si on colle soi-même sur la feuille, on peut mieux gérer le comportement. Vu qu'on sait pas ce que Windows et VB font des PictureBox par rapport aux Line() (ordre de dessin, priorité, qui est "en avant", "en arrière" ????), ça permet en fait de gérer les choses soi-même, à la main. On devient son propre gestionnaire graphique (si je puis dire).
 
A chaque PAINT, on veut ré-afficher l'image. BitBlt() le permet facilement, à condition que ce soit sur un fond non perturbé par le système. Le PictureBox aurait tendance à répondre à son propre PAINT, quand et comme il "veut".

n°208600
rufo
Pas me confondre avec Lycos!
Posté le 04-09-2002 à 14:53:47  profilanswer
 

carbon_14 a écrit a écrit :

Dans le PictureBox de mon exemple, c'est l'image du potentiomètre (ce que j'ai dessiné en vitesse, c'est pas artistique : rect blanc, rect noir, mais rapide :D), c'est pas non plus un vrai potar ...
 
Si on colle l'image sur elle même, ça ne permet pas de s'affranchir de la gestion Windows/VB.
Le but du jeu était de stocker cette fameuse image (sous réserve qu'elle ne soit pas altérée si elle est transparente (autre pb)) dans un conteneur (PictureBox est plus simple et rapide à gérer qu'un handle mémoire) qui soit dans le projet, dans la feuille, mais qu'on ne le voit pas (c'est pour cela que je l'ai mis assez bas, et que j'ai remonté le bord inférieur de la feuille).
 
BitBlt() recopie tous les bits de cette PictureBox à l'endroit qu'on veut, sur la feuille qu'on veut de notre projet. La picturebox sert de "bouteille à image".
 
Si on colle soi-même sur la feuille, on peut mieux gérer le comportement. Vu qu'on sait pas ce que Windows et VB font des PictureBox par rapport aux Line() (ordre de dessin, priorité, qui est "en avant", "en arrière" ????), ça permet en fait de gérer les choses soi-même, à la main. On devient son propre gestionnaire graphique (si je puis dire).
 
A chaque PAINT, on veut ré-afficher l'image. BitBlt() le permet facilement, à condition que ce soit sur un fond non perturbé par le système. Le PictureBox aurait tendance à répondre à son propre PAINT, quand et comme il "veut".




 
bref, je suis pas dans la merde, c'est ça? J'ai trouvé une API sympa : StretchBlt
et getDC(0) qui permet de récupérer le DC de l'écran. J'ai donc pu mettre dans un picturebox la portion de l'écran qui contient mon potar + la flèche :) Maintenant, il me reste à trouver comment réafficher le contenu du picturebox par-dessus mon potar...:( Pas avec un autre picturebox en tout cas. J'ai essayé, ça merde.
Est-ce-qu'il y a un moyen de remplacer mon picturebox par un tampon mérmoire?

n°208601
Carbon_14
Posté le 04-09-2002 à 14:57:26  profilanswer
 

Pour les fonctions d'imprime écran partiel, faut que je regarde ce que donnent les fonctions du C (API Windows en fait) sous VB(3). Ca est très possible une fois pour l'écran entier.
 
Je jette un coup d'oeil, quand je peux.

n°208610
rufo
Pas me confondre avec Lycos!
Posté le 04-09-2002 à 15:03:08  profilanswer
 

carbon_14 a écrit a écrit :

Pour les fonctions d'imprime écran partiel, faut que je regarde ce que donnent les fonctions du C (API Windows en fait) sous VB(3). Ca est très possible une fois pour l'écran entier.
 
Je jette un coup d'oeil, quand je peux.




 
ben ça marche mon imprime-écran partiel, faut juste que je trouve le moyen de le réafficher comme je veux maintenant...

n°208614
Carbon_14
Posté le 04-09-2002 à 15:07:16  profilanswer
 

Au lieu de se casser la tête, pourquoi ne pas essayer mon exemple (s'il marche en VB4_5_6), et ne faire que remplacer l'image ?
Faut PAS faire BilBlt sur une Image ou PictureBox, sinon, elle se gère elle-même et réagit de façon malveillante (!).
 
 
StretchBlt(), il me semble me souvenir qu'il sert surtout (??) à changer la taille des images.
BitBlt(), si on donne pas 0, 0 et la taille habituelle de l'image, on peut aussi faire (faut faire calculs de positions).
BOOL BitBlt(
    HDC hdcDest, // handle to destination device context  
    int nXDest, // x-coordinate of destination rectangle's upper-left corner
    int nYDest, // y-coordinate of destination rectangle's upper-left corner
    int nWidth, // width of destination rectangle  
    int nHeight, // height of destination rectangle  
    HDC hdcSrc, // handle to source device context  
    int nXSrc, // x-coordinate of source rectangle's upper-left corner  
    int nYSrc, // y-coordinate of source rectangle's upper-left corner
    DWORD dwRop  // raster operation code  
   );  
 
Le code C que j'avais adapté une fois servait à copier l'écran du PC en totalité.
 
void CaptureScreen(HWND hWndMain, long Left, long Top, long Width, long Height)
{
   HDC srcDC; (integer)
   HDC trgDC;  (integer)
   HBITMAP BMPHandle; (long ? ai oublié)
   DEVMODE *dm; (pb ! à voir)
 
   srcDC = CreateDC("DISPLAY", "", "", &dm);
   trgDC = CreateCompatibleDC(srcDC);
   BMPHandle = CreateCompatibleBitmap(srcDC, Width, Height);
   SelectObject(trgDC, BMPHandle);
   BitBlt(trgDC, 0, 0, Width, Height, srcDC, Left, Top, SRCCOPY);
   OpenClipboard(hWndMain);
   EmptyClipboard();
   SetClipboardData(CF_BITMAP, BMPHandle);
   CloseClipboard();
   DeleteDC(trgDC);
   ReleaseDC(BMPHandle, srcDC);
}
 
 

n°208628
rufo
Pas me confondre avec Lycos!
Posté le 04-09-2002 à 15:35:06  profilanswer
 

carbon_14 a écrit a écrit :

Au lieu de se casser la tête, pourquoi ne pas essayer mon exemple (s'il marche en VB4_5_6), et ne faire que remplacer l'image ?
Faut PAS faire BilBlt sur une Image ou PictureBox, sinon, elle se gère elle-même et réagit de façon malveillante (!).
 
 
StretchBlt(), il me semble me souvenir qu'il sert surtout (??) à changer la taille des images.
BitBlt(), si on donne pas 0, 0 et la taille habituelle de l'image, on peut aussi faire (faut faire calculs de positions).
BOOL BitBlt(
    HDC hdcDest, // handle to destination device context  
    int nXDest, // x-coordinate of destination rectangle's upper-left corner
    int nYDest, // y-coordinate of destination rectangle's upper-left corner
    int nWidth, // width of destination rectangle  
    int nHeight, // height of destination rectangle  
    HDC hdcSrc, // handle to source device context  
    int nXSrc, // x-coordinate of source rectangle's upper-left corner  
    int nYSrc, // y-coordinate of source rectangle's upper-left corner
    DWORD dwRop  // raster operation code  
   );  
 
Le code C que j'avais adapté une fois servait à copier l'écran du PC en totalité.
 
void CaptureScreen(HWND hWndMain, long Left, long Top, long Width, long Height)
{
   HDC srcDC; (integer)
   HDC trgDC;  (integer)
   HBITMAP BMPHandle; (long ? ai oublié)
   DEVMODE *dm; (pb ! à voir)
 
   srcDC = CreateDC("DISPLAY", "", "", &dm);
   trgDC = CreateCompatibleDC(srcDC);
   BMPHandle = CreateCompatibleBitmap(srcDC, Width, Height);
   SelectObject(trgDC, BMPHandle);
   BitBlt(trgDC, 0, 0, Width, Height, srcDC, Left, Top, SRCCOPY);
   OpenClipboard(hWndMain);
   EmptyClipboard();
   SetClipboardData(CF_BITMAP, BMPHandle);
   CloseClipboard();
   DeleteDC(trgDC);
   ReleaseDC(BMPHandle, srcDC);
}
 
 
 




 
ton code, là, c'est pour mettre dans le presse-papier de windows l'image de ta fenêtre principale, non?

n°208646
Carbon_14
Posté le 04-09-2002 à 15:52:48  profilanswer
 

Voui, mais comme j'ai pas le temps de suite, j'ai mis ce que j'avais.
Le hWndMain, on l'a par GetDesktopWindow(); mais ça nous avance pas. :D

n°208732
rufo
Pas me confondre avec Lycos!
Posté le 04-09-2002 à 16:57:30  profilanswer
 

finalement, en désespoir de cause, je me suis rabattu sur une solution simple : les contrôles Line (6 par potar) et ça marche. Alors, je pense que je vais en rester là... J'étais à la recherche d'une solution à base d'instructions uniquement et non instructions + contrôles graphiques, mais vu comment c'est chaud, je laisse tomber (pour l'instant). En tout cas, merci de ton aide :jap: J'ai appris pas aml de trucs sur les API windows graphiques...

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
recherche de ligne specifique dans feuille d'un classeurAfficher ds une JSP le résultat d'une requête par paquets de n lignes
[MYSQL] comment tirer au hazard un certain nombre de lignesTrouver s'il existe des lignes avec un id < à une valeur
comment on insere des sauts de lignes dans 1 textarea ?[HTML,JS] Surligner des lignes au passage de la souris
[Feuille Excel & langage script] Probleme lors ouverture new page[ XML ] les saut de lignes ?
ca existe l'équivalent d'un colspan mais pour les lignes ?[SQL] un select qui ne garde que dix lignes ....
Plus de sujets relatifs à : Réafficher des lignes tracées sur une feuille


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)