gatorette | 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 :
- void CTestMDIView::OnDraw(CDC* pDC)
- {
- CTestMDIDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- // chargement du bitmap et récupération des infos (pour la taille dans le StretchBlt)
- CBitmap bmpMem;
- bmpMem.LoadBitmap( IDB_TESTBMP );
- BITMAP bmpInfo;
- bmpMem.GetBitmap( &bmpInfo );
- // Initialisation du DC en mémoire
- CDC dcMem;
- dcMem.CreateCompatibleDC( pDC );
- dcMem.SelectObject( &bmpMem );
- // Récupération du rectangle de clip et affichage des informations
- CRect rcClip;
- pDC->GetClipBox( &rcClip );
- TRACE( _T("Clipping %s to: %d,%d - %d,%d\n" ), pDoc->GetTitle(), rcClip.left, rcClip.top, rcClip.right, rcClip.bottom );
- // Récupération du vrai rectangle de la fenêtre
- CRect rcClient;
- this->GetClientRect( &rcClient );
- // Mise en place du mode Stretch précis (pour ralentir encore)
- pDC->SetStretchBltMode(HALFTONE);
- {
- // CMeasureDuration est une classe qui affiche (en debug) son temps d'existence (entre le constructeur et le destructeur).
- // Elle utilise QueryPerformanceCounter pour avoir une info assez précise.
- CString str;
- str += _T("Draw3dRect in " ) + pDoc->GetTitle();
- CMeasureDuration mes( str );
- // enfin le StretchBlt que l'on va mesurer
- pDC->StretchBlt( rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY );
- }
- // on efface tout
- dcMem.DeleteDC();
- bmpMem.DeleteObject();
- }
|
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
|