Показать сообщение отдельно
Старый 18.11.2008, 14:25   #12  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Решил использовать вместо функции 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);
}
Не пойму в чем проблема - то ли я уже не замечаю отличий в коде, то ли что-то с передачей параметров в Аксапте.