Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1434 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [GDI / MFC] Clipping !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[GDI / MFC] Clipping !

n°960232
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 23-01-2005 à 20:39:21  profilanswer
 

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 :)

mood
Publicité
Posté le 23-01-2005 à 20:39:21  profilanswer
 

n°960286
SquiZZ
Posté le 23-01-2005 à 21:54:35  profilanswer
 

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

n°960323
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 23-01-2005 à 22:32:00  profilanswer
 

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

n°960324
SquiZZ
Posté le 23-01-2005 à 22:35:34  profilanswer
 

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

n°960335
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 23-01-2005 à 22:51:20  profilanswer
 

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...

n°960345
Lam's
Profil: bas.
Posté le 23-01-2005 à 23:06:40  profilanswer
 

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 ?

n°960346
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 23-01-2005 à 23:15:47  profilanswer
 

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

n°960347
SquiZZ
Posté le 23-01-2005 à 23:18:20  profilanswer
 

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


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

n°960349
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 23-01-2005 à 23:22:03  profilanswer
 

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


Message édité par TigrouMeow le 23-01-2005 à 23:23:15
n°960352
SquiZZ
Posté le 23-01-2005 à 23:27:51  profilanswer
 

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

mood
Publicité
Posté le 23-01-2005 à 23:27:51  profilanswer
 

n°960355
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 23-01-2005 à 23:35:09  profilanswer
 

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.

n°960361
SquiZZ
Posté le 23-01-2005 à 23:49:47  profilanswer
 

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é).

n°960366
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 23-01-2005 à 23:55:51  profilanswer
 

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 :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [GDI / MFC] Clipping !

 

Sujets relatifs
[MFC] Pb avec la serialisation[MFC/SDI] Comment changer la className de la fenetre principale?
[MFC] Questions de débutant... (1 question résolue sur 2)[MFC/C++] Communication d'une appli a une autre
[MFC] OnMouseMove() ou souris suractive[MFC] Afficher Bitmap
problème d'inclusion des header MFCtemporisation MFC
[MFC] Pb de creation d'une ToolbarUne surface DirectDraw dans un controle MFC ?
Plus de sujets relatifs à : [GDI / MFC] Clipping !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR