Newsgroup: it.comp.programmare.win32
Titolo: Classe derivata da CTreeCtrl

Ciao,
 
Sto utilizzando un tree view in un dialogo per inserire, attraverso un form,
alcuni valori in un file e visualizzarli in modo decente.
 
Avrei bisogno di inserire all'interno di ogni handle del Tree View (ossia ogni
elemento) altri dati nascosti oltre al nome visualizzato e non so come fare
visto che non mi pare sia possibile con i metodi standard di CTreeCtrl.
 
La prima cosa che mi è venuta in mente è stata quella di creare un
associazione tra l'handle di ogni elemento ed una mia struttura o array di
dati/oggetti.
Esiste per caso qualche classe che mi faciliti il compito? Magari che crei una
struttura ad albero come CTreeCtrl in memoria?
 
Ad ogni modo mi sembra una cosa un pò "accroccata", forse la cosa migliore è
creare una classe derivata da CTreeCtrl e inserire dei metodi che mi
permettano di associare altri valori ad ogni handle.
Il fatto è che non sono riuscito a trovare molta documentazione a riguardo.
Qualcuno di voi ha già avuto a che fare con questo problema e può aiutarmi?
 
Grazie
 
-- 
Caronte
-- 
Inviato da 
Newsgate.Localinfo.IT
 Web Service
http://newsgate.localinfo.it

 visto che non mi pare sia possibile con i metodi standard di CTreeCtrl.
e invece è possilissimo ;-)
le funzioni CTreeCtrl::GetItemData e CTreeCtrl::SetItemData ti permettono
di accedere a 32 bit di dati associati ad uno specifico elemento di cui
passi l'handle; questi 32 bit possono essere ad esempio un puntatore ai
tuoi dati, oppure un index di un array dinamico in cui metti i dati che
associ ad ogni elemento...
l'unica cosa fastidiosa è che ogni volta che vi accedi, devi fare un
typecast da DWORD al tipo che vuoi usare (infatti la soluzione più comoda
è quella dell'array, perché un DWORD può essere anche un index, quindi non
serve typecast).
ciao
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 serve typecast).
 
Prima di tutto grazie della dritta, proprio non ci avevo fatto caso sull'msdn
di microsoft.
 
Ho inserito dei puntatori ad una mia struttura come mi hai detto tu e sembra
anche funzionare. Quello che non mi convice è che il debugger tira fuori il
seguente warning:
 
"cast di tipo": troncamento puntatore da "CElement *" a "DWORD"
 
mi mette paura la parola TRONCAMENTO!!!!! che diavoleria ha fatto??
Non vorrei trovarmi il pc resettato nel momento del typecast.
Non mi è tanto chiaro il tipo DWORD e il discorso dei 32 bit, puoi
chiarirmelo? Mi accontento anche di un link ad una documentazione ;)
 
Tra l'altro mi sembra che mi hai risposto anche nel thread dove chiedevo
delucidazioni sulla struttura ad albero che stavo creando. Beh è quella
struttura che collego all'oggetto CTreeCtrl per poi salvare tutto su un bel
file.
 
Ciao


 chiarirmelo? Mi accontento anche di un link ad una documentazione ;)
macché pc resettato! :-) si tratta di una questione semplicissima ;-)
probabilmente tu usi Visual Studio .NET, il quale ha per default i
puntatori a 64 bit, cioè un puntatore ad una qualsiasi locazione di
memoria viene memorizzato come un numero che occupa 64 bit; questo perché
Microsoft si prepara al futuro: quando il PC IBM sarà in grado di
indirizzare più di 4 giga di RAM, i soliti 32 bit non basteranno più a
memorizzare i puntatori (e a giudicare dalla velocità del progresso
tecnologico, basta meno di un decennio e ci siamo), tant'è vero che sono
già usciti i primi processori a 64 bit.
Ora: le variabili di tipo DWORD come spazio di memoria occupano due word,
cioè 32 bit: proprio la dimensione di un puntatore "vecchio stile"; per
questo ti ho suggerito di usare i DWORD assegnati ad ogni item del
TreeCtrl per memorizzare i tuoi puntatori; il problema è che, dal momento
che tu usi Visual Studio .NET, i tuoi puntatori occupano 64 bit, e non 32:
ciò significa che al momento dell'assegnazione di un puntatore a un DWORD,
i 32 bit più significativi del puntatore verranno "troncati" (da qui il
termine che ti spaventava), mentre verranno assegnati al DWORD solo i 32
meno significativi, ma il problema non ti riguarderà almeno fino al 2015
circa, perché fino a quando il PC IBM non sarà in grado di indirizzare più
di 4 giga di RAM i 32 bit più significativi rimarranno inutilizzati.
Spero di essere stato chiaro :)
un saluto.
