Я пытаюсь растянуть 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(). – 2010-11-24 15:43:05