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

Windows Discussion :

Affichage double-bufferisé avec l'API win32 : manque cruel d'expertise !


Sujet :

Windows

  1. #1
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut Affichage double-bufferisé avec l'API win32 : manque cruel d'expertise !
    Bonjour,

    je cherche à créer un code d'exemple ultra minimaliste qui expose la technique d'affichage avec double buffer.

    Je me limite à l'API de base de <windows.h> (pas de MFC ni autres classes avancées).

    Voici le code auquel je suis arrivé (c'est du c++ mais je ne fais rien d'autre que du c) :

    L'idéal serait d'avoir un code conditionnel : avec ou sans double buffer.
    Dans mon code, j'ai un booléen doublebuffer qui définit cette condition.

    J'ai une boucle qui, à chaque tour, affiche des cercles en ligne (juste histoire d'avoir beaucoup d'objets graphiques).
    Quand le lance l’exécution sans double buffer, j'ai un effet de clignotement très désagréable.
    Mais quand j'active le double buffer, j'ai la même chose !
    A croire que je me suis trompé quelque part...
    D'ailleurs, je ne comprends pas bien ce que OpenGL vient faire là dedans.

    Enfin, en double buffer, il y a 2 dll (opengl32 et glu32) qui sont chargées et déchargées aussitôt à chaque tour...

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #include <windows.h>
    #include <crtdbg.h>
    
    void main ()
        {
        const bool doublebuffer = true ;
        const int  size = 300 ;
        const int  r    = 30 ;
    
        WNDCLASSEX wcx ;
        memset( &wcx,0,sizeof( wcx )) ;
        wcx.cbSize        = sizeof( wcx ) ;
        wcx.lpszClassName = "foo" ;
        wcx.lpfnWndProc   = DefWindowProc ;
        RegisterClassEx( &wcx ) ;
    
        HWND hwnd = CreateWindowEx( NULL,"foo",NULL,WS_POPUP,10,10,size,size,NULL,NULL,NULL,NULL ) ;
        ShowWindow( hwnd,TRUE ) ;
    
        HDC dc = GetWindowDC( hwnd ) ;
    
        if (doublebuffer)
            {
            PIXELFORMATDESCRIPTOR pfd ;
            memset( &pfd,0,sizeof( PIXELFORMATDESCRIPTOR )) ;
            pfd.nSize      = sizeof( PIXELFORMATDESCRIPTOR ) ;
            pfd.nVersion   = 1 ;
            pfd.dwFlags    = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER ;
            pfd.iPixelType = PFD_TYPE_RGBA ;
            pfd.cColorBits = 24 ;
            pfd.cDepthBits = 24 ;
    
            int iPixelFormat = ChoosePixelFormat( dc,&pfd ) ;
            PIXELFORMATDESCRIPTOR bestMatch_pfd ;
            DescribePixelFormat( dc,iPixelFormat,sizeof( pfd ),&bestMatch_pfd ) ;
            SetPixelFormat( dc,iPixelFormat,&pfd ) ;
            }
    
        PAINTSTRUCT paint ;
    
        for ( int loop = 0 ; loop < 1000 ; loop++ )
            {
            int y = loop%(size-2*r)+r ;
    
            BeginPaint( hwnd,&paint ) ; // fonctionne aussi sans ça...
            Rectangle( dc,0,0,size,size ) ;
            for ( int x = r ; x < size-r ; x += 2 )
                Ellipse( dc,x-r,y-r,x+r,y+r ) ;
            EndPaint( hwnd,&paint ) ;
            
            if (doublebuffer)
                {
                _RPT1(0,"------------------- %d\n",loop ) ;
                SwapBuffers( dc ) ;
                }
            else
                Sleep( 50 ) ; // ~ la même durée que le 'SwapBuffers' (sur mon PC)
            }
    
        DeleteDC( dc ) ;
        DestroyWindow( hwnd ) ;
        }
    Extrait de la fenêtre de sortie avec les dll chargées/déchargées à chaque tour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ------------------- 94
    'foo.exe' : Chargé 'C:\Windows\SysWOW64\opengl32.dll', Cannot find or open the PDB file
    'foo.exe' : Chargé 'C:\Windows\SysWOW64\glu32.dll', Cannot find or open the PDB file
    'foo.exe' : Déchargé 'C:\Windows\SysWOW64\opengl32.dll'
    'foo.exe' : Déchargé 'C:\Windows\SysWOW64\glu32.dll'
    ------------------- 95
    Donc, à vous les experts de la programmation windowsienne, je pose toutes ces questions :
    - comment faire du double buffer qui me donne une animation fluide ?
    - à quoi servent les BeginPaint + EndPaint ? (puisque je n'observe pas de différence en les supprimant)
    - comment éviter ce manège de dll ?
    - mes pratiques sont-elles bonnes ? (sachant que veux éviter la programmation par événements et les WM_PAINT)

    Merci d'avance !
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 352
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 352
    Points : 20 359
    Points
    20 359
    Par défaut
    salut tu n'est pas sur le bon forum ou alors il faut absolument se débarasser des appels de Open GL
    Soit tu utilises Open GL soit tu utilises le GDI et win32 avec les fonctions comme CreateCompatibleDC,StretchBlt etc....
    mais c'est soit l'un ou soit l'autre pas les 2 à la fois.
    Si tu veux afficher des graphismes simplement on peut prendre SDL qui est très simple à utiliser

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Quel Windows utilisez vous ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Merci de vos réponses...

    J'utilise Windows 7 et Visual 2010, mais j'essaye de me limiter à l'API graphique basique (je ne sais pas très bien comment la nommer) qui, il me semble, n'a pas trop évoluée depuis longtemps....

    Voyez les fonctions que j'utilise dans mon petit bout de code :
    RegisterClassEx, CreateWindowEx, GetWindowDC, et le primitives graphiques simples : Rectangle, Ellipse.

    Je ne suis pas très sûr de savoir ce font exactement ces fonctions.
    le code auquel je suis arrivé est une compilation d'exemples trouvés à droite à gauche.

    Malgré cette absence de base théorique, je crois que je suis arrivé à quelque chose d'à peu près satisfaisant.
    Toute fois, lorsque j'essaie d'animer des objets graphiques en les faisant évoluer et redessiner continuellement, j'ai un effet de clignotement.

    Or j'ai cru comprendre que le double buffering est la solution à ce problème.
    Et c'est là que j'ai besoin d'avis d'experts pour mettre en place cette technique de manière "orthodoxe".
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    J'ignore s'il existe un moyen de faire du "vrai" double-buffering, c'est-à-dire la version où l'on change juste un pointeur dans le système d'affichage au lieu de recopier le contenu du buffer.

    Compte tenu de ce manque, ma techinique habituelle, c'est de me créer un bitmap et un memory DC qui persistent dans la durée de vie de la fenêtre (mais je re-crée le bitmap à chaque fois que la fenêtre est redimensionnée), tout dessiner dans le bitmap (arrière-plan puis le reste), et recopier celui-ci vers le DC de la fenêtre à la fin de mon dessin.

    Il est probable que créer le bitmap avec CreateCompatibleBitmap() permet une copie plus rapide que faire un DIB qui n'aurait pas les mêmes paramètres que le Screen DC.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Mmm... merci Medinoc,

    je vais me pencher sur la question... c.à.d plonger dans la doc MSDN
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  7. #7
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Ho ! punaise !
    Ça va même plus vite que sans passer par un bitmap !

    Merci !

    Je ne résiste pas à l'envie de vous copier mon code mis à jour
    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
    #include <windows.h>
    
    void main ()
        {
        const bool doublebuffer = true ;
        const int  size = 300 ;
        const int  r    = 30 ;
    
        WNDCLASSEX wcx ;
        memset( &wcx,0,sizeof( wcx )) ;
        wcx.cbSize        = sizeof( wcx ) ;
        wcx.lpszClassName = "foo" ;
        wcx.lpfnWndProc   = DefWindowProc ;
        RegisterClassEx( &wcx ) ;
    
        HWND hwnd = CreateWindowEx( NULL,"foo",NULL,WS_POPUP,100,100,size,size,NULL,NULL,NULL,NULL ) ;
        ShowWindow( hwnd,TRUE ) ;
    
        HDC     dc  = GetWindowDC( hwnd ) ;
        HBITMAP bm  = NULL ;
        HDC     mdc = NULL ;
        HDC     DC = dc ;
    
        if (doublebuffer)
            {
            mdc = CreateCompatibleDC( dc ) ;
            bm  = CreateCompatibleBitmap( dc,size,size ) ;
            SelectObject( mdc,bm ) ;
            DC = mdc ;
            }
    
        for ( int loop = 0 ; loop < 1000 ; loop++ )
            {
            int y = loop%(size-2*r)+r ;
    
            Rectangle( DC,0,0,size,size ) ;
            for ( int x = r ; x < size-r ; x += 2 )
                Ellipse( DC,x-r,y-r,x+r,y+r ) ;
            
            if (doublebuffer)
                BitBlt( dc,0,0,size,size,mdc,0,0,SRCCOPY ) ;
            }
    
        DeleteObject( bm ) ;
        DeleteDC( mdc ) ;
        DeleteDC( dc ) ;
        DestroyWindow( hwnd ) ;
        }
    Qui sait ? ça pourrait servir à quelqu'un...
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Note que tu devrais garder le HGDIOBJ de l'ancien bitmap du MemoryDC, et le restaurer à la fin avant de tout supprimer...

    Excellent code d'exemple pour une animation "pure", en attendant, ça montre bien le principe et les différences de vitesse. Évidemment, dans une vraie application on s'articulerait autour d'une boucle de messages.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut

    Mais heu... je ne comprends rien à :
    Citation Envoyé par Médinoc Voir le message
    tu devrais garder le HGDIOBJ de l'ancien bitmap du MemoryDC, et le restaurer
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    http://www.developpez.net/forums/d14...g/#post7988152
    Le thread est littéralement juste à côté du tien.

    De plus, si tu bosses en C++, ceci peut t'être utile pour faire la restauration (mais je devrais y rajouter un code d'exemple).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Okéééé !
    Je vois que nous sommes nombreux à errer dans cette API...

    Voilà ce que j'ai fait :
    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
        HDC     dc  = GetWindowDC( hwnd ) ;
        HBITMAP bm  = NULL ;
        HGDIOBJ old ;
        HDC     mdc = NULL ;
        HDC     DC = dc ;
    
        if (doublebuffer)
            {
            mdc = CreateCompatibleDC( dc ) ;
            bm  = CreateCompatibleBitmap( dc,size,size ) ;
            old = SelectObject( mdc,bm ) ;   // <<<<<<<<<<<<<<< sauvegarde de l'ancien bitmap
            DC  = mdc ;
            }
    
        // <<<<<<<<<< plein de beaux dessins avec Rectangle et Ellipse
    
        if (doublebuffer) SelectObject( mdc,old ) ; // <<<<<<<<<<<< restauration de l'ancien bitmap
        DeleteObject( bm ) ;
        DeleteDC( mdc ) ;
        DeleteDC( dc ) ;
        DestroyWindow( hwnd ) ;
    Mais je me demande à quoi sert de restaurer l'ancien bitmap, alors qu'on détruit le DC juste après ?
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pour que l'ancien bitmap soit détruit avec le DC.
    Il me semble que c'est surtout important pour les DCs que tu ne crées pas toi-même, mais c'est une habitude à prendre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Mmm... ce que tu me dis là m'inquiète quelque peu...
    Comme tu peux t'en douter, le bout de code que j'ai copié ici est un extrait minimal du code sur lequel je travaille.
    En fait, j'utilise des PEN, des BRUSH, des FONT etc., et j'ai bien peur de ne pas faire un ménage suffisant (ce qui ne veut pas dire que je n'en fais pas du tout ).
    Du coup, pour voir, j'ai commenté les destructions d'objets et j'ai testé les memory leaks :
    Rien !
    Je n'en ai qu'un : celui que je fais exprès pour vérifier que le check est réellement fait.
    J'ai ajouté ça au tout début de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF ) ;
    _CrtSetReportMode( _CRT_WARN,_CRTDBG_MODE_DEBUG ) ;
    ça au mlieuet j'ai commenté tout ça à la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //     DeleteObject( bm ) ;
    //     DeleteDC( mdc ) ;
    //     DeleteDC( dc ) ;
    //     DestroyWindow( hwnd ) ;
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Detected memory leaks!
    Dumping objects ->
    {135} normal block at 0x021149E0, 13 bytes long.
     Data: <             > CD CD CD CD CD CD CD CD CD CD CD CD CD 
    Object dump complete.
    Le programme '[6308] foo.exe: Natif' s'est arrêté avec le code 0 (0x0).
    Donc, soit Windows a une espèce de gerbage collector pour ses propres objets, soit le check ne fait pas ce que je veux...
    Qu'en penses-tu ?
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    _CrtDumpMemoryLeaks() ne surveille que le tas de la Debug CRT, et non pas les objets Kernel, USER ou GDI.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    C'est bien ce que je craignais...
    Et connais-tu un moyen de surveiller les objets Kernel, USER ou GDI ?
    En cherchant sur ne net, j'ai l'impression que Visual Studio ne fournit pas le moyen de faire ça, et qu'il faut installer un outil externe...
    Si c'était le cas, ce serait vraiment honteux de la part de Microsoft !
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

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

Discussions similaires

  1. modifier le thème d'une fenêtre avec l'API win32
    Par d'Oursse dans le forum Windows
    Réponses: 9
    Dernier message: 19/02/2012, 17h03
  2. double buffering avec l'API Windows
    Par _Michel dans le forum Windows
    Réponses: 13
    Dernier message: 01/05/2008, 16h35
  3. Petit probleme avec l'API win32
    Par spiky31 dans le forum Windows
    Réponses: 3
    Dernier message: 24/01/2006, 17h01
  4. faire dérouler une image avec l'api win32
    Par gdkenny dans le forum Windows
    Réponses: 6
    Dernier message: 26/11/2005, 22h46
  5. Redimensionner un composant avec l'API Win32
    Par le merou dans le forum Composants VCL
    Réponses: 5
    Dernier message: 29/05/2005, 14h59

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