Maverick
Maverick

Reputation: 1187

MFC copy part of the screen into a CBitmap

Using the function

OnEraseBkgnd(CDC* pDC)

I write on the CDialog derived class, a background image that fills the screen.

Then inside the OnPaint I have the following code that is executed only once (for the 1st time OnPaint is called).

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

The above code, copies the m_InfoBarRect part of the screen in the memory CBitmap.

Intead of having the part of the background image, I only get a blank filled rectangle with correct dimensions.

Is there something wrong with my code ?

Upvotes: 3

Views: 1259

Answers (2)

IInspectable
IInspectable

Reputation: 51355

You are blitting from the wrong coordinate to the wrong coordinate. Your call should be

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

instead, i.e. blitting from the correct source position (m_InfoBarRect.left/m_InfoBarRect.top) to the destination's origion (0/0). This is assuming, that GetInfoBarRect() returns coordinates from the same coordinate system as your source DC.

Upvotes: 3

Ryan
Ryan

Reputation: 313

I think you might want:

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

Upvotes: 0

Related Questions