程序中有一个ProgressBar,同时有一个菜单和一个RichEdit。当鼠标放到任何一个菜单的子项上面(不点击)的时候,progressbar就有的时候会出现运动不连贯的情况,会运动一段停一下,然后再继续动,再停一下。如果鼠标在Item上面来回运动,则没有这个问题。在上面这种情况下,我的richedit多次收到了WM_SYSTIMER这个消息。这个消息的收到时刻正好和progressbar的停顿对应。这个RichEdit具有Tooltip的功能,我在OnMouseMove中会根据鼠标当前的位置提取左右的字母。我把这一块注释掉就好了,但是这个功能必须要的阿。是什么原因?

解决方案 »

  1.   

    可否将代码发线我,我仔细看一下。
    [email protected]
      

  2.   

    麻烦就在代码还不能传出去
    我现在也是非常郁闷,知道这样很难解决问题。能否根据我的描述,做一些猜测,我可以去调查。现在我是一点方向都没有,本来觉得可能WM_TIMER优先级比较低,可能出现阻塞,导致WM_TIMER的接受不连续,但是用spy++查看,RichEdit除了收到WM_SYSTIMER以外没有受到其他消息。也就是这个时候
    progressbar会停顿下来。我的感觉是肯定和WM_TIMER以及我派生的这个RichEdit有关,但是不清楚原因在哪。如果把这个RichEdit给Disable掉,就没有这个问题,但是我的OnMouseMove就没有办法响应了。如果把它的
    visible改成false也没有上述问题,但是这个控件就看不到了,都不行我曾经换过一个定时器,不用WM_TIMER,好像是可以好,但是后来上面说不能改定时器,怕引起其他
    的bug(曾经就引起过)所以现在不知道该怎么办好,希望得到一点启发。
      

  3.   

    现在发现换了定时器就好了,原来用的是WM_TIMER,现在换成多媒体定时器就没有这个问题了,但是我怕这两个定时器有什么区别会导致别的bug,因为以前就是换了以后,两个定时器对0的操作有区别。WM_TIMER时setTimer设置0没有问题,但是多媒体定时器设置0就真的是0了,不掉用callback了,请问除了这个以外还有没有别的区别呢。
      

  4.   

    给progressbar开一个线程是否会有用?
      

  5.   

    可能是这样的,当鼠标移动时,先响应OnMouseMove的消息,然后在响应progressbar的消息,所以导致停滞现象。不知道你是否有自己发的消息,如果有的话,可以这样:
    1:使用PostMessage代替SendMessage,因为PostMessage发出消息后立即返回,不需要等待;
    2:或者给progressbar开一个线程
      

  6.   

    WM_TIMER 是一个低级别的消息!!
    只有在消息队列里没有其他消息的时候才响应它的。
      

  7.   

    不用定时器,改用线程,用GetTickCount代替定时器应该没有问题
      

  8.   

    有可能是刷新重画的问题,progressbar的运动,只是一个重画动作
    给progressbar开一个线程,自己完成重画