1.使用SetRedraw禁止窗口重繪,操作完成后,再恢復(fù)窗口重繪
m_ctlList.SetRedraw(FALSE);
//以下為更新數(shù)據(jù)操作
//……
//恢復(fù)窗口重繪
m_ctlList.SetRedraw(TRUE);
2.使用LockWindowUpdate禁止窗口重繪,,操作完成后,,用UnlockWindowUpdate恢復(fù)窗口重繪
m_ctlList.LockWindowUpdate();
//以下為更新數(shù)據(jù)操作
//……
//恢復(fù)窗口重繪
m_ctlList.UnlockWindowUpdate();
3.使用ListCtrl的內(nèi)部雙緩沖
m_ctlLisit.SetExtendedStyle(m_ctlLisit.GetExtendedStyle()|LVS_EX_DOUBLEBUFFER);
VC6未定義LVS_EX_DOUBLEBUFFER宏,,使用者可以自定義,如下:
#define LVS_EX_DOUBLEBUFFER 0×00010000
4.Virtual List
首先要設(shè)置ListCtrl風(fēng)格為LVS_REPORT | LVS_OWNERDATA或在ListCtrl屬里中的More Styles頁面中選中Owner data復(fù)選框。
其次要向應(yīng)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) { //使緩沖區(qū)數(shù)據(jù)與表格子項對應(yīng)
//m_ArrayBuff為二維數(shù)組
//定義如下 int m_ArrayBuff[2048][4];
_stprintf(szText,_T(“%d”),m_ArrayBuff[pItem->iItem][pItem->iSubItem]); pItem->pszText = szText; } *pResult = 0; } 最后便是生成緩沖區(qū)數(shù)據(jù)
void Insertdata()
{ //刪除之前的數(shù)據(jù)
m_ctlList.SetItemCountEx(0); m_ctlList.Invalidate(); m_ctlList.UpdateWindow(); srand( (unsigned)time( NULL )); //生成新的數(shù)據(jù)緩沖區(qū)
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(); } 若要修改數(shù)據(jù),只要修改緩沖區(qū)m_ArrayBuff的數(shù)據(jù)即可以
5.Custom Redraw
既然是自繪,,首先當然是重載CListCtrl類,并接管WM_ERASEBKGND消息,,去掉默認的處理,,改為不處理
BOOL CListCtrlEx::OnEraseBkgnd(CDC* pDC)
{ //響應(yīng)WM_ERASEBKGND消息
return false; //屏蔽默認處理 //return CListCtrl::OnEraseBkgnd(pDC); } void CListCtrlEx::OnPaint()
{
//響應(yīng)WM_PAINT消息
CPaintDC dc(this); // device context for painting
CRect rect;
CRect headerRect;
CDC MenDC;//內(nèi)存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));
//這一句是調(diào)用默認的OnPaint(),把圖形畫在內(nèi)存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();
}
本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/zw0558/archive/2010/09/12/5879315.aspx
本文來自CSDN博客,,轉(zhuǎn)載請標明出處:http://blog.csdn.net/zw0558/archive/2010/09/12/5879315.aspx
|
|