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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°309437
muad-ib
Posté le 14-02-2003 à 15:16:11  profilanswer
 

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

mood
Publicité
Posté le 14-02-2003 à 15:16:11  profilanswer
 

n°311043
muad-ib
Posté le 17-02-2003 à 10:40:29  profilanswer
 

UP

n°311876
muad-ib
Posté le 18-02-2003 à 11:39:08  profilanswer
 

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.

n°311948
gatorette
Posté le 18-02-2003 à 13:00:16  profilanswer
 

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
n°313811
muad-ib
Posté le 20-02-2003 à 10:57:18  profilanswer
 

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

n°314158
gatorette
Posté le 20-02-2003 à 16:35:20  profilanswer
 

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

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

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

 

Sujets relatifs
URL dans une nouvelle fenêtre et HTML 4.01 strict[Win] Comment rafraichir la fenêtre?
impossiblilité de maximiser la fenetre[JS] savoir dans quel domaine on est ?
question gestion de fenetreInfos sur une autre fenêtre
Comment désactiver l'apparition d'une fenêtre dos sous WIndows ?Comment savoir si un control a le focus en VB6
(VBA et Access) Empecher l'affichage d'une fenetre d'importationVC++, MFC : zigouiller un repertoire non vide...
Plus de sujets relatifs à : [MFC] Comment savoir si une fenêtre MDI est partiellement visible ???


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