gpt4 book ai didi

c - AlphaBlend 返回 'false' 的原因可能是什么

转载 作者:太空狗 更新时间:2023-10-29 15:42:22 24 4
gpt4 key购买 nike

我正在尝试使用 alpha 拉伸(stretch) HBITMAP 并将其绘制到花药 hdc。

我正在使用 StretchDIBits,然后使用 AlphaBlend,如下面的代码所示。

问题是 AlphaBlend 失败并返回 false。
1. 有谁知道可能是什么原因吗?2. 为什么要拉伸(stretch)绘制透明图像有更好的办法吗?

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);
}

最佳答案

如果 AlphaBlend 也可以拉伸(stretch),为什么还要使用 StretchDIBits

关于c - AlphaBlend 返回 'false' 的原因可能是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4267784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com