BitBlt仅在特定条件下复制部分数据

BitBlt copies only part of data in certain conditions

本文关键字:复制部 数据 条件下 BitBlt      更新时间:2023-10-16

这是一个奇怪的问题,我已经阅读了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_iTileAreaMargin600并且m_iTileAreaWidthm_iTileAreaHeight都是200,则复制源区域的130px

如果m_iTileAreaMargin500并且m_iTileAreaWidthm_iTileAreaHeight都是200,则复制完整

如果m_iTileAreaMargin800并且m_iTileAreaWidthm_iTileAreaHeight都是200,则none源区域被复制

好吧,我确信整个区域都生成了——当我使用这个代码时:

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

然后我看到整个区域生成

有人知道为什么我在这么简单的功能上会遇到这样的问题吗?

问题已解决,但仍存在一些错误。问题是源位图(或hdc,无法访问某些内部)没有配置为保存所有所需的数据(大小太小)。

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