IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

ID de dessins


Sujet :

WinDev

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut ID de dessins
    Bonjour,

    je souhaite savoir s'il est possible de récupérer l'ID de divers dessins (dligne, dcercle etc...) afin de pouvoir les effacer. Ces dessins sont réalisés sur une image quelconque.

    En fait sur l'exemple WD Dessin qui me sert de base, c'est une option qui manque : effacer la dernière action.
    D'après ce que je lis dans l'aide, on peut récupérer un ID pour dDébutDessin, mais le problème c'est que pour un même ID de dDébutDessin je peux avoir n dessins (cercles, points, carrés) et je ne souhaite pas tous les effacer.

    Merci de votre aide.
    Cladoo

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 136
    Points : 241
    Points
    241
    Par défaut
    Je vais peut être des choses totalement fausses donc mon message est à prendre avec des pincettes.

    Ceci étant dit, l'ID que tu récupère avec dDebutDessin est l'ID de zone image où tu vas dessiner.
    Chaque action que tu vas faire (dCercle, dRectangle, ...) va modifier ta zone image.
    Lorsque tu demandes à ce qu'un trait soit tracer, la fonction ne regarde ce que le trait va cacher il dessine juste le trait avec la couleur demandée.

    Si tu veux pouvoir faire un retour en arrière, il faudrait qu'avant chaque action de dessin (dCercle, ...) tu enregistre l'image (dSauvexxx).
    Si l'utilisateur demande une annulation de la dernière action, tu recréé ton dessin en l'initialisant avec ton image sauvée.

    On peut envisager de sauvegarder plusieurs image de façon à avoir plusieurs niveau de retour en arrière.


    Voilà, mon point de vue.
    (Pour rappel, on est vendredi soir, si ce message est obscur ou incompréhensible, cela doit être mis sur le compte de la fatigue, merci)

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Salut

    oui ta solution est effectivement fonctionnelle. Le problème que j'ai c'est que j'ai dans mon image principale des petites images déplaçable et pour les conserver dans mon image sauvegardée, je dois passer par une impression écran via une dll et cette méthode prend du temps (1 à 2 secondes) ce qui risque d'alourdir le soft si je dois lancer cette fonction à chaque 'demande de modification'

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Il est possible d'utiliser aussi la superposition de champs image. Tu créés un champ image à l'extérieur de ta fenêtre et tu l'utilises en le clonant dès que tu as besoin de faire un autre dessin avec les mêmes dimensions que ton champ image dans lequel tu dessines. Ensuite tu lui donnes un nom en fonction du dessin que tu fais dedans pour pouvoir le retrouver et l'effacer.

    Le défaut de cette méthode est l'altitude du champ cloné qui est toujours supérieure (de 1) à tous les autres champs. Donc si tu dois toujours avoir un autre champ devant celui créé il faudra modifier les altitudes du champ créé et de celui qui doit être devant.
    Mieux vaut un petit lien qu'un long discours.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Oui c'est une effet une solution. Là où je risque de galérer c'est pour pouvoir effacer le dessin de type 'à main levée' (qui est une succession de lignes et donc autant de 'sous dessins').

    Je pense que je vais conserver pour le moment l'option 'effacer tous les dessins' (un peu brutal mais nécessite peu de code), et je me pencherai par la suite sur le côté 'Annule dernière action' et 'Rétablit dernière action' plus tard en me basant sur ton idée.

    Merci en tout cas.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Ou alors j'ai encore une autre idée mais elle va pas trop te plaire car elle n
    nécessite aussi un peu de code.

    Les fonctions de dessin modifient les pixels de ton champ image. Peut-être est-il possible d'enregistrer ces modifications dans des tableaux en enregistrant uniquement les pixels modifiés. Quand tu veux revenir à un dessin tu prends ton image de base et tu appliques toutes les modifs nécessaires.

    Ou bien encore un tableau avec un entier qui représente des fonctions de dessin suivis des paramètres.
    Genre tu dis que 1 correspond à une ligne. Tu enregistres dans ton tableau Tab[1] = 1,X1,Y1,X2,Y2.
    Et tu fais une fonction d'enregistrement différente pour chaque type de dessin.
    Ensuite en fonction de l'indice de ton tableau tu rappelles le nombre de lignes nécessaires de ton tableau en faisant une boucle et avec un SELON CAS qui correspondra à l'entier qui identifie ta fonction.
    Mieux vaut un petit lien qu'un long discours.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Oui ça aussi c'est viable je pense, mais ce qui m'embête c'est de "ré-inventer le schmilblik" alors que Windev possède de jolies collections de procédures où généralement on n'a plus qu'à piocher. Si j'ai bien compris, à chaque 'annulation' tu irais ensuite récupérer le pixel dans l'image précédente (une version n-1 disons) à la coordonnée spécifiée dans ton tableau pour remplacer ton pixel de l'image n par le précédent?

    Sinon, je pensais à un truc : dans un état il est possible de gérer des dessins comme des objets (déplaçables notamment), et l'option 'Annuler' existe bel et bien. L'idéal serait de pouvoir utiliser ce système. Mais où trouver l'algorithmique qui se cache dernière??

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Les états je connais pas (encore).

    Par contre la dernière solution est plus simple je dirai sans à avoir à t'embêter avec les pixels.
    Tu créés un tableau d'entiers à 2 dimensions et dedans tu stokes les entiers correspondant à la fonction de dessin que tu auras définis : 1 = dligne, 2 = dpoint, 3 = drectangle, etc ... avec les coordonnées correspondantes. Si y a besoin tu peux aussi créer un tableau de chaines pour stocker les paramètres de type chaine.

    Ensuite pour récupérer les dessins tu fais une boucle avec un SELON CAS et l'indice du nombre de dessins que tu veux récupérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    POUR TOUT valeur,i DE Tableau_Dessins
       SELON Tableau_Dessins[i,1]
          CAS 1
             dLigne(Tableau_Dessins[i,2],Tableau_Dessins[i,3],Tableau_Dessins[i,4],Tableau_Dessins[i,5])
     
          CAS 2
             dPoint(Tableau_Dessins[i,2],Tableau_Dessins[i,3])
    ...
       SI i = indice_fin_dessin ALORS
          SORTIR
       FIN
    FIN
    Mieux vaut un petit lien qu'un long discours.

Discussions similaires

  1. [Graphic] Dessiner des hachures
    Par sylverspoon dans le forum 2D
    Réponses: 7
    Dernier message: 22/03/2006, 21h46
  2. [ALGO] dessiner un triangle dans le bon sens
    Par lefait dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 05/02/2005, 14h38
  3. moteur de particules :Dessiner un point
    Par houssa dans le forum OpenGL
    Réponses: 2
    Dernier message: 25/06/2003, 22h13
  4. Dessiner un rectangle avec bords et texte ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 17h17
  5. Réponses: 3
    Dernier message: 12/06/2002, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo