Как найти грязную область окна, когда WindowProc получает сообщение WM_PAINT ...? - PullRequest
0 голосов
/ 08 декабря 2010

У меня есть собственный API, написанный на C ++ (без MFC), реализованный поверх Win32 API.Мое приложение рисует все окно для каждого вызова WM_PAINT.Есть ли способ, которым я мог бы найти только грязную / неверную область, чтобы я мог оптимизировать свои функции рисования, чтобы рисовать только в представлениях, которые пересекаются с грязной областью.

Я пробовал следующий код между операторами BeginPaint - EndPaintи ужасно провалился.все окно было черным.Если я установлю флаг Optimize в 0, окно будет хорошо рисоваться, но рисование будет слишком медленным.Любые предложения ... ??.

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

1 Ответ

4 голосов
/ 08 декабря 2010

Вы пытались использовать rcPaint RECT из PAINTSTRUCT? Документы в GetClipRgn специально говорят, что не относятся к области отсечения, созданной BeginPaint, но только к тем, которые явно выбраны с помощью SelectClipRgn.

.
...