在用ActiveX控件绘图时,我想为一幅位图加上一个以1Hz频率闪动的黄色矩形边框。为控件添加了Oncreate和Ontimer函数,在oncreate里面设置了定时器settimer(1,1000,NULL),在Ontimer中添加了如下代码:
void CRunPlanInfoCtrl::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CDC* pDC=GetDC();
pDC->SetBkMode(TRANSPARENT);
if (m_D6InfoCtrl==11||m_D6InfoCtrl==13||m_D6InfoCtrl==14)
{
CPen newpen(PS_SOLID,1,RGB(223,223,0));      // 定义黄色画笔
CPen* oldpen=pDC->SelectObject(&newpen);
                   // 绘制矩形
pDC->MoveTo(m_ptOrigin.x+m_smallchange2/6,m_ptOrigin.y+m_smallchange2/6);
pDC->LineTo(m_D6Length-m_ptOrigin.x-m_smallchange2/6,m_ptOrigin.y+m_smallchange2/6);
pDC->MoveTo(m_D6Length-m_ptOrigin.x-m_smallchange2/6,m_ptOrigin.y+m_smallchange2/6);
pDC->LineTo(m_D6Length-m_ptOrigin.x-m_smallchange2/6,m_D6Length-m_ptOrigin.y-m_smallchange2/6);
pDC->MoveTo(m_D6Length-m_ptOrigin.x-m_smallchange2/6,m_D6Length-m_ptOrigin.y-m_smallchange2/6);
pDC->LineTo(m_ptOrigin.x+m_smallchange2/6,m_D6Length-m_ptOrigin.y-m_smallchange2/6);
pDC->MoveTo(m_ptOrigin.x+m_smallchange2/6,m_D6Length-m_ptOrigin.y-m_smallchange2/6);
pDC->LineTo(m_ptOrigin.x+m_smallchange2/6,m_ptOrigin.y+m_smallchange2/6);
pDC->SelectObject(oldpen);
}
CPen newpen1(PS_SOLID,1,RGB(3,17,34));              // 选择背景色画笔颜色,使黄色矩形边框消失
CPen* oldpen1=pDC->SelectObject(&newpen1); pDC->MoveTo(m_ptOrigin.x+m_smallchange2/6,m_ptOrigin.y+m_smallchange2/6);
pDC->LineTo(m_D6Length-m_ptOrigin.x-m_smallchange2/6,m_ptOrigin.y+m_smallchange2/6);
pDC->MoveTo(m_D6Length-m_ptOrigin.x-m_smallchange2/6,m_ptOrigin.y+m_smallchange2/6);
pDC->LineTo(m_D6Length-m_ptOrigin.x-m_smallchange2/6,m_D6Length-m_ptOrigin.y-m_smallchange2/6);
pDC->MoveTo(m_D6Length-m_ptOrigin.x-m_smallchange2/6,m_D6Length-m_ptOrigin.y-m_smallchange2/6);
pDC->LineTo(m_ptOrigin.x+m_smallchange2/6,m_D6Length-m_ptOrigin.y-m_smallchange2/6);
pDC->MoveTo(m_ptOrigin.x+m_smallchange2/6,m_D6Length-m_ptOrigin.y-m_smallchange2/6);
pDC->LineTo(m_ptOrigin.x+m_smallchange2/6,m_ptOrigin.y+m_smallchange2/6); pDC->SelectObject(oldpen1);
COleControl::OnTimer(nIDEvent);
}
我这样做了之后貌似并没有出现边框的闪烁,如果用Invalidate()的话会使得整个控件闪烁,大家又啥好的解决办法吗?求助

解决方案 »

  1.   

    你稍微变一下,在第一个timer时,画成黄色的,在下一个timer时擦掉.是不是就有闪烁的效果了
      

  2.   

    不是很清楚你的意思,在settimer了之后Ontimer每1s都要重新执行一次吧。你的意思是把绘制黄色矩形边框的那部分代码放到Ondraw里面,然后在Ontimer中执行有newpen1的那段代码?如果是这样,我试过,黄色边框是有了,但是只能显示一秒,一秒钟之后该区域被重新填回背景色时,就一直不会出现黄色边框了。
      

  3.   

    每次Ontimer的时候记一下数m_Index++,Ontimer里面m_Index为奇数时画黄边框,偶数时画白边框
      

  4.   

    该问题已解决,谢谢King_hhuang。给分!