Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++ MFC]LVITEMA LVITEMW ecc...

    Ciao.
    premessa:
    codice:
    	LVITEM lvItem;
    	lvItem.mask = LVIF_TEXT;
    	lvItem.iItem = 0;
    	lvItem.iSubItem = 0;
    	lvItem.pszText = ("Sandra C. Anschwitz");
    	
    	m_listControl.InsertItem(&lvItem);
    ci sono vari tipi di LVITEM : L' LVITEMA e IL LVITEMW che differenze hanno?
    poi:

    codice:
    HTREEITEM hi= m_Tree.InsertItem(_T("Seattle"), hWA, TVI_SORT);
    DWORD_PTR pr=(DWORD_PTR)&lvItem;
    m_Tree.SetItemData(hi,pr);
    inserisco sotto il nodo seattle l'indirizzo di lvitem come sopra

    quando clicco sul nodo seattle:
    codice:
    void CTesttreeDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	
    	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    	HTREEITEM hItem= pNMTreeView->itemNew.hItem;
    	
    	
    	DWORD_PTR p = m_Tree.GetItemData(hItem);
    	CString str;
    	if(p!=0)
    	str= ((LVITEMA*)p)->pszText;
    il contenuto di p è l'indirizzo che ho effettivamente inserito in precedenza ma str da dei caratteri sbagliati.
    perchè?
    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    A leggerla così LVITEM sembra una macro che viene espansa in LVITEMA se non è definita la macro _UNICODE mentre è espansa in LVITEMW se _UNICODE è definita (controlla nelle opzioni del compilatore).
    Tutte le API di windows (e presumo anche le MFC) che prendono in input stringhe C seguono questa regola. (Se usi _T("Seattle") anche la macro _T segue la regola).

    str= ((LVITEMA*)p)->pszText;

    E per la regola di cui sopra dovrebbe essere:

    str= ((LVITEM*)p)->pszText;
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    scusa , non mi sono spiegato bene , LVITEM è un item di un listcontrol.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non che cambi molto quello che ho detto.

    http://msdn.microsoft.com/en-us/library/bb774760(VS.85).aspx

    pszText è di tipo LPTSTR quindi il tipo reale varia a seconda se la macro _UNICODE è definita.
    Quello che cambia è che la linea:
    str= ((LVITEMA*)p)->pszText;
    non ha senso, dovrebbe essere semmai
    str= ((LPTSTR*)p)->pszText;
    o qualcosa di simile.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    scusa , mi potresti spiegare cosa fà questa riga?

    str= ((LPTSTR*)p)->pszText;

    p è un puntatore , ma psztext non è membro di LPTSTR* o no?
    grazie.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Pardon, dimentica quel post. Ho il trauma del dopo ferie e sono ancora suonato
    Comunque se usi LVITEM evita un cast esplicito a LVITEMA* e lascia che ci pensi il compilatore a espandere correttamente la cosa.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.