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

Visual C++ Discussion :

Dessiner dans un CPicture avec VC6


Sujet :

Visual C++

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Dessiner dans un CPicture avec VC6
    Bonjour,

    Dans le but de mon thème informatique, je dois placer un nombre indéfinie de zone sensible sur une image de fond.

    Étant donné que je ne sais pas créer par programmation des contrôles, j'ai opter sur la méthode de dessin, donc au final j'ai un magnifique CPicture, auquel je dessine des sorte de bouton (pour le moment juste des gros rectangle), jusque là j'ai reussi en me torturant l'esprit à faire quelque chose de potable.

    Mon gros soucis, c'est qu'il suffit que la fenetre soit deplacer hors des limites de l'écran, réctrecie ou encore qu'une autre fenêtre passe par dessus pour effacer tous mes dessins.

    J'ai cherchais despéraiment une méthode qui serai appelé lorsque l'on reprend le focus de la fenetre, mais je la trouve pas, ou mieu encore une méthode qui serai appellé pour repeindre la fenetre !

    Si quelqu'un à ma méthode miracle quelque part, je suis prenneur car pour le moment, j'ai mis un bouton "raffraichir", mais voila, allez expliquer aux utilisateurs que les "images" sont là mais quelles se cahce faut cliquer sur le petit bouton pour les voirs

    Merci d'avance
    Cordialement
    Division-par-zero

  2. #2
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Salut,

    Place tout ton code de dession dans la méthode OnDraw(CDC* pDC) de ta classe vue. (J'imagine que tu fais de l' MFC)

  3. #3
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oui je fais du MFC, dsl j'ai toujours fais que ca avec VC++ donc pas pensé à préciser ...


    Merci pour la réponse mais j'aimerais bien mettre mon code dans OnDraw(PDC * pdc), seulement cette fonction n'existe pas, j'ai bien essayé de la mettre manuelement mais que dalle, d'après ce que j'ai pus en conclure en parcourant depuis avant hier ce forum, c'est que la methode OnDraw, existe sur VC++ 2005.

    toujours si j'ai bien compris la fontion à peu pret similaire est OnPaint() dans mon cas, j'ai pus constater en remettant mon code de dessin dans OnPaint() qu'il reactulaisais l'image, mais le fonctionnement est assez bizard (tellment que quand j'avais essayer hier, je n'avais rien vu).

    De plus j'ai lus que dans le OnPaint() vaut mieux éviter de mettre n'importe quoi quand on sait pas trop ce qu'on y fait (je confirme )

    J'ai peut-être loupé une étape pour avoir le OnDraw() !!


  4. #4
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    OnDraw existe bel et bien.
    C'est quelle classe vue que tu as?

    Si OnDraw n'est pas là alors utilise classwizard pour t'ajouter cette méthode virtuelle. Mais je ne me rappelle plus bien avec classwizard.
    Ou alors ajoute cette méthode manuellement c'est plus sûr.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public:
           virtual void OnDraw(CDC* pDC);

  5. #5
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Le problème réside en faite dans le fait que je ne connait pas les classes vue :p (oui VC++ je l'utilise que pour les cours, et j'ai pas trop eu le choix pour mon theme, sinon j'aurais fais ça en Windev -- AGL qui simplifie, meme un peut trop :p --

    Donc si ta un peu de temp pour me dire comment faire, ce serais super sympa, ca devient hors sujet par contre -__-) :

    Je créer une nouvelle classe :
    • Classe type : MFC Class
    • Name : <n'importe quoi>
    • Base class : ?
    • Dialog ID : ? (si besoin)
    • Automation : ? (si besoin)

    Ou je suis à coté de la plaque ?!

    Dans tous les cas je commence à chercher sur ce point, merci !


  6. #6
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Regarde, il y a des tutos sur comment démarrer avec MFC sur le site. Tu as aussi la FAQ. Je te conseille de lire un peu.

  7. #7
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Dans la faq je tourne dessus depuis 2jours (une vraie mine d'or d'ailleurs ), mais j'avais pas fait gaffe au bouton "tutoriels" du forum, où j'ai pus trouver pas mal d'info merci

    Donc la raison pour laquelle je ne voyais pas la fonction OnDraw(CDC * pDc), c'est tous simplement parceque j'étais en mode "Dialogue Based", dans tous les cas maintenant j'ai la fonction OnDraw() -- qui n'est rien d'autre qu'une fonction appelé par la méthode OnPaint(), soit dit en passant -- et qui par conséquent n'a absolument rien corrigé à mon pbm premier, si ce n'est que j'ai découvert quelques points suplémentaire du vc++

    Par contre je me suis retrouver face à ces deux cas de figure :

    Cas 1 :
    J'execute mon code pas à pas (OnDraw()), et je vois que je dessine sur la fenetre correctement, puis plus loin dans le code (en mode dessassambleur), il ré-affiche toutes l'ihm, et par conséquent efface mes zoulies dessins !

    Cas 2 :
    Cette fois ci j'execute mon code normalement, mais j'ai laissé une ligne de code qui fait afficher une boite d'erreur : "Debug Assertion Failed"
    Machinalement, blasé, je clic sur "Ignorer", et là Ô miracle, la suite du code s'éxécute sans pbm, et je vois mes dessins s'afficher (car avant de cliquer sur ignorer, je pouvais voir toutes mon ihm)


    Du coup, y'a t-il moyen pour que la fonction OnDraw soit appelé après le repaint de l'ihm ? On quelque chose du genre !? (Je hais vraiment vc++, on est maître de rien quand on connaîs pas la logique )

    Pour la ligne de code qui plante je vais chercher à comprendre, mais y'as pas vraiment de raison, elle fonctionnait tres bien avant : (Je donne ça seulement à titre indicatif pour bien montrer que ca ne gene pas mon affichage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ligne 1 : bmp.LoadBitmap(IDB_MOULIN_A_TAN) ;
    ligne 2 : bmp.GetObject(sizeof(BITMAP), &bits) ;
     
    ligne 3 : bmp2.LoadBitmap(IDB_MOVEME) ;
    ligne 4 : bmp2.GetObject(sizeof(BITMAP), &bits2) ;
    ça bug sur la ligne 2, et IDB_MOULIN_A_TAN existe bien dans les ressources, et dans le cas actuel je n'ai pas besoin de bits.

    [edit]
    Il y à peut-être un point sur lequels ont s'est mal compris, je souhaite dessiner dans un champ CPicture, et non sur le fon de ma fenêtre donc je n'utilise pas le (CDC * pDC) du onDraw(), mais je recréer un DC via le handle de mon CPicture. A priori le pbm vient de là, car quand je dessine directement via le pDC (donc sur le fond de la fênetre) je ne vois aucun pbm de raffraichisement !
    Du coup si personne n'a de solution pour mon pbm via le CPicture, je vias me rabattre sur le fond de la fenetre
    [/edit]

    Cordialement
    Division-par-zero

  8. #8
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Résolu ?
    Bon on peut dire que mon problème est résolu, même si c'est faux

    J'ai donc dessiner directement sur le fond de ma fenetre dans un premier temps le bitmap de mon CPicture,
    puis dans un second temp j'ai "peint" tous les élèments que je voulais (toujours sur le fond, mais par dessus mon image première -- là où le CPicture faisait l'inverse donc --)

    Ensuite je remet à jour via InvalidateRect(), la portion de l'image dont j'ai modifié le contenu !
    Je noterais sur ce point que j'ai mis pas mal de temps à comprendre qu'il fallait exclusivement dessiner dans le OnDraw(), et absolument jamais autre par (ce qui fonctionnait très bien avant), du coup j'apercoit un léger retard dû à ma boucle dans le OnDraw(), mais grace au InvalidateRect(), plutôt qu'au Invalidate(), ça ne "clignotte" pas, donc ne gêne pas trop !

    Merci pour l'aide, ça va m'évité d'avoir une programme à moitié fait, j'aime pas ça

    Cordialement
    Division-par-zero

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Virtual Pascal] Dessiner dans une fenêtre avec la librairie OWL
    Par Roland Chastain dans le forum Autres IDE
    Réponses: 15
    Dernier message: 31/08/2012, 20h15
  2. Réponses: 0
    Dernier message: 18/03/2012, 16h33
  3. [Débutant] dessiner un retangle dans mon image avec un certain orientation.
    Par slaima15 dans le forum MATLAB
    Réponses: 4
    Dernier message: 22/07/2011, 16h06
  4. affichage de dessin dans jpanel avec BorderLayout
    Par ilias20 dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 26/03/2010, 13h55
  5. problème de dessin dans une JApplet avec GridBagLayout
    Par esperal dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 26/05/2008, 10h46

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