请教一个关于子窗口使用AlphaBlend半透明,在父窗口移动闪烁的问题
子窗口使用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函数实现半透明效果。
Unity植被渲染中AlphaTest硬边问题的全链路解决方案
Alpha测试(AlphaTest)是实时渲染中处理透明或镂空效果的常用技术,其核心原理是通过阈值比较决定像素的保留或丢弃,实现像素级精准剔除。这种二值化操作虽然性能开销低,但会因纹理过滤、Mipmap插值及深度测试机制,在物体边缘产生锯齿状“硬边瑕疵”,严重影响视觉质感。在植被、铁丝网等高频细节模型的渲染中,此问题尤为突出。其技术价值在于,在维持AlphaTest高性能优势的前提下,通过纹理制作规范、Shader算法优化及渲染管线协同,实现边缘视觉表现的显著提升。应用场景广泛覆盖游戏开发、虚拟现实及数字孪
Unity移动端性能优化:深度解析OverDraw成因与实战解决方案
在计算机图形学与游戏开发中,渲染管线是决定最终画面呈现的核心流程。其原理涉及CPU向GPU提交绘制指令(Draw Call),并由GPU执行顶点处理、光栅化、像素着色等步骤,最终将像素填充到帧缓冲区。这一过程的技术价值在于平衡视觉表现与硬件资源消耗,尤其在移动端,GPU的像素填充率(Pixel Fillrate)是关键的瓶颈资源。当同一屏幕像素在单帧内被多次绘制时,即发生过度绘制(OverDraw),这会急剧消耗宝贵的填充率带宽,导致帧率下降、设备发热和功耗增加。其应用场景广泛存在于UI界面叠加、粒子特效滥
Delphi界面开发例子
在Delphi中,可以使用FlashWindow函数来让窗体标题栏闪烁。这个函数来自Windows API,通过调用它并传递窗体的句柄,可以实现窗口的闪烁效果。
ContourBitmapDemo.rar_图形图像处理_Visual_C++_
而在OnMouseMove方法中,将根据鼠标的新位置调整窗口的位置,以实现鼠标跟随效果。为了使窗口边缘平滑,可能还使用AlphaBlend函数来处理窗口的透明度。


界面
