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 :

[MFC] Restauration du DC


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 23
    Par défaut [MFC] Restauration du DC
    Bonjour,

    j'essaye d'afficher des images dans une fenêtre.
    J'y arrive en surchargeant la méthode OnPaint() de ma fenêtre.
    Je dessine alors des images dans différents controles (IDC Bitmap).
    Jusque la pas de problème.

    Cependant, lorsque je minimise une fenêtre et qu'ensuite je l'agrandi, mes images affichées sont effacées. Et tant que je ne rappelle pas la fonction OnPaint(), il ne se passe rien.

    Comment cela ce fait il ? Quelle est la solution ?
    Dois je restaurer le DC de ma fenêtre ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    tu devrais appeler updatewindow quand tu restaures

  3. #3
    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 Re: [MFC] Restauration du DC
    Citation Envoyé par youb
    Bonjour,

    j'essaye d'afficher des images dans une fenêtre.
    J'y arrive en surchargeant la méthode OnPaint() de ma fenêtre.
    Je dessine alors des images dans différents controles (IDC Bitmap).
    Jusque la pas de problème.

    Cependant, lorsque je minimise une fenêtre et qu'ensuite je l'agrandi, mes images affichées sont effacées. Et tant que je ne rappelle pas la fonction OnPaint(), il ne se passe rien.

    Comment cela ce fait il ? Quelle est la solution ?
    Dois je restaurer le DC de ma fenêtre ?

    Merci d'avance
    tout ça me parait louche ,montre ton code

  4. #4
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 23
    Par défaut
    Voila les méthodes de mon code qui concernent l'affichage de la fenetre :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    void MaClasse::OnPaint()
    {
       CDialog::OnPaint();
     
    	UINT IDB_HPSCR1 = 400; // Mon image à afficher
       UINT IDC_BP_AREA = 500; // Mon IDC qui contient la future image
     
     
       for (i=0;i<5;i++)    // J'appelle pour mes 5 images & DC différents, ma fonction qui affiche les images (Dessiner)
       {
          IDB_HPSCR1 = IDB_HPSCR1 +1 ;
          IDC_BP_AREA = IDC_BP_AREA +1;
    	   Dessiner(IDB_HPSCR1, IDC_BP_AREA);
       }
    }
     
    void MaClasse::Dessiner(UINT IDB_HPSCR1, UINT IDC_BP_AREA)
    {
    	CDC *pDC;
    	BITMAP m_bmp1;
    	CBitmap Image1;
    	CDC memDC1;
     
    	pDC = GetDlgItem(IDC_BP_AREA)->GetDC();
    	Image1.LoadBitmap(IDB_HPSCR1);
    	Image1.GetBitmap(&m_bmp1);
    	memDC1.CreateCompatibleDC(pDC);
    	memDC1.SelectObject(Image1);
    	pDC->BitBlt(0,0,m_bmp1.bmWidth,m_bmp1.bmHeight,&memDC1,0,0,SRCCOPY);
    }
     
    BOOL MaClasse::OnEraseBkgnd(CDC* pDC)
    {
     
    	 CDialog::OnEraseBkgnd(pDC);
     
         // Fixe une brosse avec la couleur de fond choisie
         CBrush BkClrBrush(RGB(255, 255, 255));
     
         // Sauvegarde l’ancienne brosse.
         CBrush* pOldBrush = pDC->SelectObject(&BkClrBrush);
     
         CRect rect;
         pDC->GetClipBox(&rect);    // récupère la zone a effacer.
     
         pDC->PatBlt(rect.left, rect.top, rect.Width(),
                     rect.Height(), PATCOPY);
     
         pDC->SelectObject(pOldBrush);// restitue l’ancienne brosse.
     
    	 return TRUE;
     
    }
    Merci d'avance

  5. #5
    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,
    ça ne m'etonne pas trop...
    Il faut comprendre une chose :
    Il faut du partir du principe que une fenêtre et par extension un contrôle sait se dessiner lors d’un recouvrement grâce au message wm_paint qui lui est envoyée.

    Donc pour chaque fenêtre on mettra en place dans la fonction de dessin appropriée (ça dépend de la classe fenêtre) sa logique de dessin, pour un contrôle classique OnPaint .

    Lorsque l’on voudra changer cette logique la classe associée a l’objet devra disposer de fonctions assesseurs permettant le réglage de certaines options.
    Le dessin du contrôle final pouvant être fait a la demande par un simple Invalidate sur l’objet concerné.
    Dans le cas général d’un recouvrement il n’ y a rien à faire chaque fenêtre sachant se redessiner.

    Donc pas de dessin des contrôles dans le message paint de la fenêtre parent, c’est une mauvaise solution.

  6. #6
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 23
    Par défaut
    Ok merci, j'ai compris le principe.
    J'ai modifié mon programme mais en gros le problème reste le même.
    (J'ai enlevé la surcharge de la méthode OnPaint() )

    Je vois d'ou vient mon problème :

    J'explique comment j'ai procéder pour créer mon Contrôle ou j'affiche mon image :

    C'est un controle que j'ai créer graphiquement sous Visual dans ma boite de dialogue. C'est un controle "Picture" qui contient une Bitmap. J'ai affecté une Bitmap par défaut (fichier image du Disque Dur).

    Et dans mon programme je viens modifier le DC du controle et afficher ma nouvelle image.

    Mais l' image par défaut est rappellé à chaque fois qu'il appelle la fonction OnPaint(). Comment puis je faire pour éviter qu'il la rappelle. En modifiant le DC du controle ? Comment fais t'on ?

    Merci

  7. #7
    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
    si c'est ça tu te complique la vie et tu commets des erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CStatic *pStatic=static_cast<CStatic *>(GetDlgItem(IDC_BP_AREA));
    pStatic->SetBitmap(m_Image1);
    m_Image1 correspond a ta variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Image1.LoadBitmap(IDB_HPSCR1);
    la lecture des differents bitmaps doit etre fait une fois dans InitDialog ou alors
    en testant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(!m_Image1.m_hObject)
          m_Image1.LoadBitmap(IDB_HPSCR1); 
    CStatic *pStatic=static_cast<CStatic *>(GetDlgItem(IDC_BP_AREA));
    pStatic->SetBitmap(m_Image1);
    dans ton code le bitmap est detruit en sortant de la fonction (objet local).

    pour lire une autre image il suffira de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m_Image1. DeleteObject();
    m_Image1.LoadBitmap(IDB_XXXX);
    note ce code ne doit pas etre placé dans le paint mais dans InitDialog...
    a la demande : sur l'action d'un bouton ,commande menu etc..


  8. #8
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 23
    Par défaut
    Ok mais ce que je dois faire est + compliqué que ca

    En fait je dois utilisé le DC car j'affiche 2 images (qui n'ont pas les mêmes dimensions) dans le controle IDC_BP_AREA.

    Donc en fesant pStatic->SetBitmap(m_Image1), puis pStatic->SetBitmap(m_Image2), il ne charge que la dernière image....


    J'aimerais aussi savoir quelle fonction (redessinant le controle) le programme appelle quand :

    -> je passe la souris au dessus d'un controle

    -> je fait passer une autre fenetre devant ma fenetre d'application. (je crois que c'est OnPaint() dans ce cas)

    Merci

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. MDI sans MFC, possible ?
    Par delire8 dans le forum MFC
    Réponses: 4
    Dernier message: 17/06/2002, 07h38
  3. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58
  4. Réponses: 2
    Dernier message: 10/06/2002, 11h03
  5. [MFC] ADO connection
    Par philippe V dans le forum MFC
    Réponses: 3
    Dernier message: 10/06/2002, 07h36

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