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

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Réafficher des lignes tracées sur une feuille

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Précédente
Auteur Sujet :

Réafficher des lignes tracées sur une feuille

n°197695
rufo
Pas me confondre avec Lycos!
Posté le 20-08-2002 à 09:02:53  profilanswer
 

Voilà, dans une application, je dessine des lignes avec l'instruction Me.Line (x1,y1)-(x2,y2), color sur une feuille, par-dessus une image (un gif transparent). Le pb, c'est que dès qu'une autre feuille passe par-dessus mon application (sur ces lignes dessinées), celles-ci s'effacent (normal) ; je dois donc les redessiner. Le vrai pb est que quand j'utilise la fonction Paint de mon objet form, il me redessine mes lignes avant de réafficher mon image gif. De ce fait, mes lignes sont en partie cachées par mon gif, puisque celui-ci se trouve par-dessus les lignes. Comment je peux faire pour forcer le réaffichage de mon image avant de redessiner mes lignes?
De plus, j'utilise l'objet Me, qui en l'occurence, me permet que de dessiner sur ma feuille. Est-ce-qu'il est possible de dessiner sur une image (le composant Image) qui est passée en paramètre par référence à une fonction? Merci de m'aider :jap:

mood
Publicité
Posté le 20-08-2002 à 09:02:53  profilanswer
 

n°197828
rufo
Pas me confondre avec Lycos!
Posté le 20-08-2002 à 11:26:18  profilanswer
 

up...

n°198096
rufo
Pas me confondre avec Lycos!
Posté le 20-08-2002 à 16:08:26  profilanswer
 

alors, personne ne peut m'aider? :(

n°198468
Carbon_14
Posté le 21-08-2002 à 09:33:41  profilanswer
 

"il me redessine mes lignes avant de réafficher mon image gif" : dans quel ordre sont les instructions de tracé de ligne, et d'affichage de l'image ?
 
L'image, elle est chargée avant en mémoire (LoadImage ou qq chose comme cela ?) ? Ca évite de devoir la recharger à chaque appel (ce qui prend du temps et n'est pas ergonomique).

n°198516
rufo
Pas me confondre avec Lycos!
Posté le 21-08-2002 à 10:37:28  profilanswer
 

carbon_14 a écrit a écrit :

"il me redessine mes lignes avant de réafficher mon image gif" : dans quel ordre sont les instructions de tracé de ligne, et d'affichage de l'image ?
 
L'image, elle est chargée avant en mémoire (LoadImage ou qq chose comme cela ?) ? Ca évite de devoir la recharger à chaque appel (ce qui prend du temps et n'est pas ergonomique).




 
d'abord j'affiche l'image et ensuite je dessine les lignes.
Et oui, les images sont chargées en mémoire par un LoadPicture...

n°198756
Carbon_14
Posté le 21-08-2002 à 12:56:52  profilanswer
 

Pour résumer : en tracé direct (tout neuf), c'est bon. En Repaint lors d'un recouvrement partiel ou total, ça cafouille.
 
Le mode "tout neuf", c'est pas un repaint provoqué ?
 
