Domanda

Sto lavorando su un win32/MFC progetto.Ho un custom CListCtrl controllo che devo aggiungere, di volta in volta, alcune stringhe di caratteri.Ho assolutamente bisogno di eseguire alcune manipolazioni su elementi aggiunti dinamicamente al mio CListCtrl.

Ultra-Fondamentalmente, ho bisogno di:

  1. Rilevare l'aggiunta di singoli elementi;
  2. Recuperare _single items_ SUBITO DOPO(idealmente, poco dopo InsertItem() invocazione);
  3. Negozio i valori dei singoli elementi in una mappa, che verrà utilizzata per eseguire altre manipolazioni.

Ho pensato di sostituire il metodo DrawItem().ma l'evento OnDraw sembra di non essere disponibile per il mio CListCtrl.

Evento non viene generato.

IMPORTANTE: Si prega di notare che MyCustomCListCtrl hanno "Sul Pareggio Fisso"impostata Vero, ma "Vista"la proprietà è NON impostato come un report.

Così, ho deciso di gestire NW_CUSTOMDRAW evento, a scrivere il mio CustomDraw Gestore, come ha spiegato qui e qui:

Qui è possibile visualizzare un altro esempio di codice.

Allora, ho bisogno di un modo per recuperare un solo itemIDs dal mio CListCtrl.
Più precisamente, ho bisogno di un modo per ottenere singolo elemento Id NMHDR struct.

Come posso fare questo?Io sono solo in grado di ottenere l'ID del ULTIMO il punto che ho aggiunto.Io sono sicuro che è un semplice errore che non riesco a trovare.

Un esempio di pezzo di codice riportato di seguito:

Fonte di Dialogo che contiene CList Ctrl:

/* file MyDlg.cpp */

#include "stdafx.h"
#include "MyDlg.h"

// MyDlg dialog

IMPLEMENT_DYNAMIC(MyDlg, CDialog)

MyDlg::MyDlg(CWnd* pParent)
    : CDialog(MyDlg::IDD, pParent)
{
}

MyDlg::~MyDlg()
{
}

void MyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST1, listView); /* listView is a MyCustomCListCtrl object */
}

BEGIN_MESSAGE_MAP(MyDlg, CDialog)
    ON_BN_CLICKED(IDC_BUTTON1, &MyDlg::OnBnClickedButton1) 
END_MESSAGE_MAP()

BOOL MyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    return TRUE;
}

/* OnBnClickedButton1 handler add new strings to MyCustomCListCtrl object */

void MyDlg::OnBnClickedButton1()
{
    listView.InsertItem(0, "Hello,");
    listView.InsertItem(1, "World!");
}

La mia Custom CList Ctrl fonte:

/* file MyCustomCListCtrl.cpp */

#include "stdafx.h"
#include "MyCustomCListCtrl.h"

MyCustomCListCtrl::MyCustomCListCtrl()
{
}

MyCustomCListCtrl::~MyCustomCListCtrl()
{
}

BEGIN_MESSAGE_MAP(MyCustomCListCtrl, CListCtrl)
    //{{AFX_MSG_MAP(MyCustomCListCtrl)
    //}}AFX_MSG_MAP
    // ON_WM_DRAWITEM()                             /* WM_DRAWITEM NON-AVAILABLE */
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
END_MESSAGE_MAP()

// 'Owner Draw Fixed' property is already TRUE
/*  void CTranslatedCListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    bool inside = true; /* Member function removed: I never enter here... */
}  */

void MyCustomCListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    /* Here, I must retrieve single strings added to my MyCustomCListCtrl object */

    LPNMLISTVIEW plvInfo = (LPNMLISTVIEW)pNMHDR;
    LVITEM lvItem;

    lvItem.iItem = plvInfo->iItem;          /* Here I always get _the same_ ID: ID of last element...*/
    lvItem.iSubItem = plvInfo->iSubItem;    // subItem not used, for now...

    int MyID = 0;

    this->GetItem(&lvItem); // There mai be something error here?
    MyID = lvItem.iItem;

    CString str = this->GetItemText(MyID, 0); /* ...due to previous error, here I will always get the last string I have added("World!") */

    // Immediately after obtaining ALL IDS, I can Do My Work

    *pResult = 0;
}

Qualsiasi aiuto è gradito!

P. S.Si prega di non darmi consigli come:

  1. Impostare il "Proprio Disegnare Fisso" di Proprietà a True;
  2. Verificare di aver inserito la riga "ON_WMDRAWITEM()"
  3. Convertire il vostro CListCtrl come una relazione;

Ho già provato di tutto...:-)

Grazie a tutti!

SI

È stato utile?

Soluzione 2

prima di tutto...Grazie sprecato il vostro tempo prezioso con questo stupido domanda.Non ho mai trovato nulla LVN_INSERT evento.Io scrivo software scientifico(la maggior parte su piattaforma Linux);Io non sono un lungo tempo Win32 sviluppatore, quindi non so Win32 Api in profondità.Ho modificato file di origine di MyCustomCListCtrl classe, come ti hanno suggerito.Codice sottostante sembra essere la migliore( e più veloce )modo per ottenere quello che voglio:

    /* file MyCustomCListCtrl.cpp */

    #include "stdafx.h"
    #include "MyCustomCListCtrl.h"

    MyCustomCListCtrl::MyCustomCListCtrl()
    {
    }

    MyCustomCListCtrl::~MyCustomCListCtrl()
    {
    }

    BEGIN_MESSAGE_MAP(MyCustomCListCtrl, CListCtrl)
        //{{AFX_MSG_MAP(MyCustomCListCtrl)
        //}}AFX_MSG_MAP
        ON_NOTIFY_REFLECT(LVN_INSERTITEM, OnLvnInsertItem)
    END_MESSAGE_MAP()

    ...

    afx_msg void CTranslatedListCtrl::OnLvnInsertItem(NMHDR* pNMHDR, LRESULT* pResult)
    {
        LPNMLISTVIEW plvInfo = (LPNMLISTVIEW)pNMHDR;
        CString str = this->GetItemText(plvInfo->iItem, 0);

        // Add Some Logic

        *pResult = 0;
    }

Potete confermare?Da quello che posso vedere, sembra funzionare.:-) Grazie ancora!

SI

Altri suggerimenti

Primo, se è necessario rilevare l'aggiunta di elementi singoli, perché non gestire il LVN_INSERTITEM messaggio?Voglio dire, che è ciò che il messaggio è per.Gestione NM_CUSTOMDRAW, invece, è il modo sbagliato, dal momento che non necessariamente ottenere la notifica se il controllo è nascosto, la tua finestra ridotta a icona, ...

Nel OnCustomDraw() si ottiene sempre lo stesso ID:questo perché la lista di controllo attira sempre tutti gli elementi visibili, in modo da ottenere l'ID del primo elemento visibile.Se si imposta un punto di interruzione, poi sul successivo eseguire il controllo viene aggiornata e il disegno inizia nuovamente il primo elemento visibile.

Nota:visto che sei di movimentazione NM_CUSTOMDRAW, non si ottiene alcuna notifica di elementi aggiunti che non sono inseriti nella parte visibile del controllo di!Come ho già detto, si dovrebbe gestire LVN_INSERTITEM invece.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top