Newsgroup: it.comp.programmare.win32
Titolo: Ottimizzare in velocita il refresh di una lista

 Quando hai finito di caricarla, fai apparire di nuovo la lista.
</Molebio>
========================================================
Allora... così come dici tu forse posso ottenere un risultato estetico
migliore, ma nn è questo quel ke voglio... io voglio ottimizzare la
visualizzazione evitando di far disegnare la lista per ogni riga caricata...
vorrei prima caricarle tutte e poi ridisegnarla tutta in una volta... nn so
se mi sono spiegato...
In dettaglio, ho una lista ke eredita dalla CListCtrl e da un'altra classe
ke tira dati da un DB... spesso devo visualizzare migliaia di righe e ci sta
una cifra... attendo qke dritta...
Kenny.

 Kenny.
E' molto semplice :
void CBubbaList ::OnCaricaDiBrutto()
{
    SetRedraw(FALSE);
    CaricaDiBrutto();
    SerRedraw(TRUE);
}
ma ciao

OK... ti ringrazio, effettivamente così riesco ad evitare spiacevoli effetti
di grafica, però purtroppo, nn migliorano le prestazini in velocità...
Volevo fare una prova, vorrei intercettare la RedrawItems, in modo da fargli
disegnare solo ciò ke serve, riempiendo l' lParam dell' Item, e nella
RedrawItems fare la formattazione della stringa, in base ai tipi delle mie
colonne e fargliele visualizzare... in questo modo eviterei di fargli fare
uno switch/case ogni volta ke inserisco una riga, e glielo farei fare solo
per le righe visualizzate (sperando di risparmiare qcsina in tempo)...
Ora, come faccio ad intercettare la RedrawItems?
Io pensavo ke bastasse una:
=====================================
afx_msg virtual long RedrawItems(UINT ai_first, long ai_last);
BEGIN_MESSAGE_MAP(MyList, CListCtrl)
...
    ON_MESSAGE(LVM_REDRAWITEMS, RedrawItems)
...
END_MESSAGE_MAP()
long MyList::RedrawItems(UINT ai_first, long ai_last)
{
    //le mie porcate...
   ...
    return CListCtrl::RedrawItems(ai_first, ai_last);
}
=====================================
Ma ho messo una Message nel metodo e nn ci entra... devo forse settare qke
stile nella lista o sono proprio fuori strada?
Tnx x la pazienza...
Kenny.

 Io pensavo ke bastasse una:
Mmm...dato che sto lavorando proprio in questi giorni su sta roba, ti posto
una parte del mio sorgente...scusa se non ho fatto le "pulizie del caso", ma
ti sto postando il messaggio giusto prima di andare a mangiare...
dai un'occhiata quando scrivo    "*pResult = CDRF_SKIPDEFAULT;"
////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
prototipo :  afx_msg void OnDrawControl(NMHDR *pNMHDR, LRESULT *pResult);
////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CLayersListCtrl, CListCtrl)
 //{{AFX_MSG_MAP(CLayersListCtrl)
 //}}AFX_MSG_MAP
 ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnDrawControl)
END_MESSAGE_MAP()
void CLayersListCtrl::OnDrawControl(NMHDR *pNMHDR, LRESULT *pResult)
{
 NMLVCUSTOMDRAW *pListCtrlCustomDraw = (NMLVCUSTOMDRAW *) pNMHDR;
    *pResult = 0;
 if(pListCtrlCustomDraw->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT |
CDDS_SUBITEM))
 {
  int Item = pListCtrlCustomDraw->nmcd.dwItemSpec;
  int SubItem = pListCtrlCustomDraw->iSubItem;
  if(SubItem > 0)
  {
   CClientDC dc(this);
   CRect ItemRect;
   CListCtrl::GetSubItemRect(Item, SubItem, LVIR_BOUNDS, ItemRect);
   ItemRect.DeflateRect(2, 1, 1, 3);
   CPen Pen(PS_SOLID, 1, IPB_RED);
   dc.SelectObject(&Pen);
   BOOL HasObjects = FALSE;
   BOOL HasFrames  = FALSE;
   if(IsCellKeyFrame(Item, SubItem, &HasObjects, &HasFrames))
   {
    ItemRect.InflateRect(0, 0, HasFrames ? 1 : -1, 0);
    OnDrawKeyFrame(&dc, ItemRect, HasObjects, HasFrames);
   }
   else if(IsCellLastFrame(Item, SubItem, &HasObjects))
   {
    ItemRect.InflateRect(2, 0, -1, 0);
    OnDrawFrame(&dc, ItemRect, HasObjects, TRUE);
   }
   else if(IsCellFrame(Item, SubItem, &HasObjects))
   {
    ItemRect.InflateRect(1, 0, 2, 0);
    OnDrawFrame(&dc, ItemRect, HasObjects, FALSE);
   }
   *pResult = CDRF_SKIPDEFAULT;
  }
  else   {
   pListCtrlCustomDraw->clrText = IsLayerVisible(Item) ? RGB(0, 0, 0) :
IPB_GRAY;
   *pResult = CDRF_DODEFAULT;
  }
 }
 else
  *pResult = CDRF_NOTIFYITEMDRAW;
}

 migliaia di righe e ci sta una cifra... attendo qke dritta...
usa una lista virtuale, e lascia che sia la lista a calcolare quanti 
elementi sono visibili e a partire da che offset, e tu limitati a 
restituirglieli quando te li chiede. Vedi la documentazione sulle list 
view nel PSDK
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.20. C, C++ and ASM developers
                              and beta testers are welcome!