解決MFC中CListCtrl(virtual)控件閃爍問題

文章之前,先對虛擬列表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;
}

至此完成。據說此方法可以解決任何控件的閃爍問題,目前只是嘗試了列表控件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章