A tout hasard, faudrait essayer de repeindre le fond où sera le dessin avec la couleur du fond de feuille (mais ça fait "clignoter" l'affichage).
 
Les traits, ils sont tracés d'après quel mode de SetROP2() ?
 
En ne réaffichant pas l'image pour test lors de REPAINT, les traits sont bons ou c'est la combinaison pixel/pixel avec l'image précédente qui provoque le pb ?

n°198758
rufo
Pas me confondre avec Lycos!
Posté le 21-08-2002 à 13:16:12  profilanswer
 

le réaffichage est bon, mais le pb vient du fait que l'image est redessinée après les lignes...

n°198793
Carbon_14
Posté le 21-08-2002 à 13:57:34  profilanswer
 

Les instructions de dessin de traits sont exécutées après affichage de l'image, mais l'image est effectivement redessinée après les traits, en fait ?
 
Sais pas trop...

n°198900
rufo
Pas me confondre avec Lycos!
Posté le 21-08-2002 à 15:15:50  profilanswer
 

carbon_14 a écrit a écrit :

Les instructions de dessin de traits sont exécutées après affichage de l'image, mais l'image est effectivement redessinée après les traits, en fait ?




 
oui, c'est ça. Je pense que l'algo de repaint doit d'abord redessiner tout ce qui est affiché directement sur la feuille, et ensuite, redessine les composants qui sont présents sur cette même feuille... Qu'en penses-tu?

n°198957
Carbon_14
Posté le 21-08-2002 à 15:55:35  profilanswer
 

C'est du VB ?
Faut peut-être jouer avec la propriété AutoRedraw de la form (False si True, True si False pr tester), qui interfère peut-être avec le système (??). Ou autre propriété de Redraw d'objet, j'â un peu oubliâ (ai pas mon VB3 directement sous la main).
Si TRUE fait que Windows redessine l'image, y a peut-être moyen de l'enlever du REPAINT soft, etc...
 
Le VB, c'est vieux souvenir (Me. , c'est très pratique :) !) mais ça reviendrait en pratiquant...

mood
Publicité
Posté le 21-08-2002 à 15:55:35  profilanswer
 

n°199454
rufo
Pas me confondre avec Lycos!
Posté le 22-08-2002 à 08:49:57  profilanswer
 

carbon_14 a écrit a écrit :

C'est du VB ?
Faut peut-être jouer avec la propriété AutoRedraw de la form (False si True, True si False pr tester), qui interfère peut-être avec le système (??). Ou autre propriété de Redraw d'objet, j'â un peu oubliâ (ai pas mon VB3 directement sous la main).
Si TRUE fait que Windows redessine l'image, y a peut-être moyen de l'enlever du REPAINT soft, etc...
 
Le VB, c'est vieux souvenir (Me. , c'est très pratique :) !) mais ça reviendrait en pratiquant...




 
j'ai déjà essayé le autoredraw à true et à false. A true, il n'y a plus besoin de repaint, mais y'a toujours le même pb :( et à false, ben faut le repaint (normal, quoi). Oui, Me, c'est pratique, mais y'a pas moyen de dessiner sur un objet image plutôt que sur la feuille??? 9a résolverait mon pb du coup. J'ai cherché mais j'ai pas trouvé...

n°199455
rufo
Pas me confondre avec Lycos!
Posté le 22-08-2002 à 08:50:11  profilanswer
 

et oui, c'est du VB6

n°199644
rufo
Pas me confondre avec Lycos!
Posté le 22-08-2002 à 11:30:46  profilanswer
 

personne d'autre n'a de suggestion...
 
J'ai utilisé le composant Line, ce qui a en partie résolu mon pb de réaffichage. Maintenant, j'en ai un nouveau. Pour dessiner mon flèche, j'utilise 3 Line que j'ai déjà disposer sur ma feuille. Comment faire si j'ai 2 flèches à dessiner (ou +)???

n°199801
Carbon_14
Posté le 22-08-2002 à 13:48:25  profilanswer
 

Le problème est le nombre de Line disponible ?
 
Si y a 4 flèches, y aura 4 * 3 Line utilisés.
 
Quand on crée des contrôles, il me semble (VB3) que quand on fait Copie sur l'un d'eux, puis Colle, il propose de créer un "array". Si on accepte, ça donne Line_1(1), (2), (3). Si on en crée un autre, à part, ça donne Line_2(1), (2), (3). Etc..
 
Mais si on a besoin de 10 flèches, le mieux est peut-être de faire 3 groupes de 10 Line, chacun regoupant l'un des traits de flèche. Un module d'écriture peut alors positionner le trait central Line_C(x) x = 1 à 10, gauche Line_G(x), droit Line_D(x) selon ce qui est le plus "généralisable".
 
