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 );
	}
}
Esempio n. 2
0
//绘画函数
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;
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
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();
	}
}
Esempio n. 6
0
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;
}
Esempio n. 7
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;
}