Участник
|
Решил использовать вместо функции 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);
} Если раскомментировать строку с StretchBlt, то нормально рисует, если вызывать AlphaBlend, то ничего не рисует и возвращает false
Похожий код на С прекрасно работает
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);
} Не пойму в чем проблема - то ли я уже не замечаю отличий в коде, то ли что-то с передачей параметров в Аксапте.
|