Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] Buforowanie z pomocą BitBlt.

Ostatnio zmodyfikowano 2011-12-07 09:04
Autor Wiadomość
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:

C/C++
void cField::DrawField()
{
    hdcWin = GetDC( g_hwnd );
    // wczytujemy bitmapę
    hbmGfx =( HBITMAP ) LoadImage( NULL, lbmAdress, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
   
    // tworzymy dla niej kontekst pamięciowy i wiążemy ją z nim
    hdcNew = CreateCompatibleDC( hdcWin );
   
    hbmOld =( HBITMAP ) SelectObject( hdcNew, hbmGfx );
    // pobieramy wymiary bitmapy (potrzebne do jej skopiowania);
    // będą one zawarte w polach bmWidth i bmHeight poniższej struktury
    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, iposx*60, iposy*60, bmBitmap.bmWidth, bmBitmap.bmHeight, hdcNew, 0, 0, SRCCOPY); to działa dobrze
   
    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:

C/C++
hdcBuf = CreateCompatibleDC( hdcWin );
hbmBuf = CreateCompatibleBitmap( hdcBuf, rcWin.right, rcWin.bottom );
hbmOldBuf =( HBITMAP ) SelectObject( hdcBuf, hbmBuf );

Dziękuję za odpowiedzi i pozdrawiam.
P-45234
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.
P-45253
« 1 »
  Strona 1 z 1