[MFC] Problème de rafraichissement d'une CView et CWinApp:OnIdle

Problème de rafraichissement d'une CView et CWinApp:OnIdle [MFC] - Programmation

Marsh Posté le 16-10-2001 à 14:51:37    

Voila, je suis en train d'ajouter une fenetre avec du Direct3D dans une appli générée précedemment par l'appwizard de VC++ 6.0
 

Code :
  1. // L'affichage est géré comme suit dans le OnDraw
  2. void CMyView:: OnDraw(CDC* pDC) {
  3.     Render();   // Render() est une méthode de CMyView
  4. }
  5. // Puis j'ai overridé le OnIdle de CWinApp pour rafraichir la vue :
  6. BOOL CMyApp:: OnIdle() {
  7.    ((CMyView*) m_pMainWnd)->RedrawWindow(NULL,NULL,RDW_INVALIDATE); // ça ça marche nickel
  8.    ((CMyView*) m_pMainWnd)->Render(); // ça ça marche pô : pourquoi ?????
  9.    return TRUE;
  10. }


 
Y a ptêtre des erreurs de recopie mais la question que je pose, c'est pourquoi ça foire en appelant directement Render sans passer par le OnDraw. Il n'y a aucune raison tangible. Je comprends rien. Dans ce cas là, la vue ne se met à jour que lors d'un resize.
 
Indice supplémentaire : Render() n'utilise à aucun moment un CDC* ou un CWnd*. Render() effectue des appels Direct3D très basiques.
 
J'ai pas envie de réécrire toute mon appli sans MFC pour juste ajouter un peu de direct3D.
 
Merci par avance.
 
PS :  
Youdontcare, tes conseils dans mon précédent topic m'ont été très utiles. La doc PLanetSide est très instructive.


---------------
Pipiru piru piru pipiru pi
Reply

Marsh Posté le 16-10-2001 à 14:51:37   

Reply

Marsh Posté le 16-10-2001 à 17:32:48    

Je ne vois pas pquoi ça plante (si m_pMainWnd est bien le bon CMyView ya pas de raison)..
 
T´as essayé:

Code :
  1. BOOL CMyApp:: OnIdle() {
  2.   ((CMyView*) m_pMainWnd)->Invalidate()
  3.   return TRUE;
  4. }


pour qu´il aille ds OnDraw?? :)


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le 16-10-2001 à 18:51:34    

le invalidate() est pour le painting win32 ... y'a quoi exactement dans render() ?

Reply

Marsh Posté le 17-10-2001 à 11:46:19    

La méthode RedrawWindow lance des evenements dans tous les sens (WM_PAINT, WM_NCPAINT etc...) , ce qui n'est pas optimisé du tout car le rendu 3D est très ralenti par les fonctions GDI.
 
Render est une méthode perso ajouté dans CView qui contient le rendu de la scène 3D. Ce que je ne comprends pas, c'est pourquoi en appelant ma méthode Render directement dans OnIdle, l'affichage ne se se met à jour.  
 
Avec RedrawWindow, ça marche mais c'est lent & ça clignote (effacage du background).
 
Voila pour les précisions.


---------------
Pipiru piru piru pipiru pi
Reply

Sujets relatifs:

Leave a Replay

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