Réafficher des lignes tracées sur une feuille - VB/VBA/VBS - Programmation
Marsh Posté le 21-08-2002 à 09:33:41
"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).
Marsh Posté le 21-08-2002 à 10:37:28
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...
Marsh Posté le 21-08-2002 à 12:56:52
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 ?
Marsh Posté le 21-08-2002 à 13:16:12
le réaffichage est bon, mais le pb vient du fait que l'image est redessinée après les lignes...
Marsh Posté le 21-08-2002 à 13:57:34
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...
Marsh Posté le 21-08-2002 à 15:15:50
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?
Marsh Posté le 21-08-2002 à 15:55:35
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...
Marsh Posté le 22-08-2002 à 08:49:57
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é...
Marsh Posté le 22-08-2002 à 11:30:46
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 +)???
Marsh Posté le 22-08-2002 à 13:48:25
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 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...
Marsh Posté le 22-08-2002 à 14:59:01
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 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.
Marsh Posté le 22-08-2002 à 15:21:39
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"
Marsh Posté le 23-08-2002 à 08:49:26
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...
Marsh Posté le 23-08-2002 à 08:50:46
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
Marsh Posté le 23-08-2002 à 10:53:02
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" ?
Marsh Posté le 23-08-2002 à 12:15:16
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...
Marsh Posté le 23-08-2002 à 12:53:16
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...
Marsh Posté le 23-08-2002 à 14:02:10
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)
Marsh Posté le 23-08-2002 à 14:03:53
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ûé
Marsh Posté le 23-08-2002 à 14:39:38
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 .
Vivent les seconds !
Marsh Posté le 27-08-2002 à 09:31:56
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.
Marsh Posté le 28-08-2002 à 11:14:17
j'ai essayé, ça trace bien les lignes, mais j'ai toujours le même pb d'effacement
Marsh Posté le 28-08-2002 à 11:15:29
à 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.)
Marsh Posté le 28-08-2002 à 12:53:54
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 )
Marsh Posté le 28-08-2002 à 13:05:39
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
Marsh Posté le 28-08-2002 à 14:59:03
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).
Marsh Posté le 28-08-2002 à 15:14:15
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)...
Marsh Posté le 28-08-2002 à 15:16:16
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 :
|
Marsh Posté le 28-08-2002 à 15:19:54
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
Marsh Posté le 28-08-2002 à 15:55:06
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
Marsh Posté le 28-08-2002 à 16:11:19
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???
Marsh Posté le 28-08-2002 à 16:17:39
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
Marsh Posté le 28-08-2002 à 16:18:38
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...
Marsh Posté le 28-08-2002 à 16:28:54
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?
Marsh Posté le 20-08-2002 à 09:02:53
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