MFC скопировать часть экрана в CBitmap

Используя функцию

OnEraseBkgnd(CDC* pDC)

Я пишу на производном от CDialog классе, фоновом изображении, которое заполняет экран.

Затем внутри OnPaint у меня есть следующий код, который выполняется только один раз (в первый раз вызывается OnPaint).

    GetInfoBarRect(&m_InfoBarRect);
    m_InfoBarBGBitmap.CreateCompatibleBitmap(&dc, m_InfoBarRect.Width(), m_InfoBarRect.Height() );

    bdc.CreateCompatibleDC(&dc);    
    pOldBitmap = bdc.SelectObject(&m_InfoBarBGBitmap);

    bdc.BitBlt (m_InfoBarRect.left, m_InfoBarRect.top, m_InfoBarRect.Width(),m_InfoBarRect.Height(), &dc, 0, 0, SRCCOPY);



    CImage image;
    image.Attach(m_InfoBarBGBitmap);
    image.Save(_T("C:\\test.bmp"), Gdiplus::ImageFormatBMP);

    bdc.SelectObject(pOldBitmap);   
    bdc.DeleteDC();

Приведенный выше код копирует часть экрана m_InfoBarRect в CBitmap памяти.

Вместо части фона я получаю только пустой прямоугольник с правильными размерами.

Что-то не так с моим кодом?

2 ответа

Решение

Вы бьете от неправильной координаты к неправильной координате. Ваш звонок должен быть

bdc.BitBlt( 0, 0, m_InfoBarRect.Width(), m_InfoBarRect.Height(), &dc,
            m_InfoBarRect.left, m_InfoBarRect.top, SRCCOPY);

вместо этого, т. е. блин с правильной исходной позиции (m_InfoBarRect.left/m_InfoBarRect.top) к месту назначения (0/0). Это предполагает, что GetInfoBarRect() возвращает координаты из той же системы координат, что и ваш исходный DC.

Я думаю, вы можете захотеть:

bdc.CreateCompatibleDC(&dc);    
pOldBitmap = bdc.SelectObject(&m_InfoBarBGBitmap);

dc.BitBlt (m_InfoBarRect.left, m_InfoBarRect.top, m_InfoBarRect.Width(),m_InfoBarRect.Height(), &bdc, 0, 0, SRCCOPY);
Другие вопросы по тегам