BitBlt仅在某些条件下复制部分数据

时间:2012-07-17 10:17:09

标签: c++ winapi gdi bitblt

这是一个奇怪的问题,我已经阅读了BitBlt函数的文档,它在大多数情况下都没有任何问题,但是如果我尝试从中复制数据,则开始失败(只复制部分甚至没有复制)偏移量大于目标大小的源矩形...奇怪?这里有几个样本:

这是我使用的代码,结果取决于我传递的参数。 位图的宽度为m_iTileAreaWidth + 2 * m_iTileAreaMargin,高度为m_iTileAreaHeight + 2 * m_iTileAreaMargin

BOOL bBltOk = ::BitBlt(_hdcDest, 0, 0, m_iTileAreaWidth, m_iTileAreaHeight,
                       hdcSource, m_iTileAreaMargin, m_iTileAreaMargin, SRCCOPY);

如果m_iTileAreaMargin 600 m_iTileAreaWidthm_iTileAreaHeight 200 ,则 130px 源区域已复制

如果m_iTileAreaMargin 500 m_iTileAreaWidthm_iTileAreaHeight 200 ,则完整来源被复制

如果m_iTileAreaMargin 800 m_iTileAreaWidthm_iTileAreaHeight 200 ,则来源区域被复制

嗯,我确定整个区域都已生成 - 当我使用此代码时:

bBltOk = ::BitBlt(_hdcDest, 0, 0, rcScreen.Widht(), rcScreen.Height(),
                  _hdcSource, 0, 0,SRCCOPY);

然后我看到整个区域生成了

有没有人知道为什么我这么简单的功能会出现这样的问题?

1 个答案:

答案 0 :(得分:0)

问题解决了 - 但仍有一些谜团。问题是源位图(或hdc,无法访问某些内部)未配置为保存所有必需的数据(大小太小)。

谜是我能够复制整个区域并获得有效数据,但是当试图仅复制某些部分(甚至已经在整个区域中的部分)时,我得到了空数据。