用GDI+png图片创建窗口阴影,核心代码如下:
int __fastcall TForm1::SetTransparent(LPWSTR lpSkinFile, int nTran)
{
// GDI+加载图片
m_Image = Gdiplus::Image::FromFile(lpSkinFile);
//保存图片尺寸
Width = m_Image->GetWidth();
Height = m_Image->GetHeight();
//创建兼容位图
HDC hdcTemp = GetDC(0);
m_hdcMemory = CreateCompatibleDC(hdcTemp);
HBITMAP hBitMap = CreateCompatibleBitmap(hdcTemp,Width,Height);
SelectObject(m_hdcMemory, hBitMap);
// Alpha值
if (nTran<0 || nTran >100)
nTran = 100;
m_Blend.SourceConstantAlpha = int(nTran * 2.55); // 1~255
HDC hdcScreen = ::GetDC(0);
RECT rct;
GetWindowRect(Handle, &rct);
POINT ptWinPos = {rct.left, rct.top};
Gdiplus::Graphics graph(m_hdcMemory);
graph.DrawImage(m_Image, 0, 0, m_Image->GetWidth(), m_Image->GetHeight());
SIZE sizeWindow = {m_Image->GetWidth(), m_Image->GetHeight()};
POINT ptSrc = {0, 0};
//设置窗口风格
DWORD dwExStyle = GetWindowLong(Handle, GWL_EXSTYLE);
if((dwExStyle & 0x80000 ) != 0x80000)
SetWindowLong(Handle, GWL_EXSTYLE, dwExStyle ^ 0x80000);
BLENDFUNCTION m_Blend;
m_Blend.BlendOp = 0; // the only BlendOp defined in Windows 2000
m_Blend.BlendFlags = 0; // nothing else is special ...
m_Blend.AlphaFormat = 1; // ...
m_Blend.SourceConstantAlpha = 255; // AC_SRC_ALPHA
//执行alpha通道混合
BOOL bRet = UpdateLayeredWindow(Handle, hdcScreen, &ptWinPos,
&sizeWindow, m_hdcMemory, &ptSrc, 0, &m_Blend, 2);
graph.ReleaseHDC(m_hdcMemory);
ReleaseDC(0, hdcScreen);
hdcScreen = NULL;
ReleaseDC(0, hdcTemp);
hdcTemp = NULL;
DeleteObject(hBitMap);
DeleteDC(m_hdcMemory);
m_hdcMemory = NULL;
m_Image = NULL;
return bRet;
}