程序中有一个ProgressBar,同时有一个菜单和一个RichEdit。当鼠标放到任何一个菜单的子项上面(不点击)的时候,progressbar就有的时候会出现运动不连贯的情况,会运动一段停一下,然后再继续动,再停一下。如果鼠标在Item上面来回运动,则没有这个问题。后来我new了一个工程,只放了菜单和Progressbar,没有这个问题。但是上面这个情况的时候,并没有对RichEdit做任何的事情啊。我让RichEdit Visible=false就好了。有没有好地解决办法?

解决方案 »

  1.   

    你的程序是基于对话框的吗??把关于Progressbar操作的那一段代码贴出来看看。。
      

  2.   

    是基于对话框的。代码就是在OnTimer里面StepIt(),然后剩下的都是下终止条件。逻辑比较复杂,贴出来反而弄乱了。之前通过SetTimer启动Timer得,设置了SetRange.
      

  3.   

    在OnTimer中判断定时器 id了吗
      

  4.   

    可能问题不在richedit这里,还是检查一下你的所谓复杂的逻辑。
      

  5.   

    ID判断了。问题是我把RichEdit得visible改成false,就没有这个问题,那应该不是OnTimer里面的问题啊,而且OnTimer里面也没有对RichEdit的任何操作。true话就有的时候会出现,而且出现的时机不是固定的,是不是跟消息处理有关呢?OnTimer得优先级是不是比较低呢?能否调整?补充一点,RichEdit我自己派生过,用的是LogRichEdit。
      

  6.   

    大家估计一下会是什么原因吧,我把RichEdit的visible改成隐藏就好了,但是该有的功能没有动。但是显示出来就出现上面的毛病,很是奇怪。本来估计是消息阻塞,但是我用spy++看过,那个时候也没有什么消息发送给主窗口阿。progressbar的断断续续是收到WM_TIMER的影响,用spy++可以看到WM_TIMER接受的就是
    断断续续的。请问有人能大胆猜测一下么。
      

  7.   

    发现了一个现象,在上面这种情况下,我的richedit多次收到了WM_SYSTIMER这个消息,但是我没有在msdn里面查到。这个消息的收到频率和我的progressbar的停顿正好对应。
      

  8.   

    Copy from MSDNThe WM_SYSTIMER message in Windows is an undocumented system message; it should not be trapped or relied on by an application. This message can occasionally be viewed in Spy or in CodeView while debugging. Windows uses the WM_SYSTIMER message internally to control the scroll rate of highlighted text (text selected by the user) in edit controls, or highlighted items in list boxes. NOTE: The WM_SYSTIMER message is for Windows's internal use only and can be changed without prior notice.If you do not want OnIdle to be called whenever a message is retrieved from the message queue, you can override the CWinThread::IsIdleMessage. If an application has set a very short timer, or if the system is sending the WM_SYSTIMER message, then OnIdle will be called repeatedly, and degrade performance.
      

  9.   

    根据上面的提示,你可以试试重载OnIdle函数
      

  10.   

    重载OnIdle然后里面写什么呢?什么都不写?注释掉对OnIdle的调用?会不会出什么问题?
      

  11.   

    我重载了App的OnIdle,把里面对父类的OnIdle调用注释掉了,返回TRUE和FALSE都试过,问题依旧。我的程序的确set a very short timer,同时我奇怪的是,WM_SYSTIMER会发送给我派生的RichEdit,而且发送的时候正好是WM_TIMER停顿的时候。
      

  12.   

    WM_KICKIDLE是做什么用的?和这个有什么关系么