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 :

Raffrachissement objet picture


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut [Résolu] Raffrachissement objet picture
    Bonjour à tous,

    J'ai un objet Picture dans ma dialog Box dans lequel j'affiche des dessins (notamment des lignes). Mais à chaque fois que j'ajoute une ligne la précédente ne s'efface pas ce qui fait qu'au bout d'un certain temps ma fenêtre (mon objet Picture) devient illisible. L'événement OnPaint (quand j'agrandis ou je réduis ma fenêtre principale) règle ce problème mais je voudrais savoir comment réactualiser mon objet (mon DC donc) et seulement cette objet à chaque fois que je dessine une ligne.

    Je regarde actuellement les fonctions UpdateWindow et RedrawWindow. Mais çà tourne pas. Peut être est ce au niveau des paramètres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ::RedrawWindow(DCObjetPic>m_hWnd,NULL,NULL,RDW_NOCHILDREN);
    ::UpdateWindow(DCObjetPic->m_hWnd);
    Qu'en pensez vous ??

  2. #2
    mat.M
    Invité(e)
    Par défaut
    *mettre le code pour dessiner dans le traitement lié à l'événement WM_PAINT ( CView::OnDraw,CDialog::OnPaint)

    *appeler WM_PAINT avec Invalidate ou InvalidateRect

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Le code de dessin est déjà dans l'événement OnPaint car j'ai 3 objets Picture qui doivent être réactualiser lorsque l'on redimensionne la fenêtre principale. Donc quand j'utilise la fonction Invalidate elle réactualise toute la fenêtre active. Etant donné qu'il faut appeler cette fonction très souvent cela provoque un effet de scintillement assez agaçant. J'aurais besoin de ne réactualiser qu'un objet.

    La classe sur laquelle mes objets Picture sont défninis est de type CWnd. Donc en théorie on doit pouvoir utiliser Invalidate sur un seul objet mais çà ne marche pas.

    J'ai essayé çà dans ma fonction d'affichage de dessin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DCObjetPic->m_pclWnd -> Invalidate( true );
    DCObjetPic->m_pclWnd -> InvalidateRect( NULL,true );
    Mais rien y fait.

  4. #4
    mat.M
    Invité(e)
    Par défaut
    J'ai un objet Picture dans ma dialog Box
    Pourrais-tu être plus précis ?? car dans la hiérarchie MFC , CPicture n'existe pas .
    Est-ce une classe personnalisée ?? un Active X
    Dialog Box c'est une classe de dialogue classique comme CDialog ???
    Quelle version de VC++ ? 6.0 ou .NET ???

    Sinon pour éviter le scintillement le méchanisme classique est de charger une bitmap en mémoire via un DC crée en mémoire et effectuer un affichage à l'écran dans la méthode OnDraw ( avec BitBlt ou StretchBlt)

  5. #5
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    Citation Envoyé par addicted_to_MFC
    *mettre le code pour dessiner dans le traitement lié à l'événement WM_PAINT ( CView::OnDraw,CDialog::OnPaint)

    *appeler WM_PAINT avec Invalidate ou InvalidateRect

    petite precision. Invalidate n'envoie pas dans la pile de WM_PAINT. Il permet de mettre a jour si un WM_PAINT a été notifié

    CWnd::Invalidate
    void Invalidate( BOOL bErase = TRUE );

    Parameters

    bErase

    Specifies whether the background within the update region is to be erased.

    Remarks

    Invalidates the entire client area of CWnd. The client area is marked for painting when the next WM_PAINT message occurs. The region can also be validated before a WM_PAINT message occurs by the ValidateRect or ValidateRgn member function.
    pour forcer un rafraichissement ( donc un WM_PAINT ) il faut faire un UpdateWindow

    UpdateWindow
    The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty.
    c'est pas moi qui le dit, c'est le MSDN. Pour plus de sureté, il faut faire les 2 :

    UpdateWindow(); // J'envoie un WM_PAINT
    Invalidate(); // Je Force le rafraichissement

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Tout d'abord merci de vous intéresser à mon problème.

    Je vais essayer de vous donner quelques précisions. Désolé je peux pas faire court.

    Voilà je travaille sous VC 5.0 et j'ai un projet SDI qui contient une dialogBox (de type CFormView) qui elle même contient 3 objets Picture (dont une fenêtre OpenGL, une autre chargée de l'affichage de Bitmap chargé en mémoire et une autre chargée d'afficher des dessins et notamment des lignes).

    J'ai une classe de type Cwnd que j'utilise pour chacun des 3 pictures (donc une déclaration par Picture) . Cette classe me renvoie diverses informations telle que le DC et RC(Rendering Context), le handle, etc....

    Pour l'affichage de ma fenêtre OpenGL je suis OBLIGE d'utiliser la fonction OnPaint de ma DialogBox. Que j'appelle quand c'est nécessaire.

    Pour l'affichage des deux autres fenêtres j'ai ma propre fonction d'affichage que je peux utiliser indépendamment de la fonction OnPaint.

    L'inconvénient c'est que, par exemple, lors d'un redimensionnement de la fenêtre principale le message WM_PAINT est envoyé et la fonction OnPaint est exécuté. La fenêtre OpenGL est alors mise à jour mais il faut également que les 2 autres fenêtres le soient aussi sinon elles sont effacées. Donc j'ai placé ma fonction d'affichage dans la fonction OnPaint pour que tout soit réactualisé d'un coup.

    Donc si je place la fonction Invalidate dans ma fonction d'affichage il va se créer une boucle infinie qui se traduit par ce scintillement génant.

    Concrétement si je trace des lignes dans ma fenêtre de dessin, elles vont tout d'abord bien sûr se chevaucher, mais si j'agrandis ou restaure ma fenêtre c'est la dernière ligne tracée qui va s'afficher. Et c'est exactement çà que je veux réaliser mais à chaque fois que je crée une nouvelle ligne. Donc je voudrais seulement faire une actualisation de ma fenêtre dessin et ne pas réactualiser toute ma fenêtre principale.

    J'espère que çà va "vous aider à m'aider" !!

    Encore merci.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Ok ! J'ai trouvé un truc pour mon problème.

    En fait je fais un peu comme addicted_to_MFC m'a dit, j'ai chargé une de mes images en noir et je l'affiche avant mes lignes comme çà les précédentes sont écrasées.

    C'est un peu barbare mais çà tourne.

    Enfin ! si vous avez autre chose à proposer pour le réaffichage d'un objet Picture contactez moi.

    Merci.

  8. #8
    mat.M
    Invité(e)
    Par défaut
    Merci bcp "la drogue c'est mal" pour ces précisions.

    Concernant le problème posé , on ne sait tjs pas ce que c'est qu'un objet Picture ( Active X ??? ).

    Pour l'affichage de ma fenêtre OpenGL je suis OBLIGE d'utiliser la fonction OnPaint de ma DialogBox. Que j'appelle quand c'est nécessaire.
    Le problème posé viendrait non pas du framework Windows/MFC mais peut-être plutôt du rendu Open GL.
    Dans le MSDN , voir l'exemple CUBE qui utilise Open GL .
    Qui dit Open GL dit procédure de rendu ( début scène -fin scène)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    J'ai peut être été confu en parlant d'objet Picture. Mais lorsque je créé mon interface sous VC 5.0 j'ai un contrôle Picture de disponible.

    Ce contrôle est géré par la classe CStatic. Mais qui ne me renvoie pas assez d'informations pour faire de ce contrôle un DC. J'ai donc créée une classe de type CWnd pour me renvoyer les informations dont j'ai besoin à partir d'un contrôle Picture.

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

Discussions similaires

  1. objet "Image" - Charger directement la propriété Picture depuis la RAM
    Par gabuzomeu1 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 13/11/2014, 23h01
  2. Décalage d'objets de couleur dans l'environnement picture
    Par Quentin Mafrosiac dans le forum Beamer
    Réponses: 1
    Dernier message: 01/12/2010, 07h29
  3. Réponses: 0
    Dernier message: 28/02/2008, 18h33
  4. [VBA-E] probleme au niveau de l'objet picture
    Par blanka6 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/03/2007, 15h19
  5. Réponses: 5
    Dernier message: 12/04/2005, 13h54

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