[WinAPI] Buforowanie z pomocą BitBlt.
Ostatnio zmodyfikowano 2011-12-07 09:04
blojayble Temat założony przez niniejszego użytkownika |
[WinAPI] Buforowanie z pomocą BitBlt. » 2011-12-06 18:33:20 Witam. Ostatnio wziąłem się za robienie edytora map w WinAPI. Nie miałem większych problemów, ale prędzej czy później musiałem wziąć się za podwójne buforowanie. Wspomogłem się kodem z kursu. Niestety, moja bitmapa nie kopiuje się na bufor, który generalnie działa poprawnie. Po prostu jej nie widać. Po zmianie ostatniego parametru BitBlt na SRCAND, pojawiają się migające czarne kwadraciki, ale w żaden sposób mnie to nie usatysfakcjonowało. Podaję kod rysowania: void cField::DrawField() { hdcWin = GetDC( g_hwnd ); hbmGfx =( HBITMAP ) LoadImage( NULL, lbmAdress, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); hdcNew = CreateCompatibleDC( hdcWin ); hbmOld =( HBITMAP ) SelectObject( hdcNew, hbmGfx ); bmBitmap; GetObject( hbmGfx, sizeof( BITMAP ), & bmBitmap ); FillRect( hdcBuf, & rcWin,( HBRUSH ) GetStockObject( LTGRAY_BRUSH ) ); SelectObject( hdcWin, hbmGfx ); BitBlt( hdcBuf, iposx * 60, iposy * 60, bmBitmap.bmWidth, bmBitmap.bmHeight, hdcNew, 0, 0, SRCCOPY ); BitBlt( hdcWin, 0, 0, rcWin.right, rcWin.bottom, hdcBuf, 0, 0, SRCCOPY ); ReleaseDC( g_hwnd, hdcWin ); } (Wiem, że ten kod nie ma większego sensu, jest nieoptymalny, zdaję sobie z tego sprawę. Jest taki w ramach testów ^^) Czy błąd leży gdzieś tutaj, czy może gdzie indziej zawiniłem? Pobawię się w mikołaja i dam wam jeszcze kawałek kodu z main.cpp, w którym inicjuję bufor: hdcBuf = CreateCompatibleDC( hdcWin ); hbmBuf = CreateCompatibleBitmap( hdcBuf, rcWin.right, rcWin.bottom ); hbmOldBuf =( HBITMAP ) SelectObject( hdcBuf, hbmBuf ); Dziękuję za odpowiedzi i pozdrawiam. |
|
DejaVu |
» 2011-12-07 09:04:20 Musisz bodajże zmienić zachowanie WM_PAINT-a. Jeżeli tego nie zrobisz to nic Ci nie da rysowanie najpierw na buforze, a potem na kontrolce bo przy jakimkolwiek odświeżeniu przyjdzie komunikat WM_PAINT, który przerysuje wszystko wg domyślnego zachowania. |
|
« 1 » |