質問

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

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で選択されたデフォルトのビットマップは1x1 1BPPビットマップです - したがって、作成した互換性のあるビットマップはそれと一致します。これはすべて黒い出力につながる傾向があります。

hsrcであなたのカラービットマップがあるので、使用してください それ 新しいビットマップを作成するDC。

他のヒント

私を助けてくれてありがとう。機能は今完全に機能します。

bool Bitmap::Crop(RECT cropArea)
{
HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(hSrc);
HBITMAP hBmp = CreateCompatibleBitmap(hSrc, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

bool retVal = (BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY))?true:false;

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;

return retVal;
}

2つの小さな変更:

HBITMAP hBmp = CreateCompatibleBitmap(hNew, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 

BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY); 

リクエストされたエリアが元のビットマップのサイズ内にあることを確認するために、もう少しチェックする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top