我用一个ole控件来显示gif图片,然后将控件插入richedit从而实现在richedit中显示GIF图片。但是有个问题,gif的图片是通过定时器定时刷新的,而每当gif刷新的时候会影响到richedit,表现为,如果gif图片在richedit中只显示了一半,当gif刷新的时候,整个gif会显示出来,就好像我移动了滚动条。如果我正在看richedit中其他部分的内容,会受到干扰。我希望gif的图片刷新不要改变richedit当前的显示。不知道如何处理?
类似的问题还有一个,如果将次控件放入richedit做的输入框,每次gif刷新的时候,richedit都会响应editchange这种消息,我不希望让其相应这个消息。而且我不希望在 editchange这个消息处理中做判断,应为如果有大量gif,频繁相应次处理函数,会影响效率。

解决方案 »

  1.   

    局部刷新:
     用InvalidRect这个API函数来使部分区域无效,即刷新自定义的区域。   
          不过,其实最好还是不要直接在屏幕DC中InvalidRect,应该先创建一个内存兼容DC,然后在内存兼容DC中用这个函数,最后再从内存兼容DC中BitBlt到屏幕DC,这样可以更好解决屏幕闪烁。   
        
      

  2.   

    我并不是单纯的要局部刷新,我是要在让我显示gif的部分刷新的情况下阻止richedit的刷新
      

  3.   

    这个要从你的OLE控件入手修改其行为。什么控件呢?
      

  4.   

    简单的说,就是在控件中显示一张图片,然后开启个定时器,定时重新绘制新的图片,从而显示出gif的动画效果
      

  5.   

    应该是定时刷新的行为不当引起的,本来这种刷新就不应该影响容器窗口,也不应该发生editchange事件。
    你的控件怎么实现的?
      

  6.   

    class CWinHidden : public CWindowImpl<CWinHidden, CWindow, CNullTraits>
    {
         ..........     public:
    void AttachCtl(CImageShowCtl* pFullCtrl)
    {
    m_pFullCtrl = pFullCtrl;
    } BOOL SetThisTimer(UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc )
    {
    if (m_hWnd == NULL)
    {
    RECT rt = {0, 0, 0, 0};
    Create(NULL, rt);
    }
    m_nTimer = ::SetTimer(m_hWnd, nIDEvent, uElapse, lpTimerFunc);
    return m_nTimer == 0;
    } LRESULT OnTimer(UINT, WPARAM, LPARAM, BOOL&);
         CImageShowCtl*   m_pFullCtrl;//我的控件指针
         ..........
    }LRESULT CWinHidden::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    if (m_pFullCtrl != NULL)
    m_pFullCtrl->ChangePic();//绘图,刷新

    return 0;
    }然后我的控件中
    // CImageShowCtl
    CWinHidden m_WinHidden;//使用中
    m_WinHidden.AttachCtl(this);
    m_WinHidden.SetThisTimer(1, 10, NULL);//绘图,刷新
    void CImageShowCtl::ChangePic()
    {
    if(m_Time == m_Gif.GetFrameDelay(m_CurrentPic) * 10)//是否改变图片显示
    {
    m_CurrentPic++; if(m_CurrentPic >= m_PicNum)
    {
    m_CurrentPic = 0;
    } FireViewChange(); m_Time = 10;
    }
    else
    {
    m_Time += 10;
    }
    }
      

  7.   

    按照各位高手的思路,我在想是不是FireViewChange(); 这个函数的问题?如果是?我应该怎么修改呢,主要是思路
      

  8.   

    有可能是Fire...的问题。看一下代码
      

  9.   

    请问你FireViewChange() 这个函数是不是调用了invalidate()呀
      

  10.   

    问题就是在FireViewChange() 里面,把这个注掉就不刷新动画了,不过也没想出有什么办法可以解决,期待高人,继续关注