2010-12-08 61 views
0

J'ai une API inhouse écrite en C++ (pas MFC), implémentée en plus de l'API win32. Mon application dessine toute la fenêtre pour chaque appel WM_PAINT. Y a-t-il un moyen de trouver uniquement la région sale/invalide afin que je puisse optimiser mes fonctions de dessin pour dessiner seulement dans les vues qui se croisent avec la région sale.Comment trouver la région sale de la fenêtre lorsque WindowProc reçoit un message WM_PAINT ...?

J'ai essayé le code suivant entre les instructions BeginPaint - EndPaint et j'ai échoué horriblement. toute la fenêtre était noire. Si je mets le drapeau d'optimisation à 0, la fenêtre dessine bien mais le dessin est trop lent. Aucune suggestion...??.

#if Optimize 
// get the inval region and pass it down 
    HRGN invalRegion = CreateRectRgn(0,0,0,0); 
    int retVal = ::GetClipRgn(myHDC,invalRegion); 
    Assert (retVal != -1); 
    if(retVal == 0)   
     return;  // nothing to draw. 
    else if(retVal == 1)   
     Draw(invalRegion); // a valid dirty region handle. 
    else 
#endif 
     Draw(NULL); // this results in drawing calls to all views in the window. 

Répondre

4

Avez-vous essayé d'utiliser la rcPaint RECT du PAINTSTRUCT? Le docs de GetClipRgn indique spécifiquement qu'il fait pas se réfèrent à la région de découpage créée par BeginPaint, mais seulement ceux explicitement sélectionnés dans via SelectClipRgn.