文章之前,先對虛擬列表t控件做一個簡單總結:
1,在資源中右鍵點擊控件,找到【Owner Data】選擇true
2,在列表控件的父窗口的類(例如對話框類)中添加 LVN_GETDISPINFO 消息,
或者在派生的控件類(CMyListCtrl)中映射 LVN_GETDISPINFO 消息
3,在消息響應函數裏面寫上:
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
然後根據pItem->iItem(行數)和pItem->iSubItem(列數)進行更新列表內容,將內容拷貝到pItem->pszText裏面。
4,使用 SetItemCount(); 來進行數據插入刪除。更多相關信息,請翻閱codeproject
下面說一下列表控件閃爍問題的處理。
按照上面處理完成之後,如果頻繁調用 SetItemCount 插入數據的話,會導致列表頻繁刷新而閃爍,
影響用戶體驗,可以通過以下方式解決:1,在列表控件的派生類(CMyListCtrl)中添加消息 BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC)
裏面直接返回FALSE。
發現返回false之後在xp兼容有問題,不需要返回倒是可以兼容win7+xp
2,在控件的父窗口(對話框)添加消息 OnEraseBkgnd,加上代碼:
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
CRect clip;
m_listCtrl.GetWindowRect(clip);
ScreenToClient(clip);
pDC->ExcludeClipRect(clip);
pDC->GetClipBox(clip);
pDC->FillSolidRect(clip, GetSysColor(COLOR_BTNFACE));
return FALSE;
}
至此完成。據說此方法可以解決任何控件的閃爍問題,目前只是嘗試了列表控件。