当前位置: 代码迷 >> VC >> 透明Button控件腾挪位置有残影
  详细解决方案

透明Button控件腾挪位置有残影

热度:4605   发布时间:2013-02-25 00:00:00.0
透明Button控件移动位置有残影
   从网上下载的透明button按钮,放到一个有背景图的对话框里,用定时器每200ms移动一下它的位置,设置位置是用MoveWindow也用SetWindowPos测试过,再绘制的时候不会出现明显的闪烁,但是会把我窗体上该控件所在位置处的背景图片也绘制出来,形成残影,背景擦除实践我已经重载,用来画我的背景图,代码如下:
BOOL CCButtonDemoDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

// return CDialog::OnEraseBkgnd(pDC);

CRect rtClient;
GetClientRect(rtClient);

m_bkImage.Show(pDC,rtClient); // 画背景图
rtClient.right = 1279;
rtClient.bottom = 873;
Invalidate(false);

return true;
}
以下是用两种方法分别设置控件位置的函数代码:
// MoveWindow 能成功移动控件位置,但是有残影 
void CCButtonDemoDlg::SetCtrlPos(CWnd* pInterfaceWnd, int id, CPoint pt) 
{
CWnd* pWnd = pInterfaceWnd->GetDlgItem(id);
if(pWnd != NULL)
{
CRect ctrlRect;
pWnd->GetClientRect(&ctrlRect);
pWnd->MoveWindow(pt.x,pt.y,ctrlRect.Width(),ctrlRect.Height(),true);
}
}
// SetWindowPos
void CCButtonDemoDlg::SetCtrlPos(CWnd* pInterfaceWnd, int id, CPoint pt) 
{
CWnd* pWnd = pInterfaceWnd->GetDlgItem(id);
if(pWnd != NULL)
{
              CRect ctrlRect;
     pWnd->GetClientRect(&ctrlRect);
     CRect rect;
     pWnd->GetWindowRect(&rect); 
              ScreenToClient(&rect);  
     rect.left = pt.x;
     rect.top = pt.y;
     rect.right = rect.left +  ctrlRect.Width();
     rect.bottom = rect.top + ctrlRect.Height();
              pWnd->Invalidate(true); // 加上这句不会出现残影,但是界面闪烁厉害
     pWnd->SetWindowPos(&wndTop, 
rect.left,rect.top,rect.Width(),rect.Height(),SWP_SHOWWINDOW);
}
}
------解决方案--------------------------------------------------------
强制刷新客户区看看。如果是闪烁,考虑使用double buffer。
------解决方案--------------------------------------------------------
谢谢devmiao
我的控件和背景图都是采用双缓冲的方式画的,我想借助透明控件来显示图片,好方便调整图片位置,不想在对话框界面里再去写很多做图的代码,这样操作起来比较麻烦
  相关解决方案