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

[WinAPI, GDI, C++] Prosty problem z kopiowaniem bitmapy do bufora

Ostatnio zmodyfikowano 2012-12-27 00:02
Autor Wiadomość
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:

C/C++
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 );
P-72037
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:
C/C++
//virtual
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;
        } //if
        m_hBufferMem =::CreateCompatibleBitmap( hdc, rect.getWidth(), rect.getHeight() );
        if( !m_hBufferMem )
        {
            ::DeleteDC( m_hBuffer );
            m_hBuffer = NULL;
            releaseDC( hdc );
            return false;
        } //if
        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;
    } //else
    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.
P-72047
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
C/C++
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:
C/C++
HBITMAP hbmBuf = CreateCompatibleBitmap( hdcBuf, hwndX, hwndY ); //niekolorowe
HBITMAP hbmBuf = CreateCompatibleBitmap( hdc, hwndX, hwndY ); //poprawne
P-72049
« 1 »
  Strona 1 z 1