从网上下载的透明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
我的控件和背景图都是采用双缓冲的方式画的,我想借助透明控件来显示图片,好方便调整图片位置,不想在对话框界面里再去写很多做图的代码,这样操作起来比较麻烦