用mfc写一个控件, 里面有个CMyDialog继承了CDialog, CMyDialog里设了一个定时器,每隔2秒刷新对话框。  主要代码如下:
CDialogCtrl     ----   控件类
CMyDialog       ----   自己的对话框类
CMyDailg : public CDialog
{
    OnPaint()   -----   画屏幕
    OnTimer()   -----   每隔2秒去掉OnPaint,以刷新屏幕
    ......
}
CDialogCtrl : public COleControl
{
   CMyDialog  m_myDlg;
   ......
}CDialgoCtrl::OnCreate()
{
   m_myDlg.Create()
   ....
}CDialgoCtrl::OnDraw()
{
   m_myDlg.MoveWindow(rcBounds, TRUE);
   .......
}
现有两个问题
1, 该控件的CPU占有率是在太高, 98%左右
2, 该控件没有实现每隔2秒刷新控件界面的功能。请各位看看,肯定会多多给分的。

解决方案 »

  1.   

    每Draw一次移动窗口,导致窗口重画,再Draw一次,循环调用……
    WM_TIMER的优先级又低,改成m_myDlg.MoveWindow(rcBounds, FALSE);trytry
      

  2.   

    每Draw一次移动窗口,导致窗口重画,再Draw一次,循环调用……
      

  3.   

    在OnDarw中改为
    m_myDialog.Invalidate();
    而rcBounds改在WM_SIZE的响应中处理,这应该能减少一些。
    还想减少的话,我认为可能是其它地方的代码,需要源码
      

  4.   

    我的想法是, 在OnDraw()里,实现把对话框显示出来,让对话框就是控件的外观, 对话框类自己实现刷新对话框界面, 这样就实现了控件每隔一定时间变换外观。
    现在把m_myDlg.MoveWindow改成了m_myDlg.ShowWindow(SW_SHOW), CPU占有率是下来了, 可是外观不更新。
      

  5.   

    现在cpu占有率的问题是下来了,但是,每次刷新控件外观得时候,会把原来的背景留下了,导致新旧背景同时留在控件上。
    我现在的做法是
    CDialgoCtrl中有一个接口函数, ChangeColor();
    void CDialgCtrl::ChangeColor()
    {
        m_myDialog.StartChange();
    }在CMyDailg中
    void CMyDailg::StartChange()
    {
        SetTimer(1, 1000, NULL);
    }void CMyDailg::OnTimer()
    {
         ........//修改背景
        OnPaint();
    }
     这样, 导致了上述问题
      

  6.   

    做个线程, 专门用于处理重画, CMyDialog作为参数传给它.
      

  7.   

    我只是做一个滚屏字幕的控件而已。用SetTimer来使字显示在控件的不同位置。
    现在得问题是字在滚屏的时候, 没有把上次的位置刷新, 使得控件上都是字。
    请问,Zeroxy什么好的建议, 或例子
      

  8.   

    用变量m_pos表示当前文字的位置,
    在Dialog的OnTimer里面改变m_pos的值,然后让ActiveX Invalidate
    在ActiveX的OnDraw里面按照新的m_pos重新绘制文字。
      

  9.   

    在OnPaint()里先写擦除代码,在写绘制内容代码
      

  10.   

    你应该考虑使用BitBlt 减少重画的工作量
      

  11.   

    呵呵,主要问题还是在OnDraw中,你去MoveWindow干什么?程序会不断的去调用OnDraw,CPU当然很高了