描述:
我使用了MEMDC(我改过了)。我设置了一个定时器。我想实现透明绘图到控件上。但我我不想在控件上显示除我要的图形外的任何其他背景。。。。。。比如我就只要画个圆,而且要在很高刷新状态不闪。
void CClockSta::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CStatic::OnPaint()
GetClientRect(&m_rect);
CTime time_cuurent;
time_cuurent=CTime::GetCurrentTime();
m_strTime=time_cuurent.Format("%Y 年 %m 月 % 日 %H : %M : %S ");
CMemDC pdc(&dc,m_rect); //默认位图是全黑色的
pdc.SelectObject(this->m_brushBlue);
pdc.SelectObject(this->m_pen);
CRect rect=m_rect;
rect.DeflateRect(1,1);
pdc.RoundRect(rect,CPoint(5,5));
pdc.SetBkMode(TRANSPARENT);
pdc.SetTextColor(m_TXcolor);
pdc.DrawText(m_strTime,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE );//DT_VCENTER|必须和DT_SINGLELINE一起
CMemDC pdc2(&dc,m_rect); //这个是屏蔽图,需要把底色设置为白色
pdc2.FillSolidRect(m_rect,RGB(255,255,255));
pdc2.SetROP2(R2_BLACK);
pdc2.SelectObject(this->m_brushBlue);
pdc2.SelectObject(this->m_pen);
pdc2.RoundRect(rect,CPoint(5,5));
pdc2.SetBkMode(TRANSPARENT);
pdc2.SetTextColor(RGB(0,0,0));
pdc2.DrawText(m_strTime,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE );
pdc2.BitBlt(SRCAND);//执行AND运算
pdc.BitBlt(SRCPAINT);//执行OR运算
}
当我设置SetTimer(1,1,0)的时候,很屏幕很闪。。。
pdc2.BitBlt(SRCAND);//执行AND运算
pdc.BitBlt(SRCPAINT);//执行OR运算
上面两句我随便注释掉一句问题,就不闪了。
解决方案1:
CMemDC是你自己定义的?!
从你的代码看,
pdc2.BitBlt(SRCAND);//执行AND运算
pdc.BitBlt(SRCPAINT);//执行OR运算
都是在向显示DC执行BitBlt操作? 如果是这样,由于你两次的时间间隔非常短,故会闪得非常厉害.因此也出现了你随便注释一句便不闪的现象.
你是不是可以先将要显示的图形在MEMDC中准备完成后再整体复制到显示DC中?