[GDI / MFC] Clipping !

Clipping ! [GDI / MFC] - C++ - Programmation

Marsh Posté le 23-01-2005 à 20:39:21    

Bonsoir ;)
 
Je sais pas comment faire ! J'ai fini tout un programme MFC mais
j'ai beaucoup de clipping... Disons que régulièrement j'ai ma view
qui se réaffiche (OnDraw), et là je redessine tout un tableau de
cases de couleurs (chacune différente). Pourtant le tableau n'est
pas si grand que ça ...
 
J'utilise CMemDC, à priori c'est conseillé, enfin avec ou sans (si
j'écrit directement sur le CDC reçu par OnDraw) j'ai le même
résultat.
 
Voici ma méthode de dessin :
-------------------------------  
- un SelectObject sur une font
 
Et pour chaque case du tableau (un total de 100) je fais à chaque fois :
- un pDC->SetBkColor
- un pDC->SelectObject sur un brush
- un pDC->Rectangle (de taille de 3pixels)
 
C'est tout, bref y'a pas grand chose...
Qu'est ce qui cloche ? Je vous remercie de votre aide :)

Reply

Marsh Posté le 23-01-2005 à 20:39:21   

Reply

Marsh Posté le 23-01-2005 à 21:54:35    

tu parles pas plutot de flicker ?
 
lorsque tu utilises CMemDC, tu modifies bien le OnEraseBackground pour qu'il ne fasse rien ?

Reply

Marsh Posté le 23-01-2005 à 22:32:00    

Oui je fais un retourne false... mais ça n'améliore rien...

Reply

Marsh Posté le 23-01-2005 à 22:35:34    

tu peux balancer le code de ton OnDraw pour voir ? (avec CMemDC)

Reply

Marsh Posté le 23-01-2005 à 22:51:20    

SquiZZ a écrit :

tu peux balancer le code de ton OnDraw pour voir ? (avec CMemDC)


 
Le code est un peu long alors en le racourcissant ça donne ça :
 

Code :
  1. void CMyView::OnDraw(CDC* dc)
  2. {
  3. CMemDC pDC(dc, 0);
  4. // Après je dessine tout dans pDC...
  5. // SelectObject, Rectangle...


 
J'ai aussi

Code :
  1. BOOL CHeatDiffusionView::OnEraseBkgnd(CDC *pDC)
  2. {
  3. return FALSE;
  4. }


 
Après il me manque rien...

Reply

Marsh Posté le 23-01-2005 à 23:06:40    

T'as bien un BeginPaint et un EndPaint ?  
 
Et tu n'as pas répondu: c'est un problème de clipping ou de flicker (clignotement) que tu as ?

Reply

Marsh Posté le 23-01-2005 à 23:15:47    

Un problème de clignotement, à priori je vois le blanc du background quand ça recréé l'image...
 
BeginPaid et EndPaint ? J'ai jamais utilisé...

Reply

Marsh Posté le 23-01-2005 à 23:18:20    

Code :
  1. void CMyView::OnDraw(CDC* dc)
  2. BOOL CHeatDiffusionView::OnEraseBkgnd(CDC *pDC)


 
CMyView/CHeatDiffusionView => c'est une faute de recopie ou bien ?

Reply

Marsh Posté le 23-01-2005 à 23:22:03    

Erreur de recopie !
Je cherche toujours le problème :(


Message édité par TigrouMeow le 23-01-2005 à 23:23:15
Reply

Marsh Posté le 23-01-2005 à 23:27:51    

on veut bien aider mais sans avoir plus de code, ca tient plus du tirage de cartes ou de la boule de cristal.

Reply

Marsh Posté le 23-01-2005 à 23:27:51   

Reply

Marsh Posté le 23-01-2005 à 23:35:09    

SquiZZ a écrit :

on veut bien aider mais sans avoir plus de code, ca tient plus du tirage de cartes ou de la boule de cristal.


 
Bon d'accord je balance du code alors :) Vous allez surement pas trouver ça très propre et très bien mais c'est la première fois que je fait des MFC... voilà le code.
 

Code :
  1. void CHeatDiffusionView::DrawCase(CDC *pDC, int x, int y, int pStyle, COLORREF color)
  2. {
  3. CPen *pOldPen;
  4. CBrush *pOldBrush;
  5. CPen colorPen(PS_SOLID, 0, color);
  6. CBrush colorBrush(color);
  7. pDoc = GetDocument();
  8. pOldBrush = pDC->SelectObject(&colorBrush);
  9. pOldPen = pDC->SelectObject(&colorPen);
  10. pDC->SetBkColor(color);
  11. x *= pDoc->_caseSize;
  12. y *= pDoc->_caseSize;
  13. switch (pStyle)
  14. {
  15. case P_WALL:
  16.  pDC->SelectObject(wallBrush);
  17.  break;
  18. case P_FIRE:
  19.  pDC->SelectObject(fireBrush);
  20.  break;
  21. case P_FRESH:
  22.  pDC->SelectObject(freshBrush);
  23.  break;
  24. }
  25. pDC->Rectangle(x - 1, y - 1, x + pDoc->_caseSize + 1, y + pDoc->_caseSize + 1);
  26. pDC->SelectObject(pOldPen);
  27. pDC->SelectObject(pOldBrush);
  28. }
  29. void CHeatDiffusionView::DrawCase(CDC *pDC, int x, int y, int pStyle)
  30. {
  31. CBrush *pOldBrush;
  32. CPen *pOldPen;
  33. pDoc = GetDocument();
  34. x *= pDoc->_caseSize;
  35. y *= pDoc->_caseSize;
  36. pDC->SetBkColor(RGB(200, 200, 200));
  37. pOldBrush = pDC->SelectObject(clearBrush);
  38. pOldPen = pDC->SelectObject(whitePen);
  39. switch (pStyle)
  40. {
  41. case P_WALL:
  42.  pDC->SelectObject(wallBrush);
  43.  break;
  44. case P_FIRE:
  45.  pDC->SelectObject(fireBrush);
  46.  break;
  47. case P_FRESH:
  48.  pDC->SelectObject(freshBrush);
  49.  break;
  50. }
  51. pDC->Rectangle(x, y, x + pDoc->_caseSize + 1, y + pDoc->_caseSize + 1);
  52. pDC->SelectObject(pOldBrush);
  53. pDC->SelectObject(pOldPen);
  54. }
  55. void CHeatDiffusionView::OnDraw(CDC* dc)
  56. {
  57. int  c, d;
  58. int  r, v, b;
  59. CFont *pOldFont;
  60. CMemDC pDC(dc, 0);
  61. pDoc = GetDocument();
  62. ASSERT_VALID(pDoc);
  63. if (!pDoc)
  64.  return;
  65. if (pDoc->_affTemp)
  66.  pOldFont = pDC.SelectObject(stdFont);
  67. for (c = 0; c < pDoc->_heatDiff.GetSizeX(); c++)
  68.  for (d = 0; d < pDoc->_heatDiff.GetSizeY(); d++)
  69.  {
  70.   if (pDoc->_modeAff == MA_SIMULATION && pDoc->_heatDiff.GetCaseColor(c, d, r, v, b) == true)
  71.   {
  72.    DrawCase(&pDC, c, d, pDoc->_heatDiff.GetCase(c, d), RGB(r, v, b));
  73.    if (pDoc->_affTemp)
  74.    {
  75.     CString str;
  76.     str.Format("%d", pDoc->_heatDiff.GetCaseTemp(c, d));
  77.     pDC->TextOut(c * pDoc->_caseSize, d * pDoc->_caseSize, str, str.GetLength());
  78.    }
  79.   }
  80.   else if (pDoc->_modeAff == MA_DESIGN)
  81.    DrawCase(&pDC, c, d, pDoc->_heatDiff.GetCase(c, d));
  82.  }
  83. if (pDoc->_affTemp)
  84.  pDC->SelectObject(pOldFont);
  85. }


 
Voilà, je pense que ça vous suffira à me dire "oh que c'est crade" (ou peut etre pas finalement ?..) et à trouver la solution ;)
 
Merci encore.

Reply

Marsh Posté le 23-01-2005 à 23:49:47    

je trouve ca plutot propre, manque un peu de commentaires si on veut être vraiment difficile.
 
tu peux mettre une trace ou un breakpoint dans ton OnEraseBackground pour être sûr que tu passes dedans et pas dans celui par défaut.
(on sait jamais, si ta MESSAGE_MAP avait foiré).

Reply

Marsh Posté le 23-01-2005 à 23:55:51    

Tu as mis le doigt dessus !
J'avais oublié de catcher l'erasebkgnd dans le message map ! Rhala et tant d'heures passées dessus... je te remercie beaucoup :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed