PDA

View Full Version : [MFC - visual c++] controllo CListCtrl non renderizzato (apparentemente)


BountyKiller
16-08-2006, 14:37
sto uscendo pazzo a causa di un problema con il controllo lista (CListctrl) di mfc ( quanto odio questa libreria!!) in pratica, dragggo il controllo in una dialog, gli setto lo stile, poi provo a inserire un paio di colonne e un elemento....qui c'è il codice;
CRect rett;
GetClientRect(&rett);
this->m_point_list.Create(LVS_ALIGNLEFT,rett,this,IDC_LIST1);
this->m_point_list.DeleteAllItems();
this->m_point_list.InsertColumn(0, _T("campo1"), LVCFMT_LEFT, 100);
this->m_point_list.InsertColumn(1, _T("campo2"), LVCFMT_LEFT, 100);
this->m_point_list.InsertItem(0,"ciao");

questo codice è nella OnInitDialog della classe della dialog incriminata.
Il problema è che quando lancio il programma il controllo appare VUOTO senza nemmeno le intestazioni delle colonne......

il bello è che se faccio un'applicazione con l'appwizard e ripeto gli stessi passaggi piazzando il controllo nella dialog principale tutto funziona a meraviglia e non devo nemmeno chiamare la create e posso subito cominciare a riempire il controllo........i metodi di inserimento ritornano valori validi, sembra quindic he il problema sia esclusivamente di rendering...ho provato a chiamare tutti i metodi che renderizzano il controllo ma niente da fare.....ho anche provato a aggiungere OnDraw alla classe della dialog ma niente....
non so più che fare..... qualche consiglio?

The3DProgrammer
16-08-2006, 22:55
non so se può essere questo, ma nella create, nel primo parametro, mancano WS_CHILD e WS_VISIBLE, che sono 2 stili da inserire sempre (il primo) e quasi sempre (il secondo) quando crei un controllo a runtime.

The3DProgrammer
16-08-2006, 23:26
è come pensavo, ho provato il tuo codice e funziona inserendo WS_CHILD | WS_VISIBLE come stili aggiuntivi nel primo parametro.


CRect rett;
GetClientRect(&rett);
this->m_point_list.Create(WS_CHID | WS_VISIBLE LVS_ALIGNLEFT | LVS_REPORT,rett,this,IDC_LIST1);
this->m_point_list.DeleteAllItems();
this->m_point_list.InsertColumn(0, _T("campo1"), LVCFMT_LEFT, 100);
this->m_point_list.InsertColumn(1, _T("campo2"), LVCFMT_LEFT, 100);
this->m_point_list.InsertItem(0,"ciao");


LVS_REPORT serve per creare una list in modalità report (quella con le colonne, altrimenti insertColumn() non funziona). Ricorda, quando crei un controllo a runtime, che sia una list o un button o una qualsiasi altra cosa, devi sempre specificare che stai creando una finestra child (WS_CHILD) e devi ricordarti di indicare se la vuoi visibile o no (WS_VISIBLE).

ciao

BountyKiller
17-08-2006, 08:40
grazie :)
provo subito....

BountyKiller
17-08-2006, 09:55
si in effetti ora appare.....se posso abusare ancora della tua cortesia vorrei chiederti un'altra cosa, alla create devo dare il rettangolo in cui voglio che appaia la lista, ma perchè devo farlo visto che il controllo è già stato posizionato nel modello della dialog? te lo chiedo perchè se faccio una getcllientrect la lista appare sull'intera dialog, mentre se faccio un
Crect rett;
GetDlgitem(IDC_LIST)->GetWindowRect(&rett);

e poi passo il rett alla Create la lista non appare sul controllo ( a meno che non ci sia qualche correzione da fare alle coordinate vista) ma leggermente sotto.

BountyKiller
17-08-2006, 10:41
scusa ho scritto un stupidaggine, io sto creando a run time un controllo lista e non sto sfruttando il controllo che c'è già.....
il problema di fondo è questo; se creo una dialog con dentro un controllo lista preso dalla toolbox, e cerco di scriverci qualcosa dentro al contruttore della dialog, o alla oninitdialog, o alla precreatewindow, schianta l'applicazione;
se invece inserisco un button e lo bindo con una funzione (sempre della stessa dialog che scrive dentro a questo benedetto controllo, tutto funziona:
perchè succede questo???