Bonjour,
Je developpe actuellement un petit projet d'interface graphique...
J'ai créé plusieurs composants, notamment un panneau defilant (avec des barres de scrolls)
J'ai remarqué un bug dont je ne comprends pas l'origine :
Lorsque je tourne la molette de la souris à fond les ballons, l'ecran se rafraichit plein de fois (normal) et au bout d'un moment, les bitmaps ne sont plus dessinées.
En cherchant un peu, c'est l'appel à CreateCompatibleDC qui me renvoit un hdcMem à NULL.
Voila le code de ma fonction :
je precise :
- les HBITMAP et les HBRUSH pointés par pSkin sont bien valides, j'ai vérifié
- j'ai essayé de remplacer CreateCompatibleDC(NULL) par CreateCompatibleDC(hdc)
- le hdc transmis à la fonction n'est jamais NULL, lui
J'ai regardé le codes d'erreur renvoyés par CreateCompatibleDC, et j'obtiens ça :
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 void cGuiBarreDefilement::dessiner(HDC hdc, RECT updateRect) { RECT rc; HDC hdcMem; rc = m_surface.intersection(updateRect); hdcMem = CreateCompatibleDC(NULL); // Dessin du fond FillRect(hdc,&rc,pSkin->barreDefilements[m_modele].m_fond); // Dessin du curseur if ( (m_surfaceCurseur.largeur != 0) && (m_surfaceCurseur.hauteur != 0) ) { rc = m_surfaceCurseur.rectangle(); if (m_surfaceCurseur.collision(updateRect)) FillRect(hdc,&rc,pSkin->barreDefilements[m_modele].m_curseur); } // Dessin des boutons if (m_surfaceBoutonMoins.collision(updateRect)) { if (m_orientation & GUI_VERTICAL) SelectObject(hdcMem,pSkin->barreDefilements[m_modele].m_boutonHaut.m_bitmap); else SelectObject(hdcMem,pSkin->barreDefilements[m_modele].m_boutonGauche.m_bitmap); BitBlt(hdc,m_surfaceBoutonMoins.x,m_surfaceBoutonMoins.y,m_surfaceBoutonMoins.largeur,m_surfaceBoutonMoins.hauteur,hdcMem,0,0,SRCCOPY); } if (m_surfaceBoutonPlus.collision(updateRect)) { if (m_orientation & GUI_VERTICAL) SelectObject(hdcMem,pSkin->barreDefilements[m_modele].m_boutonBas.m_bitmap); else SelectObject(hdcMem,pSkin->barreDefilements[m_modele].m_boutonDroit.m_bitmap); BitBlt(hdc,m_surfaceBoutonPlus.x,m_surfaceBoutonPlus.y,m_surfaceBoutonPlus.largeur,m_surfaceBoutonPlus.hauteur,hdcMem,0,0,SRCCOPY); } DeleteDC(hdcMem); }
Ce qui m'étonne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Erreur : HDCMem=NULL : 6 - Descripteur non valide Erreur : HDCMem=NULL : 6 - Descripteur non valide Erreur : HDCMem=NULL : 0 - Opération réussie. Erreur : HDCMem=NULL : 6 - Descripteur non valide Erreur : HDCMem=NULL : 6 - Descripteur non valide Erreur : HDCMem=NULL : 0 - Opération réussie. etc...
- pourquoi ça plante que au bout d'un moment ?
- pourquoi Erreur : HDCMem=NULL : 0 - Opération réussie ?
Merci de me filer un coup de main, ce truc va me rendre dingue !
Partager