Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Исчезает картинка после выхода из OnEraseBkgnd.

10K
06 ноября 2010 года
nuhop
50 / / 24.03.2007
Проблема в следующем. Есть диалог, на диалоге Tab Control. На одной из вкладок Tab Control необходимо вывести рисунок в определенном прямоугольнике. Для этого в классе вкладки объявляем объект класса по работе с битмапами, например, CDIBitmap m_bmpBackground. Загружаем рисунок из файла с помощью:

Код:
BOOL CDIBitmap :: Load( CFile* pFile ) {
    ASSERT( pFile );
    BOOL fReturn = TRUE;
    try {
        delete [] (BYTE*)m_pInfo;
        delete [] m_pPixels;
        m_pInfo = 0;
        m_pPixels = 0;
        DWORD       dwStart = pFile->GetPosition();
        //
        // Check to make sure we have a bitmap. The first two bytes must
        // be 'B' and 'M'.
        BITMAPFILEHEADER fileHeader;
        pFile->Read(&fileHeader, sizeof(fileHeader));
        if( fileHeader.bfType != 0x4D42 )
            throw TEXT("Error:Unexpected file type, not a DIB\n");

        BITMAPINFOHEADER infoHeader;
        pFile->Read( &infoHeader, sizeof(infoHeader) );
        if( infoHeader.biSize != sizeof(infoHeader) )
            throw TEXT("Error:OS2 PM BMP Format not supported\n");

        // Store the sizes of the DIB structures
        int cPaletteEntries = GetPalEntries( infoHeader );
        int cColorTable = 256 * sizeof(RGBQUAD);
        int cInfo = sizeof(BITMAPINFOHEADER) + cColorTable;
        int cPixels = fileHeader.bfSize - fileHeader.bfOffBits;
        //
        // Allocate space for a new bitmap info header, and copy
        // the info header that was loaded from the file. Read the
        // the file and store the results in the color table.
        m_pInfo = (BITMAPINFO*)new BYTE[cInfo];
        memcpy( m_pInfo, &infoHeader, sizeof(BITMAPINFOHEADER) );
        pFile->Read( ((BYTE*)m_pInfo) + sizeof(BITMAPINFOHEADER),
                     cColorTable );
        //
        // Allocate space for the pixel area, and load the pixel
        // info from the file.
        m_pPixels = new BYTE[cPixels];
        pFile->Seek(dwStart + fileHeader.bfOffBits, CFile::begin);
        pFile->Read( m_pPixels, cPixels );
        CreatePalette();
        m_bIsPadded = TRUE;
#ifdef _DEBUG
    } catch( TCHAR * psz ) {
        TRACE( psz );
#else
    } catch( TCHAR * ) {
#endif
        fReturn = FALSE;
    }
    return fReturn;
}


Вызываем Invalidate() и попадаем в OnEraseBkgnd, где выводим рисунок:

Код:
BOOL MyVkladkaClass::OnEraseBkgnd(CDC* pDC)
{
    if(m_bmpBackground.GetPixelPtr() != 0)
    {
        CRect rc;
        m_myWnd.GetWindowRect(rc);
        ScreenToClient( &rc );
        int x = 0, y = 0;

        // center the bitmap
        /*
        CDialog::OnEraseBkgnd(pDC);
        x = (rc.Width() - m_bmpBackground.GetWidth()) / 2;
        y = (rc.Height() - m_bmpBackground.GetHeight()) / 2;
        m_bmpBackground.DrawDIB(pDC, x, y);
        */

        // stretch
        m_bmpBackground.DrawDIB(pDC, rc.left, rc.top, rc.Width(), rc.Height());
    }
    else
        // no bitmap set. behave like a normal dialog
        return CDialog::OnEraseBkgnd(pDC);

    return true;
}


Где DrawDIB выглядит так:

Код:
// DrawDib uses StretchDIBits to display the bitmap.
void CDIBitmap :: DrawDIB( CDC* pDC, int x, int y, int width, int height ) {
    ASSERT( pDC );

    HDC     hdc = pDC->GetSafeHdc();

    if( m_pInfo )
        StretchDIBits( hdc,
                       x,
                       y+height,
                       width,
                       -height,
                       0,
                       0,
                       GetWidth(),
                       GetHeight(),
                       GetPixelPtr(),
                       GetHeaderPtr(),
                       DIB_RGB_COLORS,
                       SRCCOPY );
   
}


Загруженный рисунок в заданном районе отображается, но виден лишь до выхода из OnEraseBkgnd. Почему так? Если проделать то же самое с родительским окном, то рисунок отображается, как положено.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог