[MFC] Comment savoir si une fenêtre MDI est partiellement visible ???

Comment savoir si une fenêtre MDI est partiellement visible ??? [MFC] - C++ - Programmation

Marsh Posté le 14-02-2003 à 15:16:11    

Salut,
 
J'ai fais une petit outil MFC en utilisant les MDI et j'aimerais savoir s'il est possible d'avoir la liste de toutes les vues qui sont partiellement visibles (recouvert à moitier par une autre fenêtre)
 
Merci

Reply

Marsh Posté le 14-02-2003 à 15:16:11   

Reply

Marsh Posté le 17-02-2003 à 10:40:29    

UP

Reply

Marsh Posté le 18-02-2003 à 11:39:08    

Bon, je vois que le sujet n'intérresse personne ?
 
Pour simplifier, une application MDI est une application qui permet d'ouvrir plusieurs documents en même temps.
 
Le problème de mon application, c'est qu'elle est très gourmande en ressource et que plusieurs fenêtre sont affichées en même temps (environs 50-70), certaines sont visibles, d'autres non (soit parce qu'elles sont réduites, soit parce qu'elles sont cachées par d'autres fenêtres).
 
Actuellement, j'essai d'optimiser cette application en ne raffraîchissant que les vues qui sont visibles mais je ne sais pas comment faire et je n'ai rien trouvé dans la doc des MFC.
 
Petite remarque :
Je sais par contre que la méthode IsIconic() permet de savoir si la fenêtre est réduite et IsZoomed() permet de savoir si elle est agrandie.
Dans le cas où une fenêtre est agrandie, la question ne se pose pas, c'est la seul à raffraîchir.

Reply

Marsh Posté le 18-02-2003 à 13:00:16    

Tu dois continuer à rafraîchir toutes les vues, mais par contre peut-être modifier le OnDraw de toutes tes vues. En effet, le CDC qui est passé en paramètre définit une région de clip qui correspond à la surface visible de ta vue.
 
Par contre, il semble que les fonctions de CDC prennent déjà en compte cette surface de clip. J'ai fait un petit test pour le voir :

Code :
  1. void CTestMDIView::OnDraw(CDC* pDC)
  2. {
  3. CTestMDIDoc* pDoc = GetDocument();
  4. ASSERT_VALID(pDoc);
  5. // chargement du bitmap et récupération des infos (pour la taille dans le StretchBlt)
  6. CBitmap bmpMem;
  7. bmpMem.LoadBitmap( IDB_TESTBMP );
  8. BITMAP bmpInfo;
  9. bmpMem.GetBitmap( &bmpInfo );
  10. // Initialisation du DC en mémoire
  11. CDC dcMem;
  12. dcMem.CreateCompatibleDC( pDC );
  13. dcMem.SelectObject( &bmpMem );
  14. // Récupération du rectangle de clip et affichage des informations
  15. CRect rcClip;
  16. pDC->GetClipBox( &rcClip );
  17. TRACE( _T("Clipping %s to: %d,%d - %d,%d\n" ), pDoc->GetTitle(), rcClip.left, rcClip.top, rcClip.right, rcClip.bottom );
  18. // Récupération du vrai rectangle de la fenêtre
  19. CRect rcClient;
  20. this->GetClientRect( &rcClient );
  21. // Mise en place du mode Stretch précis (pour ralentir encore)
  22. pDC->SetStretchBltMode(HALFTONE);
  23. {
  24. // CMeasureDuration est une classe qui affiche (en debug) son temps d'existence (entre le constructeur et le destructeur).
  25. // Elle utilise QueryPerformanceCounter pour avoir une info assez précise.
  26. CString str;
  27. str += _T("Draw3dRect in " ) + pDoc->GetTitle();
  28. CMeasureDuration mes( str );
  29. // enfin le StretchBlt que l'on va mesurer
  30. pDC->StretchBlt( rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY );
  31. }
  32. // on efface tout
  33. dcMem.DeleteDC();
  34. bmpMem.DeleteObject();
  35. }


 
Donc j'ai créé deux fenêtres MDI et j'ai obtenu ça dans mon Output de VC++ :


[b]les deux fenêtres sont visibles :[/b]
Clipping TestMD2 to: 0,0 - 934,496
Duration of Draw3dRect in TestMD2 = 38.481978 ms
Clipping TestMD1 to: 0,0 - 934,496
Duration of Draw3dRect in TestMD1 = 34.238894 ms
 
[b]la fenêtre TestMD1 est complètement cachée par l'autre :[/b]
Duration of Draw3dRect in TestMD2 = 33.425817 ms
Clipping TestMD1 to: 0,0 - 0,0
Duration of Draw3dRect in TestMD1 = 0.032691 ms
 
[b]la fenêtre TestMD1 est partiellement cachée par l'autre :[/b]
Clipping TestMD2 to: 0,0 - 934,496
Duration of Draw3dRect in TestMD2 = 39.352892 ms
Clipping TestMD1 to: 0,0 - 934,496
Duration of Draw3dRect in TestMD1 = 21.260687 ms


 
Donc, il semble que au moins pour le StretchBlt, la surface de clip soit prise en compte. Apparemment les autres fonctions ont l'air de la prendre en compte aussi, mais il faudrait faire des tests plus poussés (certaines semblaient ne prendre en compte que le rectangle entourant la région).
 
Après, c'est à toi de voir comment cela s'applique à ton programme.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 20-02-2003 à 10:57:18    

Merci pour ton aide, mais ça ne marche pas chez moi  :(  
 
Je suis en train de faire un algo qui permet de trouver tous les espaces visibles (liste de rectangles) d'une fenêtre et ce n'est pas donné ...
 

Reply

Marsh Posté le 20-02-2003 à 16:35:20    

Il serait intéressant de savoir sous quel OS tu est et quelle sont les fonctions que tu utilises dans ton OnDraw.
Dans mes tests, j'étais sous Windows 2000 et j'ai essentiellement utilisé la fonction StretchBlt.


---------------
each day I don't die is cheating
Reply

Sujets relatifs:

Leave a Replay

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