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] libération des objets GDI's


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 92
    Points : 55
    Points
    55
    Par défaut [MFC] libération des objets GDI's
    Bonjour,

    J'ai une application dans laquelle j'ai voulut changer la couleur par défaut de la boite "A propos de"
    Pour cela j'ai utilisé ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = ::CreateSolidBrush(RGB(230,237,250));
    	pDC->SetBkMode(TRANSPARENT);
     
    	return hbr;
    }
    Le problème est que avec cette methode quand j'ouvre la boite des objets GDI sont créés (on les voies dans le taskmgr) mais ne sont jamais libérés.

    J'ai essayé cela :
    Mais cela ne fonctionne pas car la boite ne dessine pas et en plus les GDI sont quand même créés.

    Comment faire SVP ?

  2. #2
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    il faut faire sur la brush
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BOOL DeleteObject(
    HGDIOBJ hObject
    );
    en plus de relacher le dc à la fin.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 92
    Points : 55
    Points
    55
    Par défaut
    Je ne peux pas faire cela puisque je doit retourner la brush, alors je ne peux pas le détruir !!!

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 68
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Vous n'etes pas obligé de creer le HBRUSH dans la fonction,
    par exemple vous pouvez le creer dans le constructeur de la dlg avec
    une variable membre et le supprimer dans son destructeur.
    Et dans la fonction vous retournez la variable membre.

    Cordialement

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    exact comme le precise pipin il faut que ta HBRUSH soit une donnée membre
    de ta classe et sur le destructeur tu fais DeleteObject en testant si le handle est <> de zero .
    dans le constructeur je le mets à zero .

    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
     
    CAboutDlg::CAboutDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CAboutDlg::IDD, pParent)
    {
         m_hbr=NULL;
    }
    CAboutDlg::~CAboutDlg
    {
       if( m_hbr) ::DeleteObject(m_hbr);
    }
    HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
       if(! m_hbr) m_hbr = ::CreateSolidBrush(RGB(230,237,250)); 
       pDC->SetBkMode(TRANSPARENT);
       return m_hbr;
    }

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 92
    Points : 55
    Points
    55
    Par défaut
    Oui merci,

    Il faut donc déclarer une Brush en varaible membre de la classe

    Merci à tous

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

Discussions similaires

  1. libération des objets SQL SERVER 2000 et ASP
    Par patdodos dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 27/11/2007, 14h45
  2. Libération des objets créés
    Par miniil dans le forum Delphi
    Réponses: 11
    Dernier message: 03/06/2007, 11h03
  3. TObjectList et libération des objets
    Par eponette dans le forum Delphi
    Réponses: 9
    Dernier message: 04/01/2007, 11h16
  4. Réponses: 13
    Dernier message: 09/05/2006, 16h30
  5. Question simple sur la libération des objets
    Par gibet_b dans le forum Langage
    Réponses: 2
    Dernier message: 12/07/2004, 10h01

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