NB : je ne me souviens plus :fou: de la possibilité ou non de faire des groupes sur les Line (!!), c'est vrai avec boutons, zones texte, cases à cocher, ... Les souvenirs, ça fuit...

n°199878
rufo
Pas me confondre avec Lycos!
Posté le 22-08-2002 à 14:59:01  profilanswer
 

carbon_14 a écrit a écrit :

Le problème est le nombre de Line disponible ?
 
Si y a 4 flèches, y aura 4 * 3 Line utilisés.
 
Quand on crée des contrôles, il me semble (VB3) que quand on fait Copie sur l'un d'eux, puis Colle, il propose de créer un "array". Si on accepte, ça donne Line_1(1), (2), (3). Si on en crée un autre, à part, ça donne Line_2(1), (2), (3). Etc..
 
Mais si on a besoin de 10 flèches, le mieux est peut-être de faire 3 groupes de 10 Line, chacun regoupant l'un des traits de flèche. Un module d'écriture peut alors positionner le trait central Line_C(x) x = 1 à 10, gauche Line_G(x), droit Line_D(x) selon ce qui est le plus "généralisable".
 
NB : je ne me souviens plus :fou: de la possibilité ou non de faire des groupes sur les Line (!!), c'est vrai avec boutons, zones texte, cases à cocher, ... Les souvenirs, ça fuit...




 
oui, on peut faire ça, c'et le système d'index, mais, ça veut donc dire que si j'ai x flèches, je dois positionner sur ma feuille à la création 3*x lines :( Pas terrible comme solution.

n°199910
Carbon_14
Posté le 22-08-2002 à 15:21:39  profilanswer
 

En fait, il serait utile d'expliciter le "chaier des charges" pour savoir quel est le but à atteindre.
 
Ecrire des Line à la main (soft), quand besoin, c'est bien car souple. S'il faut un paquet d'objet Line avant, lors du design, c'est lourd, surtout si le nombre est variable en cours de route.
 
Si le dessin à la main est altèré par le Repaint, c'est dommage.
Il me smeble que les Line ne sont pas cachables (Hide) => à part les éjecter du champ de vision, on les voit tt le temps.
 
Faudrait reposter en septembre, quand les as seront revenus.
 
Tracer les traits sur l'image, faut être "doué" (mais pas impossible), car faut repérer en mémoire les pixels voulus et les transformer en combinaison de bis. Il doit y avoir une astuce sous VB pour empêcher ce pb de non écrasement. Les traits sont peut-être aussi "semi-transparents".....
 
Ce qui me chagrine est que quand la feuille est créée, l'image et les traits sont plaqués, c'est tout bon. Quand le plaquage a lieu à nouveau suite à une ombre faite à la feuille, ça marche plus.
 
Peut-être que le contrôle Picture se remet aussi à jour lui-même quand on a retracé les traits dessus.
 
Si, dans le RePaint, il n'y a PLUS le re-dessin de l'image (pr test), ça donne quoi ? L'image devrait être disparue ou tronquée. Si les traits sont encore "cassés", ça vient de VB/Windows. Faudrait alors essayer de mettre, avant le re-dessin des traits, Picture.Hide pour voir si c'est lui qui "zigouille" le boulot du développeur.
 
