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 :

[VC++6]Cr�ations de fen�tres et objets GDI


Sujet :

MFC

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut [VC++6]Cr�ations de fen�tres et objets GDI
    Salut,

    Je faisais quelques petits tests.

    Pour cel�, j'ai cr�� un classe d�riv�e de CWnd. Et dans ma view principale, je d�clare une instance de cette classe.

    Sous un bouton de tests, je lance le code suivant:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    if (!m_wndTest.m_hWnd)
    		m_wndTest.CreateEx(WS_EX_OVERLAPPEDWINDOW, AfxRegisterWndClass(NULL,NULL, NULL, NULL), "MyWnd", WS_VISIBLE, CRect(0,0,200,200), this, NULL);
    Alors, je lance mon appli, et je regarde le nombre d'objets GDI. Je cr�e une premi�re fois ma fen�tre en appuyant sur le bouton. Le nombre d'objets GDI augmente de 2. Je ferme la fen�tere cr��e. Le nombre d'objets GDI ne diminue pas de 2. (au contraire, il reste stable)
    Je rappuie sur le bouton pour cr��er ma fen�tre et cette fois ci, le nombre d'objets GDI augmente de 5. En fermant la fen�tre, pas de diminution. Puis � chaque cr�ation, ce nombre augmente de 5... ad vitam eternam.

    Bref, il y aune fuite de m�moire GDI dans mon programme.

    Est ce normal? D'o� vient elle? Puis je l'�liminer?

  2. #2
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 39
    Par d�faut
    faudra peut etre detruire la fenetre que t'as cree via
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    m_wndTest.DestroyWindow()
    avant de creer la nouvelle

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    JE le mets ou ce DestroyWindow?

    Bref, j'ai essay� de le mettre dans ma procdure de test, juste avant le test if, mais �a ne change rien.

    Cad que je fais:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    m_wndTest.DestroyWindow();
    if (!m_wndTest.m_hWnd) 
          m_wndTest.CreateEx(WS_EX_OVERLAPPEDWINDOW, AfxRegisterWndClass(NULL,NULL, NULL, NULL), "MyWnd", WS_VISIBLE, CRect(0,0,200,200), this, NULL);

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    Alors, pour info, lorsque je cr�e une fen�tre de la sorte:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    m_wndTest.Create(AfxRegisterWndClass(0,NULL, NULL, NULL), "MyWnd", WS_VISIBLE, CRect(0,0,200,200), this, 2000);
    cad une fen�tre ayant ma view principale comme parent, je n'ai plus ces pertes m�moire GDI.

    Vraiment �tonnant...

  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    Punaise, je n'arrive vraiment pas � comprendre pourquoi cette fuite de m�moire GDI.

    En fait, m�me avec le code suivant il y a une fuite de m�moire GDI:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    m_wndTest.CreateEx(0, AfxRegisterWndClass(0,NULL, NULL, NULL), "MyWnd", WS_VISIBLE, CRect(0,0,200,200), NULL, NULL);
    Je ne pense pas que l'on puisse faire plus simple comme fen�tre.

    En fait, la m�moire fuit du moment que la fen�tre est rendue visible. Sinon, si je ne la rends pas visible, et la d�truis par la suite, aucune fuite m�moire.

    Vraiment bizarre...

  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
    Citation Envoy� par Yoyo@
    Alors, pour info, lorsque je cr�e une fen�tre de la sorte:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    m_wndTest.Create(AfxRegisterWndClass(0,NULL, NULL, NULL), "MyWnd", WS_VISIBLE, CRect(0,0,200,200), this, 2000);
    cad une fen�tre ayant ma view principale comme parent, je n'ai plus ces pertes m�moire GDI.

    Vraiment �tonnant...
    c'est comme �a que je procede ...
    avec le type WS_CHILD en plus .

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    Citation Envoy� par farscape
    c'est comme �a que je procede ...
    avec le type WS_CHILD en plus .
    Bah tu devrais toi aussi avoir des fuites m�moire je viens d'essayer de rajouter le style WS_CHILD, qui fait que la fen�tre est limit�e dans son mouvement � la fen�tre parent. (mais on peut la d�placer grace au WS_CAPTION)

    Est ce que tu pourrais essayer d'en cr�er et d'en d�truire plusieurs de la sorte, histoire de voir si tu as des fuites m�moire?

    Je suis maintenant quasiment convaincu que les fuites m�moire proviennet du WS_CAPTION, car quand je l'enl�ve, alors je n'en ai plus (mais je ne peux plus d�placer ma fen�tre)

  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 ,
    pourquoi tu parles de WS_CAPTION ?
    moi je fais �a :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    m_pWnd->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rect,pParent,id);
    moi en fait je cr�e ce genre de fenetre pour une zone de travail interne .
    que veux tu faire exactement ?


  9. #9
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    Bah mon but est de cr�er une fen�tre quelconque extern, que je puisse d�placer � ma guise avec ma souris.

    Je tiens vraiment � ce que ce soit une fen�tre issue de ma propre classe, et non pas un Dialog ou autre.

  10. #10
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    Bon, visiblement, mon post ne suscite pas beaucoup de solution, mais quand m�me, pour ma part, j'en ai trouv� une, et j'ai aussi trouv� le d�but du pourquoi. A force d'�tudier ce qu'il se passe sous mes fen�tres, la gestion des classes par MFC, etc, j'ai fini par avoir une id�e:

    Red�finir mon propre AfxRegisterWndClass comme suit:

    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
    LPCTSTR AFXAPI AfxMyRegisterWndClass(UINT nClassStyle,
    	HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon)
    {
    	// Returns a temporary string name for the class
    	//  Save in a CString if you want to use it for a long time
    	LPTSTR lpszName = AfxGetThreadState()->m_szTempClassName;
     
    	// generate a synthetic name for this class
    	HINSTANCE hInst = AfxGetInstanceHandle();
    	if (hCursor == NULL && hbrBackground == NULL && hIcon == NULL)
    		wsprintf(lpszName, _T("Afx:%x:%x"), (UINT)hInst, nClassStyle);
    	else
    		wsprintf(lpszName, _T("Afx:%x:%x:%x:%x:%x"), (UINT)hInst, nClassStyle,
    			(UINT)hCursor, (UINT)hbrBackground, (UINT)hIcon);
     
    	// see if the class already exists
    	WNDCLASS wndcls;
    	if (::GetClassInfo(hInst, lpszName, &wndcls))
    	{
    		// already registered, assert everything is good
    		ASSERT(wndcls.style == nClassStyle);
     
    		// NOTE: We have to trust that the hIcon, hbrBackground, and the
    		//  hCursor are semantically the same, because sometimes Windows does
    		//  some internal translation or copying of those handles before
    		//  storing them in the internal WNDCLASS retrieved by GetClassInfo.
    		return lpszName;
    	}
     
    	// otherwise we need to register a new class
    	wndcls.style = nClassStyle;
    	wndcls.lpfnWndProc = AfxWndProc;
    	wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
    	wndcls.hInstance = hInst;
    	wndcls.hIcon = hIcon;
    	wndcls.hCursor = hCursor;
    	wndcls.hbrBackground = hbrBackground;
    	wndcls.lpszMenuName = NULL;
    	wndcls.lpszClassName = lpszName;
    	if (!AfxRegisterClass(&wndcls))
    		AfxThrowResourceException();
     
    	// return thread-local pointer
    	return lpszName;
    }
    La sule d�iff�rence vient de cette ligne:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    wndcls.lpfnWndProc = AfxWndProc;
    au lieu de

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    wndcls.lpfnWndProc = DefWndProc;
    Je ne comprends pas exactement pourquoi �a marche, mais au moins, �a marche...

  11. #11
    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,
    tu as essay� comme dans mon exemple en mettant null ?

  12. #12
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    Nan, je n'avais pas essay�, donc, j'ai essay�...

    Mais �a me fait un Debg Assertion Failure.

    En y regardant de plus pr�s, voici le code de PreCreateWindow:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BOOL CWnd::PreCreateWindow(CREATESTRUCT& cs)
    {
    	if (cs.lpszClass == NULL)
    	{
    		// make sure the default window class is registered
    		VERIFY(AfxDeferRegisterClass(AFX_WND_REG));
     
    		// no WNDCLASS provided - use child window default
    		ASSERT(cs.style & WS_CHILD);
    		cs.lpszClass = _afxWnd;
    	}
    	return TRUE;
    }
    Bref, on voit bien que si l'on ne fournit pas de nom de classe, alors �a ne marche que si la fen�tre que l'on veut cr�er a le style WS_CHILD, ce qui n'est pas mon cas...

  13. #13
    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,
    apres une petite recherche dans les codes que je j'utilise ,
    dans le cas d'une fenetre de style popup pour simuler un tooltip voila comment j'ai declar� �a:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    CString szClassName = AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS, 
                                                  LoadCursor(NULL, IDC_ARROW));
     
        if (!CWnd::CreateEx(WS_EX_TOPMOST, szClassName, _T(""), 
                            WS_POPUP, 
                            0, 0, 10, 10, 
                            pParentWnd->GetSafeHwnd(), 0, NULL))
        {
            return FALSE;
        }
    CS_SAVEBITS peut etre enlev� il permet ici de disposer d'un mecanisme de sauvegarde ecran ger� par le systeme,donc utile pour un popup comme un tooltipctrl.

  14. #14
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    D'accord!

    Mais mon but est d'avoir une fen�tre que je puisse d�placer � la souris. Donc, il me faut un WS_CAPTION.

    Donc, j'ai utilis� le m�me code que toi, mais avec WS_CAPTION en plus, et l�, bien s�r: fuites m�moire GDI. (comme je le disais plus haut: c'est le WS_CAPTION qui semble causer ces fuites)

    Ca me parait vraiment inextricable (et inexplicable!) comme probl�me... Pourtant, les donn�es du probl�me sont simples !

  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
    hum j'ai jamais eu besoin besoin de creer une fenetre de ce style,

    le cas echeant je creerais une dialog non modale sans ressources.
    a tout hasard ,dans le post it faq j'ai mis un code pour dialog modale sans ressources.
    il suffit de modifier la fonction d'initialisation pour passer en non modale.
    http://www.developpez.net/forums/vie...810922#1810922

  16. #16
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    Bah oui, je sais bien que je peux passer par un Dialog.

    Mais bon, je trouve �a quand m�me assez fou que je ne puisse pas cr�er une fen�tre ind�pendante "� la main", de mani�re simple, que je puisse ensuite d�placer � la souris.

    Enfin, si, je peux le faire, mais en voyant mon compteur GDI augmenter � chaque cr�ation/destruction de fen�tre...

  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
    une dialogue oui ,mais sans ressources en dynamique ...

  18. #18
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    Bon, ca marche tr�s bien avec un Dialog. J'ai pas essay� la version non modae, mais bon, je vois tr�s bien comment parvenir � mes fins. J'iame bien cette "construction" � la main, on voit bien ce qu'on fait!

    Mais quand m�me, n'emp�che, je n'arrive pas � croire qu'on ne puissse cr�er nous m�mes notre fen�tre "ext�rieure" � la main. Ca ne vous interpelle pas plus que �a? Qu'il y ait ces fuites d'objets GDI? (sauf � utiliser la solution alambiqu�e que j'ai trouv�e...

    Et pourquoi le probleme ne vient que l'orsqu'il y a une Caption?

    Qu'est ce qui constitue les objets GDI d'une fen�tre?

  19. #19
    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 Yoyo@
    Bon, ca marche tr�s bien avec un Dialog. J'ai pas essay� la version non modae, mais bon, je vois tr�s bien comment parvenir � mes fins. J'iame bien cette "construction" � la main, on voit bien ce qu'on fait!

    Mais quand m�me, n'emp�che, je n'arrive pas � croire qu'on ne puissse cr�er nous m�mes notre fen�tre "ext�rieure" � la main. Ca ne vous interpelle pas plus que �a? Qu'il y ait ces fuites d'objets GDI? (sauf � utiliser la solution alambiqu�e que j'ai trouv�e...

    Et pourquoi le probleme ne vient que l'orsqu'il y a une Caption?

    Qu'est ce qui constitue les objets GDI d'une fen�tre?
    si si il faudrait creuser la chose (et avoir un peu de temps) ,et voir comment en win32 on cr�e une fenetre de ce style.
    jusqu'� present je n'ai eu besoin de creer que des fenetres child ,pour le reste je passe par la dialog template modale ou non modale.


  20. #20
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    79
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 79
    Par d�faut
    Tiens, c'est vrai, ce n'est pas une mauvaise id�e: je pourrais dans un premier temps tester avec des fen�tres Win32.

    Tu vois, on a trouv� une solution intem�diaire (avec les Dialog) mais n�anmoins, je n'iame pas ne pas aller au fond des choses. Et c'est justement en se battant sur des petits d�tails qu'on avance.

    Bref, je vais partir 1 semaine en vacances, mais quoiqu'il advienne, je vais continuer � creuser la chose.

    Est ce que tu as une id�e des objets GDI qui sont cr��s avec la fen�tre? D'ailleurs, pour info, ces objets n'apparaissent que quand la fen�tre est rendue visible!

Discussions similaires

  1. Probl�me avec cr�ation de fen�tre dynamique
    Par FredericB dans le forum C++Builder
    R�ponses: 3
    Dernier message: 29/09/2005, 17h21
  2. [MFC + Win32] Cr�ation de fen�tre
    Par nmarf dans le forum MFC
    R�ponses: 2
    Dernier message: 05/07/2005, 10h25
  3. R�ponses: 2
    Dernier message: 06/12/2004, 04h29
  4. [MFC] lib�ration des objets GDI's
    Par Kevgeii dans le forum MFC
    R�ponses: 5
    Dernier message: 01/02/2004, 10h37
  5. Probl�me de cr�ation de fen�tre
    Par tomateauketchup dans le forum DirectX
    R�ponses: 1
    Dernier message: 08/06/2003, 19h42

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