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);