Daten an Listenelement hängen
-
ich versuche gerade in einer WinApi anwendung Daten an ein Listenelement zu hängen.
Damit es keine missverständnisse gibt bei CListCtrl wäre das SetItemData.Laut MSDN würde/soll das mit der LVITEM strucktur gehn. Nur bin ich mir nicht ganz im klaren wie.
alle meine versuche schlugen bislang fehl, indem nichts an das Element gefügt wurde.wie folgt sind meine versuche die Daten an das Element zu hängen bzw. diese wieder abzurufen.
BOOL SetListItemData(HWND hWnd, UINT uiID, DWORD dwData,int iItem) { /********************************************************************************************** - hWnd Handle auf das Dialogfenster indem die Liste erstellt wird - uiID definition der Liste - dwData Informationen die im Element gespeichert werden - iItem Nr des Elementes in das gespeichert wird **********************************************************************************************/ LVITEM LvItem; memset(&LvItem,0,sizeof(LvItem)); HWND hList = GetDlgItem(hWnd,uiID);//Handle auf die Liste holen LvItem.mask = LVIF_PARAM; LvItem.iItem = iItem; // Element Nr das gesetzt wird LPARAM lParam = MAKELPARAM(dwData,sizeof(dwData)); LvItem.lParam = lParam; SendMessage(hList,LVM_SETITEM,(WPARAM)0,(LPARAM)&LvItem); // füge Element ein return TRUE; } BOOL GetListItemData(HWND hWnd, UINT uiID,int iItem,DWORD &dwData,DWORD &dwSizeData) { /********************************************************************************************** - hWnd Handle auf das Dialogfenster indem die Liste erstellt wird - uiID definition der Liste - iItem Nr des Elementes das gesucht wird - dwData gespeicherte Informationen im Element - dwSizeData größe der gespeicherte Informationen im Element **********************************************************************************************/ LVITEM LvItem; memset(&LvItem,0,sizeof(LvItem)); HWND hList = GetDlgItem(hWnd,uiID);//Handle auf die Liste holen LvItem.mask = LVIF_PARAM; LvItem.iItem = iItem; // Element Nr das gesucht wird SendMessage(hList,LVM_GETITEMTEXT,(WPARAM)iItem,(LPARAM)&LvItem); CString sFormat; sFormat.Format("0x%08X\n%i",LOWORD(LvItem.lParam),HIWORD(LvItem.lParam)); MsgBox(sFormat); dwData = LOWORD(LvItem.lParam); dwSizeData = HIWORD(LvItem.lParam); return TRUE; }
-
schiebung
keinder eine Idee wie das geht bzw was ich falsch mach?
-
Hoi,
Also, dieser Codeabschnitt könnte Probleme machen:
LPARAM lParam = MAKELPARAM(dwData,sizeof(dwData)); LvItem.lParam = lParam;
dwData, also der Typ DWORD verbraucht i.d.R. (auf einem 32-Bit Rechner) sizeof(DWORD) = 4 Bytes. LPARAM ist definiert als long, verbraucht also auch 4 Bytes...das wird eng. Was soll diese Art der Zuweisung überhaupt ?
Machs einfach so:LvItem.lParam = dwData;
In Deinem Post ist übrigens keine Fehlerbeschreibung vorhanden ... WAS ist denn überhaupt das Problem ? WO läuft etwas schief ? Gegebenenfalls mal mit dem Debugger geschaut ?
-
Naja fehlerbeschreibung gibt es keine, denn es passiert kein fehler, die Liste wird problemlos erstellt nur wird nichts
an das Listenelement drangehängt.Zu meiner schande mus ich gestehn das ich nicht gerade per du mit dem Debugger bin.
und mit der art der zuweisung wollte ich versuchen, zwei fliegen mit einer klappe zu schlagen. ging wohl nach hinten los.
Danke für den tip werd das nacher gleich mal versuchen.
-
aus dem nacher ist dann doch etwas später geworden.
so, hab das mal versucht wie CodeFinder es vorgeschlagen hat.anscheinend bin ich zu blöd das zu bewerkstelligen, denn ich krieg es nicht gebacken daten an das Listenelement zu klemmen.
was ich zumindest mal geschaft hab ist das SetCheck/Getcheck für Checkboxen in der Liste zu bewerkstelligen.
dabei versteh ich noch nicht ganz was da passiert. anbei vieleicht kann mir das jemand mal erklären.#define LV_SETCHECKBOX(x) ((int(x) + 1) << 12) #define LV_GETCHECKBOX(x) ((int(x) - 1) >> 12) void CCtrlList::SetListItemCheck(HWND hWnd, UINT uiID,int iItem,BOOL bCheck) { /********************************************************************************************** SET LIST ITEM CHECK Setzt die Checkbox des Elements - hWnd Handle auf das Dialogfenster indem die Liste erstellt wird - uiID definition der Liste - iItem Nr des Elementes das gesucht wird - bCheck Wert auf den die Checkbox gesetzt wird **********************************************************************************************/ LVITEM LvItem; memset(&LvItem,0,sizeof(LvItem)); // Setze Element Struct zurück HWND hList = GetDlgItem(hWnd,uiID);//Handle auf die Liste holen LvItem.mask = LVIF_STATE ; // Text Style LvItem.state = LV_SETCHECKBOX(bCheck);//((int(bCheck) + 1) << 12); LvItem.stateMask = LVIS_STATEIMAGEMASK; SendMessage(hList,LVM_SETITEMSTATE,(WPARAM)iItem,(LPARAM)&LvItem); // Setze Element Status } BOOL CCtrlList::GetListItemCheck(HWND hWnd, UINT uiID,int iItem) { /********************************************************************************************** GET LIST ITEM CHECK gibt zurück ob die Checkbox des Elements angehackt ist - hWnd Handle auf das Dialogfenster indem die Liste erstellt wird - uiID definition der Liste - iItem Nr des Elementes das gesucht wird **********************************************************************************************/ LVITEM LvItem; memset(&LvItem,0,sizeof(LvItem)); // Setze Element Struct zurück HWND hList = GetDlgItem(hWnd,uiID);//Handle auf die Liste holen LvItem.mask = LVIF_STATE ; // Text Style LvItem.stateMask = LVIS_STATEIMAGEMASK; LvItem.iItem = iItem; SendMessage(hList,LVM_GETITEM,(WPARAM)0,(LPARAM)&LvItem); // Setze Element Status return LV_GETCHECKBOX(LvItem.state);//((int(LvItem.state) - 1) >> 12); }
bevor missverständniss auftreten was ich nicht versteh ist ((int(TRUE) + 1) << 12) bzw. ((int(LvItem.state) - 1) >> 12)
was passiert daferner bräuchte ich wirklich dringend, wie ich daten an ein listenelement hängen kann. durch googlen und lesen in der
MSDN <-(werd daraus leider nicht soo ganz schlau) denke ich das es ähnlich gehen muss wie den Status der CheckBox an das Element
zu hängen. ich muss daten in der form von Flags#define OPEN_EDIT 0x1000 #define OBEN_COMBO 0x2000
an das Listenelement hängen. aber ich hab keinen schimmer unter was LVIS_STATEIMAGEMASK o. LVIS_OVERLAYMASK bzw. wie
LvItem.state = OPEN_EDIT; LvItem.state = ((OPEN_EDIT)<<8);
da alle versuche in der form fehlschlugen das ich keine Daten zurückbekommen hab. aus diesem grund hab ich auch keine code
den ich hier posten könnte. Ich weis also nicht, ob ich die daten schon falsch zuweise oder nur die abfrage falsch ist.wie gesagt ich bräuchte es echt dringend.
bin für jede hilfe dankbar.