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); }
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); }