3

機能の使用

OnEraseBkgnd(CDC* pDC)

CDialog 派生クラスで、画面いっぱいに表示される背景画像を記述します。

次に、OnPaint 内に、1 回だけ実行される次のコードがあります (初めて 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 に答える