`
风吹过PP好冷
  • 浏览: 38049 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

利用 SetRedraw 减少闪烁 提高绘制效率

阅读更多

在实际应用中,CTabCtrl或者CListCtrl在插入大量数据时界面绘制变发生剧烈闪烁,并且插入效率较慢。利用SetRedraw可以解决此问题。实际测试CTabCtrl插入上千条记录未优化前需要30~40秒,优化后需要1~2秒。

 

摘自百度百科

CWnd::SetRedraw  void SetRedraw( BOOL bRedraw = TRUE );  参数: bRedraw 指定了重画标志的状态。如果这个参数为TRUE,则重画标志被设置;如果为FALSE,则该标志被清除。  说明:  应用程序调用SetRedraw以允许重画变化或防止变化被重画。

  这个成员函数设置或清除重画标志。当重画标志被清除时,在每次变化以后,内容不会更新,直到重画标志被设置才会重新绘出。例如,如果一个应用程序需要在列表框中加入几个项,则可以清除重画标志,加入项,然后设置重画标志。最后,应用程序可以调用Invalidate或InvalidateRect成员函数以使列表框被重画.

 

相关代码:

class CWndRedraw
{
public:
    CWndRedraw(CWnd *pWnd)
    {
        m_pWnd = pWnd;
        if(m_pWnd)
        {
            m_pWnd->SetRedraw(FALSE);
        }
    }
    ~CWndRedraw()
    {
        if(m_pWnd)
        {
            try
            {
                m_pWnd->SetRedraw(TRUE);
            }
            catch (...)
            {
                // throw no exception in destructor
            }
        }
    }
private:
    CWnd* m_pWnd;
};
 
分享到:
评论

相关推荐

    VC6 自制ListCtrl类 解决闪烁

    **自定义消息处理**:通过对特定消息(如`WM_PAINT`)的处理,我们可以控制ListCtrl的绘制行为,比如使用`CListCtrl::SetRedraw(FALSE)`暂时禁用重绘,插入数据后再恢复(`SetRedraw(TRUE)`),这也可以避免闪烁。...

    MFC窗口隐藏时解决闪烁问题

    3. **利用CS_DBLCLKS风格**:虽然这个风格主要用于处理双击事件,但它也可以帮助改善窗口的重绘性能,减少闪烁。在创建窗口时,添加`CS_DBLCLKS`风格。 ```cpp Create(NULL, _T("My Window"), WS_OVERLAPPEDWINDOW ...

    richtextbox闪烁

    在Windows Forms应用程序中,`...通过在操作前禁用重绘,然后在操作完成后启用并强制重绘,可以显著减少闪烁现象,提供更流畅的用户体验。这种方法尤其适用于处理大量文本或者频繁更新`richtextbox`内容的场景。

    一个样本的自定义绘制按钮控制演示

    通过这个示例,你可以学习到如何在MFC环境中利用自定义绘制功能来增强UI的个性化,以及如何处理与控件绘制相关的Windows消息。阅读readme.doc文件可以获取更具体的实现细节和步骤指导,而源代码本身则是最好的学习...

    MFC绘制皮肤-界面重绘

    最后,为了提高性能,避免不必要的重绘,可以使用RedrawWindow()函数来指定需要更新的区域,或者通过SetRedraw(FALSE)和SetRedraw(TRUE)控制窗口的重绘状态。 总的来说,MFC绘制皮肤和界面重绘是一项涉及多方面技术...

    实时动态画图

    通过以上步骤,我们就可以在MFC中实现实时动态画图,同时利用双缓存技术提高效率,避免屏幕闪烁。在`DrawPicture`文件中,可能包含了实现这一功能的具体代码,包括类定义、消息映射、绘图逻辑等。读者可以通过分析...

    PB中常用的函数

    dw_list.Retrieve( ) setredraw() 的使用方法,一般情况是 控件名.setredraw(Boolean)

    C++中MFC实现画硬币

    这可以通过在每个帧间更新硬币数量并绘制,然后使用SetRedraw(false)和SetRedraw(true)来暂停和恢复视图的自动重绘,实现动画效果。 总的来说,"C++中MFС实现画硬币"项目涵盖了MFC中的视图绘图、事件处理、用户...

    VC中的所有WM消息.doc

    1. windows消息WM_ 2. WM_NULL = $0000; 3. WM_CREATE = $0001; 4. 应用程序创建一个窗口 5. WM_DESTROY = $0002;...19. WM_SETREDRAW = $000B; 20. 设置窗口是否能重画 21. WM_SETTEXT = $000C;

    CListCtrl(Lib).rar_CListCtrlEx_CListCtrl自绘_clistctrl 自绘_clistct

    7. **性能优化**:在自绘过程中,为了提高性能,可以使用CDC的BeginPaint和EndPaint函数来减少设备上下文的创建和销毁次数,以及利用CClientDC来避免重复创建设备上下文。 8. **复用代码**:为了代码的可维护性,...

    VC 颜色渐变效果的进度条

    - 如果进度条变化不频繁,可以考虑使用双缓存技术,将绘制结果保存在内存中,减少屏幕重绘次数,提高性能。 4. **代码示例** - 创建一个CMyProgressCtrl类,继承自CProgressCtrl,并实现上述提到的自定义绘制逻辑...

    VC++ MyButton 自绘按钮

    这可能涉及到更多的绘图技术,如使用RoundRect()绘制圆角矩形,或者利用GDI+的LinearGradientBrush进行渐变填充。 8. **性能优化** 考虑到效率,我们应当避免不必要的重绘。可以通过SetRedraw(false)暂时禁用控件...

    C++ 关于MFC List Control 控件的总结

    1\在开发项目时,使用到了 listcontrol 控件,就一些问题,做一下备注,以备以后使用 ... 来禁止 重画,这样可以提高效率.当添加完成后,可以 使用 .SetRedraw(true); 重新启用重画  (5) 添加项目: m_List_IpList.Inse

    SWT中利用Treeview来显示XML文件

    7. **优化性能**:为了提高性能,可以使用`Tree.setRedraw(false)`和`Tree.setRedraw(true)`来控制Treeview的重绘,避免不必要的屏幕刷新。 在`xmlTreeDemo`这个项目中,可能包含了示例代码,演示了如何实现上述...

    所有者在WTL中绘制ListView

    6. **性能优化**:在处理大量项时,可以使用`SetRedraw(false)`暂时禁用重绘,避免频繁的屏幕刷新,待所有操作完成后,再调用`SetRedraw(true)`恢复。 示例代码中的压缩包可能包含以下内容: - `Owner-Drawn-...

    易语言置超级列表框背景图片_列程源码,易语言超级列表框设置背景

    请注意,为了防止闪烁,我们还需要在设置背景后发送`WM_SETREDRAW`消息来重新绘制控件。 总之,通过易语言中的`SendMessageA`函数和`LVBKIMAGE`结构,我们可以灵活地为超级列表框设置自定义背景图片,提升应用的...

    mfc自绘Edit

    可以使用UpdateWindow()和RedrawWindow()函数来控制重绘的范围,或者使用SetRedraw()函数暂时禁用和启用重绘,提高效率。 10. **多线程和同步**:在多线程环境中,自绘Edit可能需要考虑线程安全问题,防止多个线程...

    VC++ Windows自定义按钮重载.rar

    可以使用UpdateWindow()或RedrawWindow()函数来控制重绘,并利用SetRedraw(FALSE)和SetRedraw(TRUE)来临时禁用和启用控件的重绘。 通过以上步骤,开发者可以在VC++ MFC环境中创建具有独特特性的自定义按钮,以提升...

    MFC控件CTabCtrl的重绘,支持背景颜色、tab头字体颜色、背景色的修改

    重绘过程中,为了保持性能,可以利用Windows的消息机制,只在必要时(如tab切换、窗口大小改变等)才触发重绘。可以通过`SetRedraw`函数暂时关闭或开启控件的重绘功能,这样可以避免不必要的绘图操作。 除了`...

    CTreeCtrl控件重绘总汇

    - 使用Cache Bitmaps:对于不经常变化的部分,可以先绘制到位图,然后在需要时快速复制,提高重绘效率。 6. **事件处理** - TVN_BEGINDRAG:处理开始拖放事件,绘制拖放指示器。 - TVN_BEGINRDRAG:处理右键拖放...

Global site tag (gtag.js) - Google Analytics