3

使用功能

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 中。

除了拥有背景图像的一部分,我只得到一个具有正确尺寸的空白填充矩形。

我的代码有问题吗?

4

2 回答 2

3

您正在从错误的坐标转移到错误的坐标。你的电话应该是

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 相同的坐标系返回坐标。

于 2016-06-03T20:01:22.210 回答
0

我想你可能想要:

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);
于 2016-06-03T19:27:55.367 回答