Esempio n. 1
0
void CWndShadow::Update(HWND hParent)
{
	//int ShadSize = 5;
	//int Multi = 100 / ShadSize;
	
	RECT WndRect;
	GetWindowRect(hParent, &WndRect);
	int nShadWndWid = WndRect.right - WndRect.left + m_nSize * 2;
	int nShadWndHei = WndRect.bottom - WndRect.top + m_nSize * 2;
	
	// Create the alpha blending bitmap
	BITMAPINFO bmi;        // bitmap header
	
	ZeroMemory(&bmi, sizeof(BITMAPINFO));
			bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
			bmi.bmiHeader.biWidth = nShadWndWid;
			bmi.bmiHeader.biHeight = nShadWndHei;
			bmi.bmiHeader.biPlanes = 1;
			bmi.bmiHeader.biBitCount = 32;         // four 8-bit components
			bmi.bmiHeader.biCompression = BI_RGB;
			bmi.bmiHeader.biSizeImage = nShadWndWid * nShadWndHei * 4;
	
	BYTE *pvBits;          // pointer to DIB section
	HBITMAP hbitmap = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void **)&pvBits, NULL, 0);
	
	ZeroMemory(pvBits, bmi.bmiHeader.biSizeImage);
	MakeShadow((UINT32 *)pvBits, hParent, &WndRect);
	
	HDC hMemDC = CreateCompatibleDC(NULL);
	HBITMAP hOriBmp = (HBITMAP)SelectObject(hMemDC, hbitmap);
	
	POINT ptDst = { WndRect.left + m_nxOffset - m_nSize, WndRect.top + m_nyOffset - m_nSize };
	POINT ptSrc = { 0, 0 };
	SIZE WndSize = { nShadWndWid, nShadWndHei };
	BLENDFUNCTION blendPixelFunction = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
	
	MoveWindow(m_hWnd, ptDst.x, ptDst.y, nShadWndWid, nShadWndHei, FALSE);
	
	BOOL bRet = s_UpdateLayeredWindow(m_hWnd, NULL, &ptDst, &WndSize, hMemDC,
				 &ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
	
	_ASSERT(bRet); // something was wrong....
	
	// Delete used resources
	SelectObject(hMemDC, hOriBmp);
		DeleteObject(hbitmap);
		DeleteDC(hMemDC);
	
}
Esempio n. 2
0
void CWndShadow::Update(HWND hParent)
{
	//int ShadSize = 5;
	//int Multi = 100 / ShadSize;

	RECT WndRect;
	GetWindowRect(hParent, &WndRect);
	int nShadWndWid = 0;
	int nShadWndHei = 0;
	if(m_pShadowImage != NULL)
	{
		// 九宫格方式,计算阴影窗口总的宽度和高度
		nShadWndWid = WndRect.right - WndRect.left + m_nShadowWLT + m_nShadowWRB;
		nShadWndHei = WndRect.bottom - WndRect.top + m_nShadowHLT + m_nShadowHRB;
	}else
	{
		// 算法阴影方式,计算阴影窗口总的宽度和高度
		nShadWndWid = WndRect.right - WndRect.left + m_nSize * 2;
		nShadWndHei = WndRect.bottom - WndRect.top + m_nSize * 2;
	}

	// Create the alpha blending bitmap
	BITMAPINFO bmi;        // bitmap header

	ZeroMemory(&bmi, sizeof(BITMAPINFO));
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth = nShadWndWid;
	bmi.bmiHeader.biHeight = nShadWndHei;
	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = 32;         // four 8-bit components
	bmi.bmiHeader.biCompression = BI_RGB;
	bmi.bmiHeader.biSizeImage = nShadWndWid * nShadWndHei * 4;

	BYTE *pvBits;          // pointer to DIB section
	HBITMAP hbitmap = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void **)&pvBits, NULL, 0);
	HDC hMemDC = CreateCompatibleDC(NULL);
	HBITMAP hOriBmp = (HBITMAP)SelectObject(hMemDC, hbitmap);

	if(m_pShadowImage != NULL)
	{
		// 九宫格方式画阴影图片
		Graphics graphics(hMemDC);
		CRect rcTemp(0, 0, nShadWndWid, nShadWndHei);
		DrawImageFrameMID(graphics, m_pShadowImage, rcTemp,
			0, 0, m_pShadowImage->GetWidth(), m_pShadowImage->GetHeight(),
			m_nShadowWLT, m_nShadowHLT, m_nShadowWRB+1, m_nShadowHRB+1);
	}else
	{
		// 画算法阴影
		ZeroMemory(pvBits, bmi.bmiHeader.biSizeImage);
		MakeShadow((UINT32 *)pvBits, hParent, &WndRect);
	}

	// 计算阴影窗口偏移位置
	POINT ptDst;  
    if(m_pShadowImage != NULL)  
    {
        ptDst.x = WndRect.left - m_nShadowWLT;  
        ptDst.y = WndRect.top - m_nShadowHLT;  
    }  
    else  
    {  
        ptDst.x = WndRect.left + m_nxOffset - m_nSize;  
        ptDst.y = WndRect.top + m_nyOffset - m_nSize;  
    }

	POINT ptSrc = {0, 0};
	SIZE WndSize = {nShadWndWid, nShadWndHei};
	BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };

	MoveWindow(m_hWnd, ptDst.x, ptDst.y, nShadWndWid, nShadWndHei, FALSE);

	BOOL bRet= s_UpdateLayeredWindow(m_hWnd, NULL, &ptDst, &WndSize, hMemDC,
		&ptSrc, 0, &blendPixelFunction, ULW_ALPHA);

	_ASSERT(bRet); // something was wrong....

	// Delete used resources
	SelectObject(hMemDC, hOriBmp);
	DeleteObject(hbitmap);
	DeleteDC(hMemDC);

}