私はHBITMAPをアルファでストレッチし、それを他のhdcに描画しようとしています。AlphaBlendが「false」を返す理由
私はStretchDIBitsを使用し、次にAlphaBlendを使用しています(下のコードを参照)。
問題は、AlphaBlendが失敗し、falseを返すことです。
1.何が原因なのか誰も知っていますか? 2.透明な画像を引き伸ばして描画する方が良い理由はありますか?
void AnimationManager::Draw(HDC hBBDC, Instance sInstance,RECT sClientRect)
{
// sClientRect is the hwnd rect
int nID = GetId(sInstance.nAnemationId);
int nFrameindex = sInstance.nFrameIndexs;
HDC hdcScreen = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC(hdcScreen);
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;
///******************* create PBITMAPINFO *********************///
GetObject(m_pAnimations[nID]->m_pFramesArray[nFrameindex]->hBmp, sizeof(bmp), &bmp);
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if(cClrBits == 1)
cClrBits = 1;
else if(cClrBits <= 4)
cClrBits = 4;
else if(cClrBits <= 8)
cClrBits = 8;
else if(cClrBits <= 24)
cClrBits = 24;
else cClrBits = 32;
if(cClrBits != 24)
pbmi = (PBITMAPINFO)LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<cClrBits));
else
pbmi = (PBITMAPINFO)LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if(cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1<<cClrBits);
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits + 31)& ~31)/8 * pbmi->bmiHeader.biHeight;
pbmi->bmiHeader.biClrImportant = 0;
///**************************end PBITMAPINFO creation *****************************************///
// I checked the code to this point and it seems to be fine. The problem stasrts here:
///create a pointer to the image bits
LPVOID lpvBits = (LPVOID)LocalAlloc(GPTR,pbmi->bmiHeader.biSizeImage);
GetBitmapBits(m_pAnimations[nID]->m_pFramesArray[nFrameindex]->hBmp, pbmi->bmiHeader.biSizeImage, lpvBits);
///stretch
bool test = StretchDIBits(hdcMem,0,sClientRect.bottom,sClientRect.right, -1*sClientRect.bottom,0,0,pbmi->bmiHeader.biWidth,pbmi->bmiHeader.biHeight, lpvBits,pbmi,DIB_RGB_COLORS, SRCCOPY);
///blend
test = AlphaBlend(hBBDC,0,0,sClientRect.right, sClientRect.bottom,hdcMem,0,0,sClientRect.right,sClientRect.bottom,m_sBlendfunc);
test = DeleteDC(hdcMem); // after CreateCompatibleDC
test = ReleaseDC(NULL, hdcScreen); // after GetDC
LocalFree(pbmi);
LocalFree(lpvBits);
}
Windowsがあなたに伝えるまで、あなたは知らないでしょう。 GetLastError()を使用します。 –
残念ながら、GetLastErrorは役に立たず、無効なパラメータを示すコード87を常に返します。 –
SelectObjectを呼び出す必要はありません。 SelectObjectを使用して互換性のあるDCにビットマップを選択する必要があると思います。私の答えのサンプルコードを参照してください。 –