c-クロップ関数BitBlt(…)

既存のエンジンでトリミング機能を作成したい。これは私がすでに持っているものです:

bool Bitmap::Crop(RECT cropArea)
{
BITMAP bm;
GetObject(m_Handle, sizeof(bm), &bm);

HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(NULL);
HBITMAP hBmp = CreateCompatibleBitmap(hNew, bm.bmWidth, bm.bmHeight);
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

BitBlt(hNew, 0, 0, bm.bmWidth, bm.bmHeight, hSrc, 0, 0, SRCCOPY);

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;
}

イメージ全体を新しいHBITMAPにコピーし、古いイメージをそれと置き換えるだけです。だから私はそれが機能することを知っています。その後は、BitBltパラメーターで遊んでいます。

m_Handleは、ビットマップクラスのHBITMAPです。

このコードの結果は、ただの黒い画面です。

ベストアンサー
「新鮮な」メモリDCから互換性のあるビットマップを作成しないでください。
1bppビットマップを作成する場合を除き、新しいメモリDCで選択されるデフォルトのビットマップは1×1 1bppビットマップです。したがって、作成する互換ビットマップはすべて一致します。
その結果、すべての黒が出力される傾向があります。

hSrcにカラービットマップが入っているので、そのdcを使用して新しいビットマップを作成します。

転載記事の出典を記入してください: c-クロップ関数BitBlt(…) - コードログ