0

これは奇妙な問題です。私は 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_iTileAreaMargin600m_iTileAreaWidthm_iTileAreaHeightが両方とも200の場合、ソース領域の130pxがコピーされます

m_iTileAreaMargin500m_iTileAreaWidthm_iTileAreaHeightが両方とも200 の場合、完全なソースがコピーされます

m_iTileAreaMargin800m_iTileAreaWidthm_iTileAreaHeightが両方とも200 の場合、ソース領域はコピーされません

このコードを使用すると、領域全体が生成されると確信しています。

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

次に、生成された領域全体が表示されます

このような単純な機能でなぜこのような問題が発生するのか、誰にも分かりますか?

4

1 に答える 1

0

問題は解決しましたが、まだ謎が残っています。問題は、ソース ビットマップ (または hdc、一部の内部にアクセスできない) が、必要なすべてのデータを保持するように構成されていない (サイズが小さすぎる) ことでした。

ミステリーは、領域全体をコピーして有効なデータを取得できたのですが、一部の部分 (既に領域全体にあるものでも) のみをコピーしようとすると、空のデータが得られたことです。

于 2012-07-17T15:22:37.440 に答える