(GDI)
Może zacznę od kodu:
KOD1:
HDC hdcBufor;
HBITMAP hbmBuf, hbmOldBuf;
PAINTSTRUCT ps;
HDC hDC = NULL;
hDC = BeginPaint( m_hWnd, &ps );
hdcBufor = CreateCompatibleDC( hDC );
hbmBuf = CreateCompatibleBitmap( hDC, ps.rcPaint.right, ps.rcPaint.bottom );
hbmOldBuf = ( HBITMAP ) SelectObject( hdcBufor, hbmBuf );
RECT rc = ps.rcPaint;
FillRect(hdcBufor, &rc, ( HBRUSH ) GetStockObject( WHITE_BRUSH ) );
ObiektGraficzny item;
item.draw( m_hWnd, hdcBufor );
BitBlt ( hDC, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom, hdcBufor, 0, 0, SRCCOPY );
SelectObject( hdcBufor, hbmOldBuf );
ReleaseDC( m_hWnd, hdcBufor );
DeleteObject( hdcBufor );
DeleteObject( hbmBuf );
EndPaint( m_hWnd, &ps );
ReleaseDC( m_hWnd, hDC );
KOD2 metoda ObiektGraficzny::draw(HWND hWnd, HDC hDC):
if ( m_bitmap != NULL )
{
HDC hDCBitmap = CreateCompatibleDC( hDC );
HBITMAP hbmOld = (HBITMAP)SelectObject( hDCBitmap, m_bitmap );
HDC tmp = GetDC( hWnd );
BitBlt( tmp, 50, 50, m_infoBitmap.bmWidth, m_infoBitmap.bmHeight, hDCBitmap, 0, 0, SRCCOPY );
ReleaseDC( hWnd, tmp );
SelectObject( hDCBitmap, hbmOld );
DeleteDC( hDCBitmap );
}
Rectangle( hDC, 10,10,100,100);
KOD3 w konsturktorze ObiektGraficzny:
m_bitmap = (HBITMAP)LoadImage( NULL, L"obrazek.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
GetObject( m_bitmap, sizeof(m_infoBitmap), &m_infoBitmap );
Teraz tak, KOD1 jest uruchamiany na zdarzenie WM_PAINT. Wszystko mi ładnie rysuje jak rysuje na hdcBufor, nawet prostokąt w metodzie draw. Jednak rysunek m_bitmap pojawia się na ułamek sekundy i znika przy ruszaniu myszki. (mam odświerzanie na zdarzeniu WM_MOUSEMOVE) jaka jest tego przyczyna? Dla jasności chciałbym aby ten obrazek byl narysowany i nie znikał ; ]. Tak jak Prostokąt.
-- rozwiązałem problem :D
błąd był w dwóch miejscach metody draw:
if ( m_bitmap != NULL )
{
HDC hDCBitmap = CreateCompatibleDC( hDC );
HBITMAP hbmOld = (HBITMAP)SelectObject( hDCBitmap, m_bitmap );
// HDC tmp = GetDC( hWnd ); <-- to niepotrzebne bo nie rysujemy na kontekscie okna tylko tego co przekazujemy w hDC
BitBlt( /* tmp <-- nie do tego kontekstu */ hDC, 50, 50, m_infoBitmap.bmWidth, m_infoBitmap.bmHeight, hDCBitmap, 0, 0, SRCCOPY );
//ReleaseDC( hWnd, tmp ); <-- nie uzywamy tmp
SelectObject( hDCBitmap, hbmOld );
DeleteDC( hDCBitmap );
}
/*Rectangle( hDC, 10,10,100,100); <-- to przesłaniało hehe zapomnialem ustawic przezroczystego pędzla */