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?


Anmelden zum Antworten