防止ClistCtrl重新整理閃爍的五種方法

2021-09-30 07:46:53 字數 1141 閱讀 1230

程式需要從資料庫某乙個活動表中,定時取資料,更新介面的列表顯示,比如有20條資料(變化),則這20資料

不停的變化,(通過其他程式實現)

方案(1),先在列表中查詢,後插入

比如每條記錄都有乙個唯一的編號,查詢的時候,首先查詢該編號的記錄在列表中是否存在,如果存在 

則找到item後,直接更新各個列的資料,如

lvfindinfo lv;

lv.flags=lvfi_string;

lv.psz=「關鍵字」;

int nitem=m_list.finditem(&lv,-1); 

如果item>0則直接更新資料,用setitemtext(nitem,0,「值1」),。。。。

如果item<0,則插入一條item,insertitem(),然後setitemtext(nitem,0,「」);。。。。

方案2:

每次查詢之前,把當前的記錄全部刪掉,然後在依次插入到列表框中。

//其他方法

//方法1:採用禁止重繪的方法

setwindowredraw(hwnd, false);

... add the items ...

setwindowredraw(hwnd, true);

方法2:採用鎖定視窗,禁止重新整理的方法

m_list.lockwindowupdate()

m_list.setitemtext()

//修改後

m_list.unlockwindowupdate()

方法3:採用虛擬列表技術。

每次都把資料先放到乙個陣列中,然後根據顯示的多少更新資料。需要lvn_getdispinfo訊息

即(ongetdispinfolist(nmhdr* pnmhdr, lresult* presult))函式,

方法 4:使用記憶體緩衝技術

虛擬表可以解決,如果資料更新還是大量閃爍,需要進行對ondraw函式修改,採用memdc可以實現無閃爍方案

方法5:過載一下onerasebkgnd(cdc* pdc)函式

過載一下onerasebkgnd(cdc* pdc)函式,在背景中把客戶區畫成白色的試試;如果不行的話,插入資料的時候計算一下資料區的大小,如果資料區覆蓋整個客戶區,則不畫背景。以前是這麼做的,1s更新幾十條資料還是看不出閃爍的。

防止CListCtrl閃爍的幾種方法

1.bool clistctrlex onerasebkgnd cdc pdc 響應wm erasebkgnd訊息 return false 遮蔽預設處理 return clistctrl onerasebkgnd pdc 2.void clistctrlex onpaint 響應wm paint訊...

防止CListCtrl閃爍的幾種方法

1.使用setredraw禁止視窗重繪,操作完成後,再恢復視窗重繪 m ctllist.setredraw false 以下為更新資料操作 恢復視窗重繪 m ctllist.setredraw true 2.使用lockwindowupdate禁止視窗重繪,操作完成後,用unlockwindowup...

MFC 視窗重新整理防止閃爍方法

invalidate 會導致整個視窗的圖象重畫,需要的時間比較長,而invalidaterect 僅僅重畫rect區域內的內容,所以所需時間會少一些。蟲蟲以前很懶,經常為一小塊區域的重畫就呼叫invalidate 不願意自己去計算需要重畫的rect,但是事實是,如果你確實需要改善閃爍的情況,計算乙個...