19,464
社区成员
发帖
与我相关
我的任务
分享
BOOL SetWindowBackgroundImage(HWND hWnd, Image* pImg)
{
int nWidth = pImg->GetWidth();
int nHeight = pImg->GetHeight();
SetWindowPos(hWnd, HWND_TOP, 0, 0, nWidth, nHeight, SWP_NOMOVE);
//获取源DC
HDC hdcSource = ::GetDC(hWnd);
//创建内存兼容DC和位图
HDC hdcMemory = ::CreateCompatibleDC(hdcSource);
HBITMAP hbmp = ::CreateCompatibleBitmap(hdcSource, nWidth, nHeight);
HBITMAP hOld = (HBITMAP)::SelectObject(hdcMemory, hbmp);
//采用GDI++画图,保证质量
Graphics Canvas(hdcMemory);
Canvas.SetInterpolationMode(InterpolationModeHighQuality);
Canvas.SetCompositingQuality(CompositingQualityHighQuality);
Canvas.SetSmoothingMode(SmoothingModeAntiAlias);
Canvas.DrawImage(pImg, 0, 0, nWidth, nHeight);
//获取屏幕DC
HDC hdcScreen = ::GetDC(NULL);
CRect rc;
::GetWindowRect(hWnd, rc);
CPoint ptSource(0, 0);
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 255; //如果要改变图像的透明度,可以修改此值0~255。
//0:全透明,255:不透明,由图像本身的Alpha通道决定
bf.AlphaFormat = AC_SRC_ALPHA;
CPoint pt(rc.TopLeft());
CSize size(rc.Size());
BOOL bOK = UpdateLayeredWindow(hWnd, hdcScreen, &pt, &size, hdcMemory, &ptSource, 0, &bf, ULW_ALPHA);
::SelectObject(hdcMemory, hOld);
::DeleteObject(hbmp);
::DeleteDC(hdcMemory);
::ReleaseDC(NULL, hdcScreen);
::ReleaseDC(hWnd, hdcSource);
return bOK;
}
BOOL SetWindowBackgroundImage(HINSTANCE hInst, HWND hWnd, UINT uID, LPCTSTR lpszType)
{
if (!::IsWindow(hWnd)) return FALSE;
BOOL bSuccessed = FALSE;
HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(uID), lpszType); //查找资源
if (hRsrc)
{
DWORD dwSize = SizeofResource(hInst, hRsrc); //获取资源大小
if (dwSize > 0)
{
HGLOBAL hSrc = LoadResource(hInst, hRsrc); //装载资源
if (hSrc)
{
LPVOID lpSrc = LockResource(hSrc); //资源加锁
if (lpSrc)
{
// Allocate global memory on which to create stream
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_NODISCARD|GMEM_ZEROINIT, dwSize);
if (hMem)
{
LPVOID pMem = GlobalLock(hMem);
if (pMem)
{
CopyMemory(pMem, lpSrc, dwSize);
IStream* pstm = NULL;
HRESULT hStatus = CreateStreamOnHGlobal(hMem, FALSE, &pstm);
if (hStatus == S_OK)
{
//从流创建资源图像
Gdiplus::Image* pImg = Gdiplus::Image::FromStream(pstm);
if (pImg)
{
bSuccessed = SetWindowBackgroundImage(hWnd, pImg);
delete pImg;
}
pstm->Release();
}
GlobalUnlock(hMem);
}
GlobalFree(hMem);
}
UnlockResource(hSrc);
}
FreeResource(hSrc);
}
}
}
return bSuccessed;
}