半透明渐变的窗口效果
void CSemiTransWnd::Update(long type,POINT *pTopLeft)
{
if(m_hWnd&&m_iWidth&&m_iHeight&&m_pdwRGBAData&&m_pDC&&m_pBmp)//指针正确
{
//获取屏幕DC
CDC dcScreen;
dcScreen.Attach(::GetDC(NULL));
//处理Alpha 通道
DealAlphaChannel();
CRect rectDlg;
GetWindowRect(m_hWnd,&rectDlg);
CPoint ptWindowScreenPosition(rectDlg.TopLeft());
if(pTopLeft)
{
ptWindowScreenPosition.x=pTopLeft->x;
ptWindowScreenPosition.y=pTopLeft->y;
}
//刷新到屏幕上
CSize szWindow(m_iWidth, m_iHeight);
CPoint ptSrc(0,0);
int alpha;
switch(type)
{
case 2: //淡出
for(alpha=m_iWndSemiTransAlpha;alpha>=0;alpha--)
{
BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, alpha,AC_SRC_ALPHA };
UpdateLayeredWindow(m_hWnd, dcScreen, &ptWindowScreenPosition, &szWindow, *m_pDC,&ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
}
break;
case 1: //淡入
for(alpha=0;alpha<=m_iWndSemiTransAlpha;alpha++)
{
BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, alpha,AC_SRC_ALPHA };
UpdateLayeredWindow(m_hWnd, dcScreen, &ptWindowScreenPosition, &szWindow, *m_pDC,&ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
}
break;
case 0: //直接刷新
default:
BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, m_iWndSemiTransAlpha,AC_SRC_ALPHA };
UpdateLayeredWindow(m_hWnd, dcScreen, &ptWindowScreenPosition, &szWindow, *m_pDC,&ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
break;
}
}//end if
}
空 气 15:12:25
// 处理Alpha通道 处理用户绘制部分的不透明度
void CSemiTransWnd::DealAlphaChannel(void)
{
if(m_pdwRGBAData&&m_pBmp) //指针正确
{
if(m_bSemiTransAlphaUpdate||m_bTransAlphaUpdate)//需要处理Alpha
{
//获取位图数据
BITMAP bmpInfo;
m_pBmp->GetBitmap(&bmpInfo);
BYTE *rgba = (BYTE*)bmpInfo.bmBits;
BYTE *rgbb = (BYTE*)m_pdwRGBAData;
long i;
for(i=0;i<bmpInfo.bmHeight*bmpInfo.bmWidth;i++)
{
if(rgba[0]!=rgbb[0]||rgba[1]!=rgbb[1]||rgba[2]!=rgbb[2]) //颜色不同
{
if((rgbb[3] == 0x00 && m_bTransAlphaUpdate)|| //透明Alpha值更新
(rgbb[3] != 0x00 && m_bSemiTransAlphaUpdate)) //半透明 Alpha值更新
{
// rgba[3]=0xFF;
}
rgba+=4;
rgbb+=4;
}
}
}
}
}
{
if(m_hWnd&&m_iWidth&&m_iHeight&&m_pdwRGBAData&&m_pDC&&m_pBmp)//指针正确
{
//获取屏幕DC
CDC dcScreen;
dcScreen.Attach(::GetDC(NULL));
//处理Alpha 通道
DealAlphaChannel();
CRect rectDlg;
GetWindowRect(m_hWnd,&rectDlg);
CPoint ptWindowScreenPosition(rectDlg.TopLeft());
if(pTopLeft)
{
ptWindowScreenPosition.x=pTopLeft->x;
ptWindowScreenPosition.y=pTopLeft->y;
}
//刷新到屏幕上
CSize szWindow(m_iWidth, m_iHeight);
CPoint ptSrc(0,0);
int alpha;
switch(type)
{
case 2: //淡出
for(alpha=m_iWndSemiTransAlpha;alpha>=0;alpha--)
{
BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, alpha,AC_SRC_ALPHA };
UpdateLayeredWindow(m_hWnd, dcScreen, &ptWindowScreenPosition, &szWindow, *m_pDC,&ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
}
break;
case 1: //淡入
for(alpha=0;alpha<=m_iWndSemiTransAlpha;alpha++)
{
BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, alpha,AC_SRC_ALPHA };
UpdateLayeredWindow(m_hWnd, dcScreen, &ptWindowScreenPosition, &szWindow, *m_pDC,&ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
}
break;
case 0: //直接刷新
default:
BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, m_iWndSemiTransAlpha,AC_SRC_ALPHA };
UpdateLayeredWindow(m_hWnd, dcScreen, &ptWindowScreenPosition, &szWindow, *m_pDC,&ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
break;
}
}//end if
}
空 气 15:12:25
// 处理Alpha通道 处理用户绘制部分的不透明度
void CSemiTransWnd::DealAlphaChannel(void)
{
if(m_pdwRGBAData&&m_pBmp) //指针正确
{
if(m_bSemiTransAlphaUpdate||m_bTransAlphaUpdate)//需要处理Alpha
{
//获取位图数据
BITMAP bmpInfo;
m_pBmp->GetBitmap(&bmpInfo);
BYTE *rgba = (BYTE*)bmpInfo.bmBits;
BYTE *rgbb = (BYTE*)m_pdwRGBAData;
long i;
for(i=0;i<bmpInfo.bmHeight*bmpInfo.bmWidth;i++)
{
if(rgba[0]!=rgbb[0]||rgba[1]!=rgbb[1]||rgba[2]!=rgbb[2]) //颜色不同
{
if((rgbb[3] == 0x00 && m_bTransAlphaUpdate)|| //透明Alpha值更新
(rgbb[3] != 0x00 && m_bSemiTransAlphaUpdate)) //半透明 Alpha值更新
{
// rgba[3]=0xFF;
}
rgba+=4;
rgbb+=4;
}
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了