![]() |
#12 |
Участник
|
Решил использовать вместо функции StretchBlt функцию AlphaBlend
X++: boolean AlphaBlend(int hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, int hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, int percent) { DLL _dll = new DLL("msimg32.dll"); DLLFunction _alphaBlend = new DLLFunction(_dll, "AlphaBlend"); Binary blendFunc = new Binary(4); ; _alphaBlend.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::Pointer); _alphaBlend.returns(ExtTypes::DWord); blendFunc.byte(0, 0); blendFunc.byte(1, 0); blendFunc.byte(2, percent); blendFunc.byte(3, 0); return _alphaBlend.call(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, blendFunc); } X++: logo.loadImage('c:\\zg.bmp'); wDC = GetDC(0); newDC = CreateCompatibleDC(wDC); hBitmap = CreateCompatibleBitmap(wDC, 115, 111); if (hBitmap && SelectObject(newDC, hBitmap)) { logo.displayImage(newDC, 0,0,0,115,111); res = AlphaBlend(dstDC, 0,0,115,111,newDc,0,0,115,111, 128); // res = StretchBlt(dstDC, 0,0,115,111,newDc,0,0,115,111, #SRCCOPY); } Похожий код на С прекрасно работает X++: void DrawAlphaBlend (HDC hdcwnd) { HDC bmpDC; DWORD dw; HBITMAP hBitmap; LPCWSTR bmpName = _T("c:\\zg.bmp"); BLENDFUNCTION bf; bmpDC = CreateCompatibleDC(hdcwnd); hBitmap = (HBITMAP)LoadImage(hInst, bmpName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); SelectObject(bmpDC, hBitmap); bf.BlendOp = AC_SRC_OVER; bf.BlendFlags = 0; bf.SourceConstantAlpha = 0x7f; bf.AlphaFormat = 0; //StretchBlt(hdcwnd, 0,0, 115, 111, bmpDC, 0, 0, 115, 111, SRCCOPY); AlphaBlend(hdcwnd, 0, 0, 115, 111, bmpDC, 0, 0, 115, 111, bf); } |
|
Теги |
image, jpg, resize, winapi, картинка |
|
|