Je vais retourner voir mes cornues, elles sont moins "tordues"  :(

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

y'a pas de contrôle Picture : je dessine direct sur la feuille (objet Form). Sans l'objet image, les lignes sont bien redessinées. Et effectivement, ça serait plus souple en utilisant Me.Line (ce que je faisais depuis le début, mais avec l'objet Line, je pensais avoir trouvé une solution à mon pb de redessinement...)
Le but a atteindre est de pouvoir dessiner une flèche sur le socle d'un potentiomètre (une image affichée dans un contrôle Image) et 2 petits rectancles sur le haut du bouton du potentiomètre...

n°200324
rufo
Pas me confondre avec Lycos!
Posté le 23-08-2002 à 08:50:46  profilanswer
 

ps: j'ai cherché comment je pouvais dessiner sur le contrôle Image (faire appelle à une fonction Line de cet objet), mais j'ai pas trouvé... J'ai cherché ensuite à voir si je pouvais accéder à l'objet Me de la classe Image (je pense qu'il existe), mais j'ai pas trouvé non plus :(

n°200394
Carbon_14
Posté le 23-08-2002 à 10:53:02  profilanswer
 

Contrôle Picture, je voulais dire Image (in french dans le texte).
 
C'est pour bouger le curseur sur la piste du potar (bitmapisé) ou juste le mettre à un endroit "fixe" ?

n°200459
rufo
Pas me confondre avec Lycos!
Posté le 23-08-2002 à 12:15:16  profilanswer
 

carbon_14 a écrit a écrit :

Contrôle Picture, je voulais dire Image (in french dans le texte).
 
C'est pour bouger le curseur sur la piste du potar (bitmapisé) ou juste le mettre à un endroit "fixe" ?
 




 
oui, la flèche (ce que tu appelles curseur) bouge en fonction d'un octet qui est transmis via une trame tcp/ip ou de l'usb (2 modes de fonctionnement, mais bon, ça, on s'en fout). Ce n'est pas une image la flèche, je précise, mais 3 lignes dessinées via Me.Line...

n°200485
Carbon_14
Posté le 23-08-2002 à 12:53:16  profilanswer
 

Un problème qui va se poser aussi est d'effacer l'ancien curseur pour dessiner le nouveau, c'est fait en réaffichant l'image en entier ?
 
Dans un potentiomètre, le curseur est le doigt mobile qui se promène sur la piste (ou la bobine si potar de puissance), on le représente par une flèche de façon symbolique.
 
Il est circulaire ou linéaire le potar ? Si linéaire, ça serait pas possible de déplacer le curseur de souris ou la flèche est obligatoire (faudrait que je regarde la "tête" des curseurs standard Windows si y en a un vertical genre î). Je m'égare...

n°200551
rufo
Pas me confondre avec Lycos!
Posté le 23-08-2002 à 14:02:10  profilanswer
 

carbon_14 a écrit a écrit :

Un problème qui va se poser aussi est d'effacer l'ancien curseur pour dessiner le nouveau, c'est fait en réaffichant l'image en entier ?
 
Dans un potentiomètre, le curseur est le doigt mobile qui se promène sur la piste (ou la bobine si potar de puissance), on le représente par une flèche de façon symbolique.
 
Il est circulaire ou linéaire le potar ? Si linéaire, ça serait pas possible de déplacer le curseur de souris ou la flèche est obligatoire (faudrait que je regarde la "tête" des curseurs standard Windows si y en a un vertical genre î). Je m'égare...




 
j'efface avec Me.cls
le potar est circulaire (mais on fait pas un tour complet, juste 300°)
la position du potar n'est pas définie par l'utilisateur (ce n'est pas une sortie de mon système), mais une entrée (une donéne provenant d'une trame tcp/ip ou USB)

n°200553
rufo
Pas me confondre avec Lycos!
Posté le 23-08-2002 à 14:03:53  profilanswer
 

JoWiLe a écrit a écrit :

t'as trouvé du taf cousin?




 
hélas non. Y'a qq entreprises qui m'ont dit non (10 sur 26 environ). Mais y'en a beaucoup qui sont encore en vacances... Et j'ai toujours mon contact sérieux avec une entreprise (je l'ai justement appelée aujourd'hui), mais le chef se barre en vacances aujourd'hui :(...
 
et puis, ici, dès qu'ils entendent INSA, ils sont tous joyeux, mais vice-major de l'E3i, bof... Je suis dégoûé


Message édité par rufo le 23-08-2002 à 14:05:20
n°200583
Carbon_14
Posté le 23-08-2002 à 14:39:38  profilanswer
 

Pour info, le major de ma promo a directement fini dans l'informatique pro (because déja pbs embauche en 1978), moi qui le talonnais, j'y ai échappé de justesse :D.
 
Vivent les seconds :ange: !

n°202537
rufo
Pas me confondre avec Lycos!
Posté le 27-08-2002 à 08:50:26  profilanswer
 

up...

n°202554
karlkox
Posté le 27-08-2002 à 09:31:56  profilanswer
 

pour info, le tracé de ligne en VB demande pas mal de ressource et donne pas forcément un résultat clean.
Je conseille donc d'utiliser les API MoveToEx (permet de se position au début du tracé) et LineTo (trace la ligne). Avant chaque appel de ces API, un appel a ValidateRect et ensuite, apres l'affichage, d'InvalidateRect, permettra un rafraichissement optimal.

n°202668
rufo
Pas me confondre avec Lycos!
Posté le 27-08-2002 à 11:19:32  profilanswer
 

merci de ton aide, je vais essayé ta solution... :jap:

n°203661
rufo
Pas me confondre avec Lycos!
Posté le 28-08-2002 à 11:14:17  profilanswer
 

j'ai essayé, ça trace bien les lignes, mais j'ai toujours le même pb d'effacement :cry:

n°203664
rufo
Pas me confondre avec Lycos!
Posté le 28-08-2002 à 11:15:29  profilanswer
 

à défaut, est-ce-que qq'un sait comment stocker en ram une portion de la feuille et la réafficher (lignes, contrôles images, etc.)

n°203768
Carbon_14
Posté le 28-08-2002 à 12:53:54  profilanswer
 

En C, je fais ça avec l'API BitBlt (Cf http://docvb.free.fr/apidetail.php?idapi=144, mais l'exemple est plutot restreint), pour coller des images de boutons (enfoncés ou non), récupérer la zone d'image de fond en dessous du texte que je vais coller (pour le restaurer après effacement).
 
Si y a rien sur Google, faudrait que je mette mon source (C) en forme pr être lisible quand temps... (C'est du bricolage perso de débutant en C/win :))

n°203775
rufo
Pas me confondre avec Lycos!
Posté le 28-08-2002 à 13:05:39  profilanswer
 

moi, ce que je voudrais, ça serait stoker mon image dans un buffer en ram... histoire de pouvoir le réafficher où et quand je veux... Effectivement, l'exemple donné a des possibilités restreintes, mais ça me donne une nouvelle piste a explorer. Merci :)

n°203880
karlkox
Posté le 28-08-2002 à 14:59:03  profilanswer
 

Pour les mettre en ram, il suffit d'utiliser l'API CreateCompatibleBitmap.
Tu séléctionne ton bitmap (API SelectObject), tu créés ensuite un DC (API GetDC), que tu passes en 1er paramettre. Le long retourné est un Bitmap (enfin, un identifiant vers la mémoire ou il se trouve).

n°203896
rufo
Pas me confondre avec Lycos!
Posté le 28-08-2002 à 15:14:15  profilanswer
 

KarLKoX a écrit a écrit :

Pour les mettre en ram, il suffit d'utiliser l'API CreateCompatibleBitmap.
Tu séléctionne ton bitmap (API SelectObject), tu créés ensuite un DC (API GetDC), que tu passes en 1er paramettre. Le long retourné est un Bitmap (enfin, un identifiant vers la mémoire ou il se trouve).




 
j'ai une question concernant les handle. Quelle est la défférence entre Me.hDC et et Me.hwnd (le Me faisant référence à mon objet Form)???
 
sinon, est-ce-que tu aurais un petit exemple : je maîtrise pas encore super les GetDC(), etc... Ce matin, j'ai mis le nez là-dedans (getDC, ValidateRect et InValidateRect, MoveToEx et LineTo), mais ça pas été de la tarte pour arriver à refaire ce que je faisais avant avec Me.Line et encore, j'ai pas trouvé comment changer la couleur des lignes (noir par défaut, et moi je veux blanc)... :(

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

carbon_14 a écrit a écrit :

En C, je fais ça avec l'API BitBlt (Cf http://docvb.free.fr/apidetail.php?idapi=144, mais l'exemple est plutot restreint), pour coller des images de boutons (enfoncés ou non), récupérer la zone d'image de fond en dessous du texte que je vais coller (pour le restaurer après effacement).
 
Si y a rien sur Google, faudrait que je mette mon source (C) en forme pr être lisible quand temps... (C'est du bricolage perso de débutant en C/win :))




 
Je viens de tester ton exemple, mais bizarrement, ça plante dans cette fct :

Code :
  1. Private Sub btnCopie_Click()
  2.    
  3.     Dim NumObj As Integer
  4.    
  5.     For NumObj = 0 To 4
  6. ' images des boutons
  7. ici -->     Call TransparentBlt2(Form1, Picture3.Picture, NumObj, 0)
  8.       Image1(NumObj).Visible = True
  9.     Next NumObj
  10.     For NumObj = 6 To 9
  11. ' images des boutons
  12.       Call TransparentBlt2(Form1, Picture3.Picture, NumObj, 0)
  13.       Image1(NumObj).Visible = True
  14.     Next NumObj
  15.     Allume = True
  16.    
  17.     Call EffFond(Form1, 5)  ' test
  18. End Sub

n°203905
karlkox
Posté le 28-08-2002 à 15:19:54  profilanswer
 
n°203982
rufo
Pas me confondre avec Lycos!
Posté le 28-08-2002 à 15:55:06  profilanswer
 

KarLKoX a écrit a écrit :

Tu as ici tout ce dont tu as besoin :
 
http://www.mvps.org/vb/code/MemoryDC.zip
http://www.mvps.org/vb/code/CustomBlt.zip




 
merci, je regarde ça de suite :)

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

KarLKoX a écrit a écrit :

Tu as ici tout ce dont tu as besoin :
 
http://www.mvps.org/vb/code/MemoryDC.zip
http://www.mvps.org/vb/code/CustomBlt.zip




 
bon, le premier ne marche pas, Invalide handle
le second marche, mais j'ai un peu de mal à voir comment je vais pouvoir réutiliser ce que je veux... Y'a rien de plus simple???

n°204015
karlkox
Posté le 28-08-2002 à 16:17:39  profilanswer
 

Le premier ne marche pas ? MMhhh je pense pas.
Karl E. Peterson est un guru en VB, croit moi, ca marche. Regarde un peu comment ca s'utilise dans son exemple et adapte le au tient.
Il y a surement plus simple sur www.vbfrance.com mais bon, pas forcément plus rapide. A toi de voire :)

n°204016
Carbon_14
Posté le 28-08-2002 à 16:18:38  profilanswer
 

Le HWND est le numéro que donne Windows à un objet, feuille, bouton, .. comme le numéro de sécu des gens :). C'est à ce hWnd qu'on envoie un message si on veut lui "causer" (comme WM_CLOSE : "on ferme la boutique" ).
 
Le HDC, c'est un "device contexte" : ça permet de dessiner sur un objet et précise comment (couleur brosse, trait, exclusion de région, savoir si on fait combinaison de pixels quand on trace, ..).
 
Un HDC est également un numéro, ce qui, sous VB, est troublant car on fait pas la différence facilement, mais il ne FAUT PAS les mélanger !
 
1) hdc = GetDC(hWnd)
2) fonctions pour définir le HDC (brosse, traits, couleur texte, .. selon ce qu'on fait et de l'"outils" utilisé)
3) fonctions de dessin (trait, rectangle de couleur, écriture de texte, ..)
4) fermeture du HDC ReleaseDC(hdc, hWnd)
 
Pour l'exemple, je tâche de tester ce soir, mais sous VB3/Win 3.11, c'est tout ce que j'ai (il me semble q'il n'y avait pas de pb). Je peux éventuellement le compiler pr voir le résultat actif...

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

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   profilanswer
 

 Page :   1  2  3
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Réafficher des lignes tracées sur une feuille

 

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-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR