zoukankan      html  css  js  c++  java
  • 【转】防止CListCtrl闪烁的几种方法

    转载出处:http://blog.sina.com.cn/s/blog_5ee42ba30100g50j.html

    1.使用SetRedraw禁止窗口重绘,操作完成后,再恢复窗口重绘

    m_ctlList.SetRedraw(FALSE); 

    //以下为更新数据操作

    //……

    //恢复窗口重绘

    m_ctlList.SetRedraw(TRUE);

    2.使用LockWindowUpdate禁止窗口重绘,操作完成后,用UnlockWindowUpdate恢复窗口重绘

    m_ctlList.LockWindowUpdate(); 

    //以下为更新数据操作

    //……

    //恢复窗口重绘

    m_ctlList.UnlockWindowUpdate(); 

    3.使用ListCtrl的内部双缓冲

    m_ctlLisit.SetExtendedStyle(m_ctlLisit.GetExtendedStyle()|LVS_EX_DOUBLEBUFFER);

    VC6未定义LVS_EX_DOUBLEBUFFER宏,使用者可以自定义,如下:

    #define LVS_EX_DOUBLEBUFFER 0x00010000

    4.Virtual List

    首先要设置ListCtrl风格为LVS_REPORT | LVS_OWNERDATA或在ListCtrl属里中的More Styles页面中选中Owner data复选框。

    其次要向应LVN_GETDISPINFO消息;

    void OnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)
    {
     LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; 

     LV_ITEM *pItem = &(pDispInfo)->item;
     char szText[128] = {0};
     if (pItem->mask & LVIF_TEXT)
     {

    //使缓冲区数据与表格子项对应

    //m_ArrayBuff为二维数组

    //定义如下 int m_ArrayBuff[2048][4];
      _stprintf(szText,_T("%d"),m_ArrayBuff[pItem->iItem][pItem->iSubItem]);   
      pItem->pszText = szText;  
     } 
     *pResult = 0;
    }

    最后便是生成缓冲区数据

    void Insertdata()
    {

     //删除之前的数据
     m_ctlList.SetItemCountEx(0);
     m_ctlList.Invalidate();
        m_ctlList.UpdateWindow();
     srand( (unsigned)time( NULL ));
     
     //生成新的数据缓冲区
     int nItemCount = 2048;
     for (int i = 0;i < nItemCount; i ++)
     {
      for (int k = 0;k < 4;k ++)
      {
       m_ArrayBuff[i][k] = rand()%2048 + 1;
      }
     }
     if (nItemCount < 2)    
      m_ctlList.SetItemCountEx(1);   
     else
      m_ctlList.SetItemCountEx(nItemCount);
     m_ctlList.Invalidate();

    若要修改数据,只要修改缓冲区m_ArrayBuff的数据即可以

    5.Custom Redraw

    既然是自绘,首先当然是重载CListCtrl类,并接管WM_ERASEBKGND消息,去掉默认的处理,改为不处理

    BOOL CListCtrlEx::OnEraseBkgnd(CDC* pDC)
    {

    //响应WM_ERASEBKGND消息 
     return false;
     //屏蔽默认处理
     //return CListCtrl::OnEraseBkgnd(pDC);
    }

    void CListCtrlEx::OnPaint()

    {

        //响应WM_PAINT消息

        CPaintDC dc(this); // device context for painting

        CRect rect;

        CRect headerRect;

        CDC MenDC;//内存ID表  

        CBitmap MemMap;

        GetClientRect(&rect);   

        GetDlgItem(0)->GetWindowRect(&headerRect);  

        MenDC.CreateCompatibleDC(&dc);  

        MemMap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());

        MenDC.SelectObject(&MemMap);

        MenDC.FillSolidRect(&rect,RGB(228,236,243));  

        //这一句是调用默认的OnPaint(),把图形画在内存DC表上  

        DefWindowProc(WM_PAINT,(WPARAM)MenDC.m_hDC,(LPARAM)0);      

        //输出  

        dc.BitBlt(0,headerRect.Height(),rect.Width(),  rect.Height(),&MenDC,0, headerRect.Height(),SRCCOPY);  

        MenDC.DeleteDC();

        MemMap.DeleteObject();

    }

  • 相关阅读:
    推荐系统 蒋凡译 第一章 引言 读书笔记
    神经网络与深度学习 邱锡鹏 第5章 卷积神经网络 读书笔记
    神经网络与深度学习 邱锡鹏 第4章 前馈神经网络 读书笔记
    神经网络与深度学习 邱锡鹏 第3章 线性模型 读书笔记
    神经网络与深度学习 邱锡鹏 第2章 机器学习概述 读书笔记
    神经网络与深度学习 邱锡鹏 第1章 绪论 作业
    神经网络与深度学习 邱锡鹏 第1章 绪论 读书笔记
    算法笔记 上机训练实战指南 第13章 专题扩展 学习笔记
    算法笔记 第13章 专题扩展 学习笔记
    算法笔记 上机训练实战指南 第11章 提高篇(5)--动态规划专题 学习笔记
  • 原文地址:https://www.cnblogs.com/MakeView660/p/7685265.html
Copyright © 2011-2022 走看看