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

MFC Discussion :

Probléme CFormview MFC


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Par défaut Probléme CFormview MFC
    Bonjour,
    Voila, j'ai un petit soucis, je souhaite dessiner dans une fenetre, et meme dans une list box ou un truc de ce genre lol.
    Malheureusement, dans la boite de dialog ou je suis je n'ai pas la focntion OnDraw ...
    En faite j'ai un menu dans mon projet, je clique sur un bouton et cela m'affiche une boite de dialog de type FormView.
    Comme il n'y a pas de fct OnDraw j'ai essayé avec la fct OnPaint mais sa ne marche pas, je creer bien un rectangle mais sa ne me l'affiche pas !!

    Comment faire pour :

    Avoir cette fonction OnDraw ?
    Pour afficher dans une list box quelques choses de ce genre ?

  2. #2
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut
    tu veux dessiner dans une FormView ou dans une DialogBox ??

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Par défaut
    J eveux dessiner dans une CFormview, en faite j'ai trouvé la soluce , c'est ç dire, que je creer une bitmap sur cette bitmap je creer le rectangle dans lekel je vais travailler ( mettre d'autres figures).
    Mais voila le truc maintenant c'est que je voudrais dés que l'utilisateur clique dans cette zone, un dessin ce creer !! comment faire ?
    J'ai recuperer le message OnLButtonDown , dés qu'il clic à gauche mais ensuite ???

    Merci

  4. #4
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut
    normalement, la méthode OnPaint te fourni un device context.
    A toi de le manipuler. Pour dessiner un bmp, il te faut un aute device context temporaire dans le quel tu charges ton bmp avant de le recoper dans le device context d'affichage

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Par défaut
    hum disons que le bitmap que je lance o debut c'est juste pour pouvoir faire des dessins dessus.
    Disons mon but c'est de faire sa :
    Dans une CFormview, d"s que je clique sur une zone que j'ai definie (fixé) sa me dessine un rectangle.

    Au debut je pensais utilisé la fonction OnDraw mais ce n'est pas possible.
    En effet, je creer une ressource de type dialog mais, si je creer une boite de type CDialog , je peux la lancer facilement avec maclasse.DoModal(); mais dans ce cas je n'ai pas la fct OnDraw
    Mais si je creer une boite de dialog de type CFormview, j'ai la fonction OnDraw mais je ne sais pas comment appeler la fenêtre, je n'est pas de DoModal();

    Quand je clique sur un bouton sa me lance cette fenêtre, donc avec le CDialog c est facile :


    void CMenu::OnBnClickedListe()
    {
    CDialog Bouton;
    Bouton.DoModal();
    }

    mais avec la CFormview je ne sais pas faire !!!!

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    il ne faut pas dessiner dans le onpaint ou ondraw d'une CFormView (une CView ou CScrollView oui )
    le plus simple est d'utiliser la surface d'un controle disposé a l'ecran pour dessiner dedans .
    voir cet exemple qui peut etre transposé simplement:
    http://farscape.developpez.com/Samples/TestGraph.zip

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Par défaut
    Ok niquel j'ai pu adapter :-) merci bcp

    Par contre moi j'ai trois fenetre de ce type, dans la meme View, comment on peut specifier de dessiner une figure dans un des contriles et une autre figures dans l'autre controle ??
    Tiens pendant que j'y suis si t'as une idée pour l'histoire du clique je suis preneur :-D

    Edit: j'ai trouvé pour les trois feneter mais pas pour le clique

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    hum ,j'ai pas bien compris !,
    tu veux un message quand tu clic sur la zone de dessin c'est ça ?

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Par défaut
    Hum presque :-D j'aimerais dés qu'il clique sur ma zone bouton, que cela me creer une figure geometrique à cet endroit du clique. (la figure c'est moi qui decide laquel, c'est du static). Et par exemple, il clique 5 fois dans la zone de controle, j'aurais 5 dessins selon la ou j'ai cliqué .

    merci :-)

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    et bien c'est pas tres compliqué ,vu que le control utilisé est un bouton
    tu peux generer le message BN_CLICKED dessus
    dans le message tu peux utiliser la fonction GetCursorPos pour trouver les coordonnées de la souris qu'il faudra convertire en coordonnées de la fenetre
    avec ScreenToClient.
    apres tu peux organiser ton dessin ..
    [/b]

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Par défaut
    Hé oui j'avais deja pensé au message OnLButtonDown(UINT nFlags, CPoint point) .
    J ai tester avec ton message, c'est mieux dans le sens ou c'est que cette fenetre qui est accessible, mais comme je le pensais mon probléme reside dans comment dessiner quand ke clique, je peux appeler la fonction OnDrawItem ? si oui je met quoi pour ce parametre LPDRAWITEMSTRUCT lpDrawItemStruct ?
    Paske sinon je vois pas comment, faire, je vais pas declarer un type CDC* dans le bouton , enfin je pense pas !!

    merki :-)

  12. #12
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    le principe general est qu'un control doit soit savoir se redessiner si il est masqué .
    ça veut dire aussi que si le dessin doit evoluer il va falloir stocker l'historique des commandes l'ayant generé ou memoriser son dernier etat dans un bitmap.
    rien ne t'empeche d'appeler un fonction membre du controle concerné pour lui indiquer la prochaine sequence a dessiner .
    ensuite il suffira de faire un Invalidate sur le controle pour qu'il se redessine en completant son dessin en fonction des dernieres instructions memorisées.


  13. #13
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Par défaut
    hum ok, pas evident

    Alors j'ia trouvé sa sur les msdn :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void CTestView::OnChangeRect()
    {
      // Change Rectangle size.
      m_rcBox = CRect(20, 20, 210, 210);
     
      // Invalidate window so entire client area
      // is redrawn when UpdateWindow is called.
      Invalidate();  
     
      // Update Window to cause View to redraw.
      UpdateWindow();
    }
     
    // On Draw function draws the rectangle.
    void CTestView::OnDraw(CDC* pDC)
    {
    //  ..  Other draw code here.
     
      pDC->Draw3dRect(m_rcBox, 0x00FF0000, 0x0000FF00);
    }
    mais je vosi pas comment sa peu marcher, vu qu'on envoi pas la valeur de m_rcBox à la fonction OnDraw ...

    J ai voulu faire la meme chose, c'est à dire dans le bouton BN_CLICKED
    je met le nouveau rectangle a tracer, dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	CRect rec(20, 20, 210, 210);	
    	Invalidate();
    puis un updatewindow() pour relancer on paint , ainsi l devrait modifer la taille du rectangle mais sa marche pas

    comme je te disais j 'arrive opas a dessiner dans ce bouton les nouveaux rectangle
    [pense a mettre la balise de code ,Merci Farscape]

  14. #14
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Par défaut
    Bon alors j'ai trouvé un debut de soluce, c'est à dire que je fais dans mon bouton :
    GetClientDC dc(this)
    et aprés je peux dessiner !!! Donc j'arrive à dessiner les figures que je veux à l'endroit ou je clique

    Par contre maintenant des petits prob se posent (encore !!! )

    D'abord, comment je peux effacer la figure que je viens de tracer, ou encore, comment je fais pour ne pas qu'il dessine une figure sur celle que je viens de faire ?

    erf merci

  15. #15
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    pour effacer ta surface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dc.PatBlt(0,0,m_Rect.Width(),m_Rect.Height(),WHITENESS);
    ta solution ne fonctionne pas en cas de recouvrement de ton control.
    Citation Envoyé par farscape
    Le principe general est qu'un control doit soit savoir se redessiner si il est masqué .

  16. #16
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 85
    Par défaut
    Merci pour l'effacement, mais pour le recouvrement je vois pas bien ce ke tu veux dire!!
    Pour l'instant je peux dessiner , redessiner sur la meme figure etc...
    Mais j'avais penser a stocker dans un pointeur , ou objet, tous les rectangle creer etainsi faire une condition dessus pour ne pas qu'il puiss reecrire dessus, il fo ke je vois sa plus en detali .

  17. #17
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par denebj
    Merci pour l'effacement, mais pour le recouvrement je vois pas bien ce ke tu veux dire!!
    Pour l'instant je peux dessiner , redessiner sur la meme figure etc...
    Mais j'avais penser a stocker dans un pointeur , ou objet, tous les rectangle creer etainsi faire une condition dessus pour ne pas qu'il puiss reecrire dessus, il fo ke je vois sa plus en detali .
    et bien tu prends une autre fenetre style l'explorateur windows et tu la place par dessus ton programme et tu l'enleves ,d'apres toi comment va se repeindre ton control ?

    [note,fait des efforts sur l'ecriture le style abrégé n'est pas accepté sur le forum ,Merci]

Discussions similaires

  1. Problème OpenGL + MFC
    Par l'archiviste dans le forum MFC
    Réponses: 0
    Dernier message: 31/08/2009, 09h48
  2. Problème avec MFC
    Par ra3ra3 dans le forum MFC
    Réponses: 1
    Dernier message: 25/05/2008, 21h45
  3. Problème slider MFC avec visual studio
    Par superjoe dans le forum MFC
    Réponses: 4
    Dernier message: 03/05/2007, 09h53
  4. Problème Programmation MFC
    Par xyz dans le forum MFC
    Réponses: 17
    Dernier message: 13/05/2006, 20h00
  5. Problème Programmation MFC
    Par xyz dans le forum Réseau
    Réponses: 3
    Dernier message: 13/05/2006, 14h36

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