Stefan33 Temat założony przez niniejszego użytkownika |
[WinAPI, GDI, C++] Prosty problem z kopiowaniem bitmapy do bufora » 2012-12-26 20:51:55 Witam. Szukalem, kombinowalem, ale nie moge rozgryzc jak sie uporac z moim problemem. Mianowicie mam czerwona kulke na bialym tle zapisana jako bitmape. Gdy kopiuje ja za pomoca bitblt bezposrednio do okna to jest normalnie skopiowana w czerwonym kolorze, zas gdy kopiuje wpierw do bufora, a dopiero potem do okna to jest czarna.. Prosze o pomoc i z gory dziekuje za odpowiedzi. Kod: HBITMAP obj =( HBITMAP ) LoadImage( NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
HDC hdc = GetDC( hwnd );
RECT rcOkno; GetClientRect( hwnd, & rcOkno );
BITMAP bmObj; GetObject( obj, sizeof( bmObj ), & bmObj );
HDC hdcTemp = CreateCompatibleDC( hdc ); HDC hdcBuf = CreateCompatibleDC( hdc );
HBITMAP hbmBuf = CreateCompatibleBitmap( hdcBuf, rcOkno.right, rcOkno.bottom ); HBITMAP hbmOldBuf =( HBITMAP ) SelectObject( hdcBuf, hbmBuf ); HBITMAP hbmOld =( HBITMAP ) SelectObject( hdcTemp, obj );
FillRect( hdcBuf, & rcOkno,( HBRUSH ) GetStockObject( WHITE_BRUSH ) ); BitBlt( hdcBuf, x, y, bmObj.bmWidth, bmObj.bmHeight, hdcTemp, 0, 0, SRCCOPY );
BitBlt( hdc, 0, 0, rcOkno.right, rcOkno.bottom, hdcBuf, 0, 0, SRCCOPY );
|
|
DejaVu |
» 2012-12-26 22:44:33 Pamiętam, że za każdym razem kiedy walczyłem z buforowaniem GDI rozchodziło się o to, że bufor był źle tworzony przez co uzyskiwało się efekt czarnego ekranu. /edit: Istotniejsze funkcje z mojego liba, którego kiedyś pisałem i są związane z podwójnym buforowaniem: bool CWindowBase::setDoubleBuffering( bool bEnable ) { if( !m_hWnd ) return false; if( !m_hBuffer && !bEnable ) return true; if( m_hBuffer && bEnable ) return true; if( bEnable ) { HDC hdc = getDC(); m_hBuffer =::CreateCompatibleDC( hdc ); if( !m_hBuffer ) return false; CRect rect; if( !getClientRect( rect ) ) { ::DeleteDC( m_hBuffer ); m_hBuffer = NULL; releaseDC( hdc ); return false; } m_hBufferMem =::CreateCompatibleBitmap( hdc, rect.getWidth(), rect.getHeight() ); if( !m_hBufferMem ) { ::DeleteDC( m_hBuffer ); m_hBuffer = NULL; releaseDC( hdc ); return false; } m_hBufferMemOld = reinterpret_cast < HBITMAP >(::SelectObject( m_hBuffer, m_hBufferMem ) ); MYASSERT( m_hBufferMemOld ? true: false, "OMG..." ); releaseDC( hdc ); return true; } else { ::SelectObject( m_hBuffer, m_hBufferMemOld ); ::DeleteObject( m_hBufferMem ); ::DeleteDC( m_hBuffer ); m_hBuffer = NULL; m_hBufferMem = NULL; m_hBufferMemOld = NULL; } return false; }
bool CWindowBase::repaintBuffer() { PAINTSTRUCT ps; HDC hdc = beginPaint( & ps ); if( !hdc ) return false; CRect rect; rect = ps.rcPaint; ::BitBlt( hdc, rect.left, rect.top, rect.getWidth(), rect.getHeight(), m_hBuffer, rect.left, rect.top, SRCCOPY ); endPaint( & ps ); return true; }
HDC CWindowBase::getDC() const { if( m_hBuffer ) return m_hBuffer; return::GetDC( m_hWnd ); }
void CWindowBase::releaseDC( HDC hdc ) const { if( m_hBuffer ) return; ::ReleaseDC( m_hWnd, hdc ); }
Przeanalizuj go i powyciągaj z niego co ważniejsze, a potem napisz jakieś skrócone rozwiązanie dla potomnych jak już Ci zadziała. |
|
Stefan33 Temat założony przez niniejszego użytkownika |
» 2012-12-27 00:02:23 Dziekuje za pomoc! Faktycznie spojrzalem na tworzenie bufora i okazuje sie, że HDC hdc = GetDC( hwnd ); HDC hdcBuf = CreateCompatibleDC( hdc );
wcale takie kompatybilne nie jest.. jak dla mnie to sensu nie ma, no ale najwazniejsze, ze tworzac kompatybilna bitmape korzystajac z docelowego hdc dziala poprawnie. tj gdyby ktos mial jeszcze taki problem: HBITMAP hbmBuf = CreateCompatibleBitmap( hdcBuf, hwndX, hwndY ); HBITMAP hbmBuf = CreateCompatibleBitmap( hdc, hwndX, hwndY );
|
|
« 1 » |