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

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);
}
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
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...
Ce qui m'étonne :
- 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 !