Newsgroup: it.comp.programmare.win32
Titolo: Owner-drawn listbox

Salve, sono riuscito dopo un pò di prove a disegnare una list-box
owner-drawn ma ho trovato problemi con il messaggio LB_ADDSTRING. Se scrivo:
SendDlgItemMessage(hwnd, IDC_LISTBOX_EVENTS, LB_ADDSTRING, (WPARAM) 0,
(LPARAM) "Hello world!!!");
funziona perfettamente, lui mi inserisce un item con la scritta all'interno
Hello World!!!. Il problema ce l'ho invece quando cerco di fare qualcosa di
un poco più complesso come:
ifstream file("list.ini", ios::nocreate | ios::binary);
if (file)
{
    for (int a = 0; !file.eof(); a++)
    {
        char cEvent;
        char szTime[10];
        char szDate[10];
        file >> cEvent >> szTime >> szDate;
        sprintf(szItem, "%c-%s-%s", cEvent, szTime, szDate);
        SendDlgItemMessage(hwnd, IDC_LISTBOX_EVENTS,
                                               LB_ADDSTRING, (WPARAM) 0,
(LPARAM) szItem);
    }
}
Ho controllato con un breakpoint il valore di szItem durente la chiamata
SendDlgItemMessage, e la stringa è esatta. L'errore arriva quando nel
messaggio WM_DRAWITEM chiamo:
strcpy(cr, (char *)pdis->itemData);
che nel caso di Hello World!!! risulta esatto, mentre nel secondo caso la
stringa cr (char cr[30]) assume valori strani. Qualcuno ha idea perchè in un
caso risulti giusto e nell'altro no?
Grazie e ciao a tutti.
Luca

 intellegibile.
Ho impostato la checkbox Has strings visto che ho creato il dialog con il
dialog creator di VC++. Però adesso mi da un errore "la memoria non poteva
essere read" quando apro il dialog. Cos'altro devo fare?
Grazie.
Luca

 Luca
Forse non mi sono spiegato bene.
Ecco cosa dice MSDN:
-----
itemData
Specifies the application-defined 32-bit value associated with the menu
item. For a control, this parameter specifies the value last assigned to the
list box or combo box by the LB_SETITEMDATA or CB_SETITEMDATA message. If
the list box or combo box has the LBS_HASSTRINGS or CBS_HASSTRINGS style,
this value is initially zero. Otherwise, this value is initially the value
that was passed to the list box or combo box in the lParam parameter of one
of the following messages:
CB_ADDSTRING
CB_INSERTSTRING
LB_ADDSTRING
LB_INSERTSTRING
-----
Quindi... .se NON utilizzi Has String la drawitemstruct in itemdata ti
ritorna quello che hai messo nel LPARAM del messaggio LB_ADDSTRING. (il tuo
caso precedente, che non funzionava per il motivo che ti dicevo)
Se invece validi Has String, itemdata è zero a meno che tu non lo abbia
impostato con LB_SETITEMDATA (cosa che tu non hai fatto e di cui non hai
bisogno).
quindi se tu cerchi di operare con l'itemdata come se fosse un buffer di
memoria(stringa), il sistema  se la prende a male.
Anzichè leggere da itemdata (che è zero)...
dovrai fare qualcosa del genere:
-------
TCHAR    strBuff[MAX_DIM_STR]    ; // Max dim str è la dimensione massima di
una voce della tua lista
SendMessage(pdrwitem->hwndItem,LB_GETTEXT,pdrwitem->itemID,(LPARAM)strBuff)
;
-------
Ho assunto pdrwitem come il tuo puntatore alla DRAWITEMSTRUCT.
In strBuff avrai la stringa da disegnare.
Occhio che se la lista è vuota itemID = -1
Spero di essere stato chiaro.
Ciao e in bocca al lupo.
Molebio

 ha scritto nel messaggio
news:K5re9.68279$ub2.1...@news1.tin.it...

Si, sei stato talmente chiaro che ti sei fatto capire anche da me. Grazie.
Già che ci sei potresti darmi anche il link a quello che mi hai riportato
dalle msdn (se ce l'hai sotto mano) perchè io avevo guardato, ma avevo
trovato solo della roba che non avevo capito, ma mi pare che questo non lo
avessi letto. Evidentemente mi è sfuggito qualcosa.
Grazie ancora.
Luca

 Luca
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/pla
tform/commctls/comboboxes/comboboxreference/comboboxstructures/drawitemstruc
t.asp
occhio che il link sarà troncato!
Ciao
Molebio