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

水瓶座雨夕 2016-10-13 01:16:35
请教各位一个问题:

子窗口使用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,效果正常,但是移动时闪烁
...全文
434 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
水瓶座雨夕 2016-10-27
  • 打赏
  • 举报
回复
非常感谢!!
schlafenhamster 2016-10-27
  • 打赏
  • 举报
回复
给你做好了。 “2个窗口移动的例子 ” http://download.csdn.net/detail/schlafenhamster/9660736 “本资源含2个例子说明 vc6 上怎么使用 PrintWindow()以及 AlphaBlend()” 你的那个 是 “DlgAlphaBlend”
水瓶座雨夕 2016-10-27
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
void CTestDlg::OnMoving(UINT fwSide, LPRECT pRect) { CDialog::OnMoving(fwSide, pRect); // TODO: Add your message handler code here CRect rect; GetWindowRect(&rect); GetParent()->ScreenToClient(&rect); GetParent()->InvalidateRect(&rect); // InvalidateRect(NULL); 多了!!! }
你好,感谢回复,实在抱歉,前阵子在国外忙些私事,没有及时看贴。 这里我也尝试修改过,依然会闪烁,我的子窗口是对话框中的半透明小方框,为了实现一种半透明覆盖的效果,这个半透明的子窗口可以移动,在移动中子窗口会闪。
schlafenhamster 2016-10-14
  • 打赏
  • 举报
回复
schlafenhamster 2016-10-14
  • 打赏
  • 举报
回复
主对话框 onpaint else { CPaintDC dc(this); // device context for painting CRect rect; GetClientRect(rect); dc.FillSolidRect(rect, RGB(0, 255, 0)); // dc.TextOut(300, 200, _T("1521521521521521521521")); // CDialog::OnPaint(); } 你的代码 把 按钮 都 画没了 !
schlafenhamster 2016-10-14
  • 打赏
  • 举报
回复
void CTestDlg::OnMoving(UINT fwSide, LPRECT pRect) { CDialog::OnMoving(fwSide, pRect); // TODO: Add your message handler code here CRect rect; GetWindowRect(&rect); GetParent()->ScreenToClient(&rect); GetParent()->InvalidateRect(&rect); // InvalidateRect(NULL); 多了!!! }

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