程式需要從資料庫某乙個活動表中,定時取資料,更新介面的列表顯示,比如有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,但是事實是,如果你確實需要改善閃爍的情況,計算乙個...