List Control
-
Ich habe einen Dialog erstellt in die ich eine ListControl-Komponente eingefügt habe. Das Handle habe ich bereits mit GetDlgItem() ausgelesen. Nun möchte ich diese Liste auch benutzen können.
Was für Funktionen gibt es um ListControl-Komponenten zu verwalten? Oder gibt es eine Möglichkeit den Handle einer CListCtrl-Klasse zuzuordnen, um dann mit einer Instanz dieser Klasse arbeiten zu können?
-
Die einfachste Variante ist, ein CListCtrl zuzuordnen (mittels DDX, bzw. in OnInitDialog ein CWnd::Attach, in OnDestroy ein Detach)
Du kannst aber auch
CWnd * lcWnd = GetDlgItem(IDC_MY_LIST); CListCtrl * lc = (CListCtrl *) lcWnd;letzteres geht, weil CListCtrl keine eigenen Datenmember (gegenüber CWnd) hat, sondern die relevanten Funktionen praktisch nur SendMessage aufrufen.
-
Der Zeiger ist aber nur temporär (d.h. wird im nöchsten OnIdle gelöscht, also nicht aufheben)
-
Ich bin zwar für jede Hilfe dankbar, aber der Code hat mehr Probleme verursacht, als gelöst.
Ich habe auch folgendes versucht:
1. Ich habe eine CListCtrl-Instanz deklariert.
2. Ich habe versucht dieser Klasse ein HWND-Handle zuzuweisen (einmal mittels CListCtrl.Attach() und einmal mit einer direkten Zuweisung auf die Variable CListCtrl.m_hWnd) und bekam wieder merkwürdige Exceptions
-
a) CWnd hat einen Member CWnd * GetDlgItem(UINT id) - apso
pMyDialogWithList->GetDlgItem(IDC_LC)
Die globale GetDlgItem bekommt als ersten Parameter den HWND des Parents.
b)
Attach überprüft das a) das HWND ein gültiges Window Handle ist und b) es keine feste CWnd-Instanz gibt, die dem HWND zugeordnet ist
-
Ich komme nach wie vor nicht damit klar!
Das ist mein Code:
CWnd Window; CListCtrl *ListControl = NULL; if (Window.Attach(hDialog) == FALSE) return FALSE; ListControl = (CListCtrl*)Window.GetDlgItem(LIST_ID); if (ListControl == NULL) return FALSE; ListControl->InsertColumn(0, "Spalte", LVCFMT_LEFT, 100);Vielleicht habe ich ja irgendwas falsch verstanden, oder nicht beachtet, aber eigentlich kann das ja nicht so kompliziert sein.
-
Leg Dir doch einfach eine Variable vom Typ CListCtrl an, welche mit Deinem ListControl-Element auf dem Dialogfeld verknüpft ist und benutze diese für die Operationen.
-
Was ist hDialog, und ist dem nicht schin eine Dialog-Klasse zugeordnet?
Warum willst du nicht den "normalen" Weg gehen und einen CListCtrl-Member zum Dialog hnzufügen (üner class Wizard, da kriegst du gleich den DDX eintrag)?
An welcher Stelle geht es denn schief?