void TOleDocWindow::Paint( HDC hdc, PAINTSTRUCT _FAR &) { LPOLEOBJECT lpObjectToDraw = NULL; if ( bObjectLoaded ) lpObjectToDraw = lpObject; else if ( lpUndoObject ) lpObjectToDraw = lpUndoObject; if ( lpObjectToDraw ) { RECT rect; GetClientRect( HWindow, &rect ); // Tips for OleDraw: // OleDraw will return OLE_ERROR_OBJECT if the // object to be drawn is invalid. In a case like this, // that could happen if the Paint function does not get // informed about the object being deleted, or not having // yet been created. // You can also get OLE_ERROR_BLANK if you draw an object // which has not been stored. A time when this could happen // is trying use OleDraw on the object after using OleCreate // to make it, but not yet using the Servers update command // to save the object with Ole. ret = OleDraw( lpObjectToDraw , hdc, &rect , NULL, 0 ); wait( ret, lpObjectToDraw ); } }
//绘画函数 VOID CFlashWnd::Draw(HDC hdcDraw, LPCRECT rcDraw, BOOL bErase) { //效验状态 ASSERT(m_pIControl!=NULL); if (m_pIControl==NULL) return; //获取位置 CRect rcRect; GetClientRect(m_hWnd,&rcRect); //绘画判断 if (rcRect.Width()==0) return; if (rcRect.Height()==0) return; //接口变量 IOleObject * pIOleObject=m_pIOleObject; IViewObject * pIViewObject=(m_pIViewObjectEx!=NULL)?m_pIViewObjectEx:m_pIViewObject; if (m_hdcBack) ::DeleteDC(m_hdcBack); if (m_bmpBack) ::DeleteObject(m_bmpBack); //绘画对象 /*if ((pIOleObject!=NULL)&&(pIViewObject!=NULL)) { //创建缓冲 CImage ImageBuffer; ImageBuffer.Create(rcRect.Width(),rcRect.Height(),32); //绘画对象 CImageDC ImageDC(ImageBuffer); OleDraw(pIViewObject,DVASPECT_TRANSPARENT,ImageDC,&rcRect); }*/ //变量定义 BITMAPINFOHEADER BitmapInfoHeader; ZeroMemory(&BitmapInfoHeader,sizeof(BitmapInfoHeader)); //设置变量 BitmapInfoHeader.biSize=sizeof(BITMAPINFOHEADER); BitmapInfoHeader.biBitCount=32; BitmapInfoHeader.biCompression=BI_RGB; BitmapInfoHeader.biPlanes=1; BitmapInfoHeader.biWidth=rcRect.Width(); BitmapInfoHeader.biHeight=-rcRect.Height(); HDC hdc=::GetDC(m_hWnd); m_hdcBack=CreateCompatibleDC(hdc); m_bmpBack=CreateDIBSection(hdc, (BITMAPINFO *)&BitmapInfoHeader, DIB_RGB_COLORS, (VOID **)&m_lpBitsOnly, NULL, 0x0); SelectObject(m_hdcBack, m_bmpBack); ::ReleaseDC(m_hWnd,hdc); if (m_iBPP==0) m_iBPP=GetDeviceCaps(m_hdcBack,BITSPIXEL); CPoint Point(rcRect.left, rcRect.top); CSize Size(rcRect.Width(),rcRect.Height()); //绘画对象 if ((pIOleObject!=NULL)&&(pIViewObject!=NULL)) { CRect rcTotal; ::GetClientRect(m_hWnd,&rcTotal); if (m_iBPP==32) { ZeroMemory(m_lpBitsOnly,Size.cx*Size.cy*sizeof(DWORD)); OleDraw(pIViewObject,DVASPECT_TRANSPARENT,m_hdcBack,&rcTotal); } else //in 8/16/24 bit screen depth UpdateLayeredWindow produces wrong results - we use underlaying DC to paint to { //HWND hwndParent=::GetParent(hwnd); HWND hwndParent=::GetDesktopWindow(); HDC hdcParent=::GetWindowDC(hwndParent); CRect rcClient; GetClientRect(m_hWnd,rcClient); CPoint pt; pt.x=rcClient.left; pt.y=rcClient.top; ClientToScreen(m_hWnd,&pt); BitBlt(m_hdcBack, 0, 0, rcTotal.right, rcTotal.bottom, hdcParent, pt.x, pt.y, SRCCOPY); ::ReleaseDC(hwndParent, hdcParent); OleDraw(pIViewObject, DVASPECT_TRANSPARENT, m_hdcBack, &rcTotal); } } /* CPoint Point(rcRect.left, rcRect.top); CSize Size(rcRect.Width(),rcRect.Height());*/ //变量定义 BLENDFUNCTION BlendFunction; ZeroMemory(&BlendFunction,sizeof(BlendFunction)); //设置变量 BlendFunction.BlendOp=AC_SRC_OVER; BlendFunction.AlphaFormat=AC_SRC_ALPHA; BlendFunction.SourceConstantAlpha=255; return; //当前帧数 LONG lCurrentFrame=-1; if (m_pIControl!=NULL) { lCurrentFrame=m_pIControl->CurrentFrame(); } //完成判断 if ((m_pIControl!=NULL)&&(((m_lCurrentFrame+1)==m_lTotalFrames)||(m_lCurrentFrame>lCurrentFrame))) { //停止播放 m_pIControl->Stop(); //事件通知 if (m_pIFlashControlSink!=NULL) { m_pIFlashControlSink->OnEventFlashPlayFinish(); } } //设置变量 if (m_bStop) BlendFunction.SourceConstantAlpha=0; m_lCurrentFrame=lCurrentFrame; CPoint ImagePoint(0,0); UpdateLayeredWindow(m_hWnd, NULL, &Point, &Size, m_hdcBack, &ImagePoint, 0, &BlendFunction, m_iBPP==32 ? ULW_ALPHA : ULW_OPAQUE); return; }
OLECONTAINER(void)::Draw(HDC hdcDraw, const RECT *rcDraw, BOOL bErase) { HWND hwnd = GetHWND(); HRESULT hr; RECT r; MYFUNC UpdateLayeredWindow; HINSTANCE hFuncInst = LoadLibrary(TEXT("User32.DLL")); BOOL bRet=FALSE; if(hFuncInst) UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow"); else { exit(0); } IOleObject *lpO = m_lpO; IViewObject *lpV = m_lpViewObjectEx ? (IViewObject *)m_lpViewObjectEx : m_lpViewObject; if (!m_bTransparent) { RECT rTotal; ::GetClientRect(hwnd, &rTotal); if (lpV) { if (!hdcDraw) { hdcDraw = ::GetDC(hwnd); hr = OleDraw(lpV, DVASPECT_CONTENT, hdcDraw, &rTotal); ::ReleaseDC(hwnd, hdcDraw); } else { hr = OleDraw(lpV, DVASPECT_CONTENT, hdcDraw, &rTotal); } } return; } ::GetWindowRect(hwnd, &r); if (!m_hdcBack || !EqualRect(&r, &m_rcBounds)) { if (m_hdcBack) ::DeleteDC(m_hdcBack); if (m_bmpBack) ::DeleteObject(m_bmpBack); if (m_hdcBackW) ::DeleteDC(m_hdcBackW); if (m_bmpBackW) ::DeleteObject(m_bmpBackW); m_rcBounds = r; HDC hdc = ::GetDC(hwnd); BITMAPINFOHEADER bih = {0}; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biPlanes = 1; bih.biWidth = r.right - r.left; bih.biHeight = -(r.bottom - r.top); m_hdcBack = CreateCompatibleDC(hdc); m_bmpBack = CreateDIBSection(hdc, (BITMAPINFO *)&bih, DIB_RGB_COLORS, (void **)&m_lpBitsOnly, NULL, 0x0); SelectObject(m_hdcBack, m_bmpBack); if (m_bFixTransparency) { m_hdcBackW = CreateCompatibleDC(hdc); m_bmpBackW = CreateDIBSection(hdc, (BITMAPINFO *)&bih, DIB_RGB_COLORS, (void **)&m_lpBitsOnlyW, NULL, 0x0); SelectObject(m_hdcBackW, m_bmpBackW); } ::ReleaseDC(hwnd, hdc); if (m_iBPP == 0) m_iBPP = GetDeviceCaps(m_hdcBack, BITSPIXEL); } POINT p = {r.left, r.top}; POINT p2 = {0, 0}; SIZE sz = {r.right-r.left, r.bottom-r.top}; if (lpO && lpV) { RECT rTotal; ::GetClientRect(hwnd, &rTotal); RECTL rcBounds = {rTotal.left, rTotal.top, rTotal.right, rTotal.bottom}; BYTE *dst = m_lpBitsOnly, *dstW; if (1) { if (!m_bFixTransparency) //if flash player version is other than 8, do usual painting { memset(m_lpBitsOnly, 0, sz.cx * sz.cy * 4); hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal); } else //if player version is 8, we need to fix flash player 8 control transparency bug { memset(m_lpBitsOnly, 0, sz.cx * sz.cy * 4); memset(m_lpBitsOnlyW, 255, sz.cx * sz.cy * 4); hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal); hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBackW, &rTotal); dst = m_lpBitsOnly; dstW = m_lpBitsOnlyW; BYTE r, g, b, a, rw, gw, bw, aw, alpha_r, alpha_g, alpha_b, alpha; for (int y = 0; y < sz.cy; y++) { for (int x = 0; x < sz.cx; x++) { //the idea is that we draw the same data onto black and white DC's //and then calculate per pixel alpha based on difference, produced by alpha blending r = *dst++; g = *dst++; b = *dst++; a = *dst++; rw = *dstW++; gw = *dstW++; bw = *dstW++; aw = *dstW++; alpha_r = rw-r; alpha_g = gw-g; alpha_b = bw-b; //division by 3 is for accuracy and can be replaced by //alpha = alpha_g; for example alpha = (alpha_r + alpha_g + alpha_b) / 3; *(dst - 1) = 255 - alpha; //this algorithm should be optimized for MMX to achieve best performance } } } } else //in 8/16/24 bit screen depth UpdateLayeredWindow produces wrong results - we use underlaying DC to paint to { //解决方法见flash.cpp的说明部分 //这段代码以后永远不会被执行! HWND hwndParent = ::GetParent(hwnd); HDC hdcParent = ::GetWindowDC(hwndParent); BOOL bRet = BitBlt(m_hdcBack, 0, 0, rTotal.right, rTotal.bottom, hdcParent, 0, 0, SRCCOPY); ::ReleaseDC(hwndParent, hdcParent); hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal); dst = m_lpBitsOnly; } } //BitBlt(::GetDC(0), 0, 0, 250, 250, m_hdcBack, 0, 0, SRCCOPY); //不管系统设置的是多少为,但在UpdateLayeredWindow前一定要转换成32为带Alpha通道的位图 /*BITMAPINFO _bmpInfo; ZeroMemory(&_bmpInfo, sizeof(BITMAPINFO)); _bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFO); int _res = GetDIBits(m_hdcBack, m_bmpBack, 0, 0, NULL, &_bmpInfo, DIB_RGB_COLORS); if(!_res) return; //get data _res = _bmpInfo.bmiHeader.biHeight * _bmpInfo.bmiHeader.biWidth * _bmpInfo.bmiHeader.biBitCount / 8; unsigned char *buf = new unsigned char[_res]; GetDIBits(m_hdcBack, m_bmpBack, (UINT)0, (UINT)_bmpInfo.bmiHeader.biHeight, (LPVOID)buf, &_bmpInfo, DIB_RGB_COLORS); FILE *ff = fopen ("e:\\f3.bin", "wb+"); for (int i = 0; i < _res; ++i) { char temp[10]; if ((i + 1) % 4 == 0) { sprintf(temp, "%02X\n", buf[i]); } else { sprintf(temp, "%02X ", buf[i]); } fwrite(temp, 3, 1, ff); } fclose(ff); PreMultiplyRGBChannels (_bmpInfo.bmiHeader.biWidth, _bmpInfo.bmiHeader.biHeight, buf); _res = SetDIBits(m_hdcBack, m_bmpBack, (UINT)0, (UINT)_bmpInfo.bmiHeader.biHeight, (LPVOID)buf, &_bmpInfo, DIB_RGB_COLORS); delete[] buf; buf = NULL;*/ BLENDFUNCTION bf; bf.BlendOp = AC_SRC_OVER; bf.AlphaFormat = AC_SRC_ALPHA; bf.BlendFlags = 0; bf.SourceConstantAlpha = 255; bRet = UpdateLayeredWindow(hwnd, NULL, &p, &sz, m_hdcBack, &p2, 0, &bf, ULW_ALPHA); }
OLECONTAINER(void)::Draw(HDC hdcDraw, const RECT *rcDraw, BOOL bErase) { HWND hwnd = GetHWND(); HRESULT hr; RECT r; IOleObject *lpO = m_lpO; IViewObject *lpV = m_lpViewObjectEx ? (IViewObject *)m_lpViewObjectEx : m_lpViewObject; if (!m_bTransparent) { RECT rTotal; ::GetClientRect(hwnd, &rTotal); if (lpV) { if (!hdcDraw) { hdcDraw = ::GetDC(hwnd); hr = OleDraw(lpV, DVASPECT_CONTENT, hdcDraw, &rTotal); ::ReleaseDC(hwnd, hdcDraw); } else { hr = OleDraw(lpV, DVASPECT_CONTENT, hdcDraw, &rTotal); } } return; } ::GetWindowRect(hwnd, &r); if (!m_hdcBack || !EqualRect(&r, &m_rcBounds)) { if (m_hdcBack) ::DeleteDC(m_hdcBack); if (m_bmpBack) ::DeleteObject(m_bmpBack); if (m_hdcBackW) ::DeleteDC(m_hdcBackW); if (m_bmpBackW) ::DeleteObject(m_bmpBackW); m_rcBounds = r; HDC hdc = ::GetDC(hwnd); BITMAPINFOHEADER bih = {0}; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biPlanes = 1; bih.biWidth = r.right - r.left; bih.biHeight = -(r.bottom - r.top); m_hdcBack = CreateCompatibleDC(hdc); m_bmpBack = CreateDIBSection(hdc, (BITMAPINFO *)&bih, DIB_RGB_COLORS, (void **)&m_lpBitsOnly, NULL, 0x0); SelectObject(m_hdcBack, m_bmpBack); if (m_bFixTransparency) { m_hdcBackW = CreateCompatibleDC(hdc); m_bmpBackW = CreateDIBSection(hdc, (BITMAPINFO *)&bih, DIB_RGB_COLORS, (void **)&m_lpBitsOnlyW, NULL, 0x0); SelectObject(m_hdcBackW, m_bmpBackW); } ::ReleaseDC(hwnd, hdc); if (m_iBPP == 0) m_iBPP = GetDeviceCaps(m_hdcBack, BITSPIXEL); } POINT p = {r.left, r.top}; POINT p2 = {0, 0}; SIZE sz = {r.right-r.left, r.bottom-r.top}; if (lpO && lpV) { RECT rTotal; ::GetClientRect(hwnd, &rTotal); RECTL rcBounds = {rTotal.left, rTotal.top, rTotal.right, rTotal.bottom}; BYTE *dst = m_lpBitsOnly, *dstW; if (m_iBPP == 32) { if (!m_bFixTransparency) //if flash player version is other than 8, do usual painting { memset(m_lpBitsOnly, 0, sz.cx * sz.cy * 4); hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal); } else //if player version is 8, we need to fix flash player 8 control transparency bug { memset(m_lpBitsOnly, 0, sz.cx * sz.cy * 4); memset(m_lpBitsOnlyW, 255, sz.cx * sz.cy * 4); hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal); hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBackW, &rTotal); dst = m_lpBitsOnly; dstW = m_lpBitsOnlyW; BYTE r, g, b, a, rw, gw, bw, aw, alpha_r, alpha_g, alpha_b, alpha; for (int y = 0; y < sz.cy; y++) { for (int x = 0; x < sz.cx; x++) { //the idea is that we draw the same data onto black and white DC's //and then calculate per pixel alpha based on difference, produced by alpha blending r = *dst++; g = *dst++; b = *dst++; a = *dst++; rw = *dstW++; gw = *dstW++; bw = *dstW++; aw = *dstW++; alpha_r = rw-r; alpha_g = gw-g; alpha_b = bw-b; //division by 3 is for accuracy and can be replaced by //alpha = alpha_g; for example alpha = (alpha_r + alpha_g + alpha_b) / 3; *(dst - 1) = 255 - alpha; //this algorithm should be optimized for MMX to achieve best performance } } } } else //in 8/16/24 bit screen depth UpdateLayeredWindow produces wrong results - we use underlaying DC to paint to { //HWND hwndParent = ::GetParent(hwnd); HDC hdcParent = ::GetWindowDC(hwnd); BOOL bRet = BitBlt(m_hdcBack, 0, 0, rTotal.right, rTotal.bottom, hdcParent, 0, 0, SRCCOPY); ::ReleaseDC(hwnd, hdcParent); hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal); dst = m_lpBitsOnly; } } BLENDFUNCTION bf; bf.BlendOp = AC_SRC_OVER; bf.AlphaFormat = AC_SRC_ALPHA; bf.BlendFlags = 0; bf.SourceConstantAlpha = 255; //BitBlt(hdcDraw, 0, 0, r.right-r.left, r.bottom-r.top, m_hdcBack, 0, 0, SRCCOPY); BOOL bRet = UpdateLayeredWindow(hwnd, NULL, &p, &sz, m_hdcBack, &p2, 0, &bf, /*m_iBPP == 32 ? ULW_ALPHA : */ULW_OPAQUE); }
void CHTMLViewCapView::SaveImages(CList<CHTMLViewCapUrl> &lstUrl) { // POSITION pos = NULL; // 浏览器和图片的宽度和高度 DWORD nWidth = 1024; DWORD nHeight = 2048; IDispatch *pDoc = NULL; IViewObject *pViewObject = NULL; VARIANT vUrl; VARIANT vUrlName; // CTime t; CString csTime, csDate, csMark1; CString csPath; CString csFileName; HRESULT hr; // CBitmap *pBM; Bitmap *gdiBMP; // 用于生成图片的序数 static DWORD nNum = 0; /* 创建字体 */ HFONT hfont; LOGFONT lf; ZeroMemory(&lf, sizeof(lf)); lf.lfHeight = 0; lf.lfWidth = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfStrikeOut = FALSE; lf.lfCharSet = DEFAULT_CHARSET; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = ANTIALIASED_QUALITY; lf.lfPitchAndFamily = VARIABLE_PITCH; lstrcpy(lf.lfFaceName, _T("微软雅黑")); hfont = CreateFontIndirect(&lf); // 循环遍历所有URL for (pos = lstUrl.GetHeadPosition(); pos != NULL; lstUrl.GetNext(pos)) { // 获取图片和浏览器分辨率 nWidth = lstUrl.GetAt(pos).m_nWidth; nHeight = lstUrl.GetAt(pos).m_nHeight; CString &csUrl = lstUrl.GetAt(pos).m_csUrl; CBitmapDC destDC(nWidth, nHeight); // 创建 媒体名称目录 csPath = ::theApp.m_csImageDir; csPath.Append(_T("\\")); if (lstUrl.GetAt(pos).m_bHasMediaName) { csPath.Append(lstUrl.GetAt(pos).m_csMediaName); } else { csPath.Append(lstUrl.GetAt(pos).getMediaNameInUrl()); } ::CreateDirectory(csPath, NULL); // 创建输出文件路径 t = CTime::GetCurrentTime(); csTime = t.Format("\\%H时%M分%S秒-"); csMark1 = t.Format("%H:%M"); csDate = t.Format(" %Y/%m/%d"); csPath.Append(csTime); vUrl.vt = ::VT_BSTR; vUrl.bstrVal = (BSTR)csUrl.GetString(); m_pBrowserApp->put_Width(nWidth); m_pBrowserApp->put_Height(nHeight); if (m_pBrowserApp->Navigate2(&vUrl, NULL, NULL, NULL, NULL) == S_OK) { m_tBeforeEnterLoop = CTime::GetCurrentTime(); RunModalLoop(); } else { TRACE(_T("%d Document Navigate Failed!\n"), vUrl); MessageBox(_T("Navi Error"), _T("Error"), MB_OK); return ; } TRACE("Begin Cap!\n"); // wait for document to load m_pBrowserApp->Refresh(); // render to enhanced metafile HDC. hr = m_pBrowserApp->get_Document(&pDoc); if (hr != S_OK) { TRACE(_T("%s get_Document failed!\n"), vUrl.bstrVal); return ; } pDoc->QueryInterface(IID_IViewObject, (void**)&pViewObject); // result is first div of document if (pDoc == NULL) { TRACE(_T("%d query IID_IViewObject failed!\n"), vUrl.bstrVal); return ; } hr = OleDraw(pViewObject, DVASPECT_CONTENT, destDC, NULL); if (hr != S_OK) { TRACE(_T("%s OleDraw failed!\n"), vUrl.bstrVal); return ; } /* 使用字体 */ destDC.SelectObject(hfont); destDC.SetTextColor(RGB(0, 0, 0)); destDC.SetBkColor(RGB(235, 231, 228)); //destDC.SetBkMode(TRANSPARENT); // 输出水印 TextOut(destDC, nWidth - 70, nHeight - 100, (LPCTSTR)csMark1, csMark1.GetLength()); TextOut(destDC, nWidth - 100, nHeight - 70, (LPCTSTR)csDate, csDate.GetLength()); pBM = destDC.Close(); gdiBMP = Bitmap::FromHBITMAP(HBITMAP(pBM->GetSafeHandle()), NULL); csFileName.Format(_T("%u.jpg"), nNum++); csPath.Append(csFileName); // 保存图片 gdiBMP->Save(csPath.GetString(), &m_jpegClsid, NULL); // 清理资源 delete gdiBMP; pBM->DeleteObject(); pViewObject->Release(); pDoc->Release(); } }
void nekoFlashInstance::Update(float32 frameTime) { if(!flashInterface) { SetValid(false); return; } if(!mTexture) return; if(mSkipAbleTime > 0.0f) { mSkipAbleTime = max(mSkipAbleTime - frameTime, 0); } int32 dirtyWidth = mDirtyBounds.right - mDirtyBounds.left; int32 dirtyHeight = mDirtyBounds.bottom - mDirtyBounds.top; int32 dirtyBufSize = dirtyWidth * dirtyHeight; flashInterface->QueryInterface(IID_IViewObject, (void**)&mCurView); if(!mCurView || !dirtyBufSize) return; IDirect3DSurface9 *pSurface; D3DLOCKED_RECT lockedRect; if(mTexture->GetHandle() == NULL) return; if(SUCCEEDED(mTexture->GetHandle()->LockRect(0, &lockedRect, 0, D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE))) { lockedRect.Pitch /= 4; if(mMainBitmap == NULL) { HDC hdc = GetDC(0); BITMAPINFOHEADER bih = {0}; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biPlanes = 1; bih.biWidth = 800; bih.biHeight = -600; mMainDC = CreateCompatibleDC(hdc); mMainBitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&mMainBuffer, 0, 0); SelectObject(mMainDC, mMainBitmap); mAlphaDC = CreateCompatibleDC(hdc); mAlphaBitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&mAlphaBuffer, 0, 0); SelectObject(mAlphaDC, mAlphaBitmap); } RECT local = {-mDirtyBounds.left, -mDirtyBounds.top, -mDirtyBounds.left + mDirtyBounds.right, -mDirtyBounds.top + mDirtyBounds.bottom }; //memset(mMainBuffer, 0, dirtyBufSize * 4); //memset(mAlphaBuffer, 255, dirtyBufSize * 4); OleDraw(mCurView, DVASPECT_TRANSPARENT, mMainDC, &local); OleDraw(mCurView, DVASPECT_TRANSPARENT, mAlphaDC, &local); DWORD *blackBuffer, *whiteBuffer; DWORD *ptr; int32 ay = mDirtyBounds.top; int32 x, y; for(y = 0; y < dirtyHeight; ++y, ++ay) { blackBuffer = (mMainBuffer + y * 800); whiteBuffer = (mAlphaBuffer + y * 800); ptr = (DWORD *)lockedRect.pBits + ay * lockedRect.Pitch + mDirtyBounds.left; for(x = 0; x < dirtyWidth; ++x) { //blackBuffer[3] = 255 - (*blackBuffer - *whiteBuffer); *ptr++ = ((*blackBuffer) & 0xffffff) | ((255 - (((*blackBuffer++) & 0xff) - ((*whiteBuffer++) & 0xff))) << 24); } } mTexture->GetHandle()->UnlockRect(0); mDirtyBounds.left = mDirtyBounds.right = 400; mDirtyBounds.top = mDirtyBounds.bottom = 400; } mCurView->Release(); mCurView = 0; }
//绘画函数 VOID CFlashActiveX::DrawControl(HDC hdcDraw, LPCRECT rcDraw, BOOL bErase) { //效验状态 if (m_hWnd==NULL) return; if (m_lTotalFrames==0L) return; if (m_pIFalshControl==NULL) return; //获取位置 CRect rcRect; GetClientRect(m_hWnd,&rcRect); //绘画判断 if (rcRect.Width()==0) return; if (rcRect.Height()==0) return; //接口变量 IOleObject * pIOleObject=m_pIOleObject; IViewObject * pIViewObject=(m_pIViewObjectEx!=NULL)?m_pIViewObjectEx:m_pIViewObject; //绘画对象 if ((pIOleObject!=NULL)&&(pIViewObject!=NULL)) { //创建缓冲 CImage ImageBuffer; ImageBuffer.Create(rcRect.Width(),rcRect.Height(),32); //绘画对象 CImageDC ImageDC(ImageBuffer); OleDraw(pIViewObject,DVASPECT_TRANSPARENT,ImageDC,&rcRect); //变量定义 BLENDFUNCTION BlendFunction; ZeroMemory(&BlendFunction,sizeof(BlendFunction)); //设置变量 BlendFunction.BlendOp=AC_SRC_OVER; BlendFunction.AlphaFormat=AC_SRC_ALPHA; BlendFunction.SourceConstantAlpha=0xFF; //帧数统计 LONG lCurFrame = m_pIFalshControl->CurrentFrame(); if(m_lLastFrames != lCurFrame) { m_lLastFrames = lCurFrame; m_lLastFrameCount = 0L; } else m_lLastFrameCount++; //完成判断 if ((lCurFrame+1L)>=m_lTotalFrames || m_lLastFrameCount>=20) { //停止播放 m_pIFalshControl->StopPlay(); //设置变量 BlendFunction.SourceConstantAlpha=0x00; //事件通知 if (m_pIFlashControlSink!=NULL) { m_pIFlashControlSink->OnEventFlashFinish(); } } //变量定义 CPoint ImagePoint(0,0); CSize SizeImage(ImageBuffer.GetWidth(),ImageBuffer.GetHeight()); //设置窗口 UpdateLayeredWindow(m_hWnd,NULL,NULL,&SizeImage,ImageDC,&ImagePoint,RGB(0,0,0),&BlendFunction,ULW_ALPHA); } return; }