请教一个关于子窗口使用AlphaBlend半透明,在父窗口移动闪烁的问题

水瓶座雨夕 水瓶座雨夕 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
请教各位一个问题:

子窗口使用AlphaBlend半透明,显示在父窗口上,在移动子窗口时,子窗口会闪烁。

父窗口的clip children 属性如果设置为true的话,子窗口在移动时会因为没有擦出父窗口上对应区域而不断加深颜色。该属性设置为false则可正常绘制,出现上面说的情况,会闪烁。

请各位帮忙看一下代码,看看哪里有问题?

父窗口 OnPaint:

CPaintDC dc(this);

CRect rect;
GetClientRect(rect);

dc.FillSolidRect(rect, RGB(0, 255, 0)); //
dc.TextOut(300, 200, _T("1521521521521521521521"));

CDialogEx::OnPaint();


子窗口:

void CTestDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting

CRect rect;
GetClientRect(&rect);

CDC cdc;
cdc.CreateCompatibleDC(&dc);

CBitmap bitmap, MaskBitmap, *pOldBitmap, *pOldMaskBitmap;
bitmap.CreateCompatibleBitmap(&dc, rect.right, rect.bottom);

pOldBitmap = cdc.SelectObject(&bitmap);

CRect src(rect);
src.OffsetRect(CSize(-rect.left, -rect.top));

cdc.FillSolidRect(src, RGB(255, 0, 255));

BLENDFUNCTION bf;
memset(&bf, 0, sizeof(bf));
bf.SourceConstantAlpha = 0x2f;
bf.BlendOp = AC_SRC_OVER;

::AlphaBlend(dc.GetSafeHdc(), rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
cdc.GetSafeHdc(), src.left, src.top, src.right - src.left, src.bottom - src.top, bf);

cdc.SelectObject(pOldBitmap);
cdc.DeleteDC();
pOldBitmap->DeleteObject();
bitmap.DeleteObject();
}

void CTestDlg::OnMoving(UINT fwSide, LPRECT pRect)
{
CDialogEx::OnMoving(fwSide, pRect);

CRect rect;
GetWindowRect(&rect);
GetParent()->ScreenToClient(&rect);
GetParent()->InvalidateRect(&rect);

InvalidateRect(NULL);
}

BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)
{

//return CDialogEx::OnEraseBkgnd(pDC);
return TRUE;
}

void CTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));

CDialogEx::OnLButtonDown(nFlags, point);
}



效果:
设置父窗口clip children属性为true,移动时加深颜色

设置父窗口clip children属性为false,效果正常,但是移动时闪烁
...全文

相关推荐

自绘窗口,贴图后的效果

**透明处理**:如果图像有透明部分,需要处理透明度,可以使用SetROP2设置混合模式,或者使用AlphaBlend函数实现半透明效果。

xwfde

Unity植被渲染中AlphaTest硬边问题的全链路解决方案

Alpha测试(AlphaTest)是实时渲染中处理透明或镂空效果的常用技术,其核心原理是通过阈值比较决定像素的保留或丢弃,实现像素级精准剔除。这种二值化操作虽然性能开销低,但会因纹理过滤、Mipmap插值及深度测试机制,在物体边缘产生锯齿状“硬边瑕疵”,严重影响视觉质感。在植被、铁丝网等高频细节模型的渲染中,此问题尤为突出。其技术价值在于,在维持AlphaTest高性能优势的前提下,通过纹理制作规范、Shader算法优化及渲染管线协同,实现边缘视觉表现的显著提升。应用场景广泛覆盖游戏开发、虚拟现实及数字孪

红茶漫山

Unity移动端性能优化:深度解析OverDraw成因与实战解决方案

在计算机图形学与游戏开发中,渲染管线是决定最终画面呈现的核心流程。其原理涉及CPU向GPU提交绘制指令(Draw Call),并由GPU执行顶点处理、光栅化、像素着色等步骤,最终将像素填充到帧缓冲区。这一过程的技术价值在于平衡视觉表现与硬件资源消耗,尤其在移动端,GPU的像素填充率(Pixel Fillrate)是关键的瓶颈资源。当同一屏幕像素在单帧内被多次绘制时,即发生过度绘制(OverDraw),这会急剧消耗宝贵的填充率带宽,导致帧率下降、设备发热和功耗增加。其应用场景广泛存在于UI界面叠加、粒子特效滥

weixin_34054931

Delphi界面开发例子

在Delphi中,可以使用FlashWindow函数来让窗体标题栏闪烁。这个函数来自Windows API,通过调用它并传递窗体的句柄,可以实现窗口的闪烁效果。

CKLi

ContourBitmapDemo.rar_图形图像处理_Visual_C++_

而在OnMouseMove方法中,将根据鼠标的新位置调整窗口的位置,以实现鼠标跟随效果。为了使窗口边缘平滑,可能还使用AlphaBlend函数来处理窗口的透明度。

pudn01
评论 6
收藏 已收藏
分享
返回顶部
水瓶座雨夕
界面 15,976 成员 115,866 内容