|
参照MSDN研究UpdateLayeredWindowIndirect局部更新终于成功,关键参数prcDirty;发表给需要的朋友
bool AfxUpdateLayeredWindowIndirect(const HWND hWnd, const HDC & hDc, RECT * prcDirty, UINT Alpha)
{
POINT pptDst;
SIZE psize;
RECT lpr;
if (!GetWindowRect(hWnd, &lpr))
return false;
pptDst.x = lpr.left;
pptDst.y = lpr.top;
psize.cx = lpr.right - lpr.left;
psize.cy = lpr.bottom - lpr.top;
POINT pptSrc = { 0,0 };
HDC hdc = GetDC(hWnd);
BLENDFUNCTION Blend; //该BLENDFUNCTION结构控制通过指定源和目的地的位图的混合函数共混
Blend.BlendOp = AC_SRC_OVER; //源混合操作。目前,唯一定义的源和目标混合操作是AC_SRC_OVER
Blend.BlendFlags = 0; //必须为零
Blend.AlphaFormat = AC_SRC_ALPHA; //该成员控制源和目标位图的解释方式
Blend.SourceConstantAlpha = Alpha;//指定要在整个源位图上使用的Alpha透明度值
///////////////////////////////////
UPDATELAYEREDWINDOWINFO updateinfo = { 0 };
updateinfo.cbSize = sizeof(UPDATELAYEREDWINDOWINFO);//这个结构的大小,以字节为单位
updateinfo.hdcDst = hdc;//屏幕DC的句柄。
updateinfo.pptDst = &pptDst; //分层窗口的新屏幕位置。如果新位置与当前位置不变,则pptDst可以为NULL。
updateinfo.psize = &psize; //分层窗口的新大小。如果窗口大小不变,该参数可以为NULL。如果hdcSrc为NULL,则psize必须为NULL
updateinfo.pptSrc = &pptSrc; //设备上下文中图层的位置
updateinfo.hdcSrc = hDc;//定义分层窗口的表面的DC处理
updateinfo.crKey = 0;//构成分层窗口时要使用的颜色键
updateinfo.dwFlags = ULW_ALPHA;//使用pblend作为混合函数
updateinfo.pblend = &Blend;//构成分层窗口时要使用的透明度值
updateinfo.prcDirty = prcDirty;//更新区域
bool bot= UpdateLayeredWindowIndirect(hWnd, &updateinfo);
ReleaseDC(hWnd, hdc);
return bot;
}
|
上一篇: 如何理解 const char*, char const*, char*const 等下一篇: C++的MD5加密代码
|