Frage

Ich arbeite an einem Win32 / MFC-Projekt. Ich habe eine benutzerdefinierte CLISTCTRL-Steuerung, die ich von Zeit zu Zeit hinzufügen muss, einige Zeichenfolgen. Ich muss absolut einige Manipulationen an Elementen ausführen, die dynamisch zu meiner CLISTCTRL hinzugefügt wurden.

ultra-grundsätzlich muss ich:

    .
  1. erkennen das Hinzufügen von einzelnen Elementen;
  2. Retrive _single items_ unmittelbar nach (idealerweise kurz nach dem Insertitem () Invocation);
  3. Store Werte von einzelnen Elementen in einer Karte, die ich zur Durchführung anderer Manipulationen verwenden werde.

    Ich dachte darüber nach, dies überschreiben, um die Methode Drawitem (). Aber Ondraw Event scheint nicht für meine clistctrl verfügbar zu sein.

    Ereignis wird niemals erzeugt.

    wichtig: Bitte beachten Sie, dass myCustomClistCTRL " auf zeichnen behoben " auf true , aber " Ansicht "Eigenschaft ist nicht als report .

    Ich habe mich entschieden, den NW_CUSTOMDRAW-Ereignis abzuwickeln, meinen CustomDrau-Handler zu schreiben, wie erklärt hier und hier :

    Hier können Sie ein anderes Codebeispiel anzeigen.

    Ich brauche dann einen Weg, um einzelne Itemiden von meiner CLISTERCTRL abzurufen.
    Genauer gesagt, ich brauche einen Weg, um einzelne Element-IDs von nmhdr struct zu bekommen.

    Wie kann ich das tun? Ich kann nur die ID des zuletztsten -en-Elements erhalten, das ich hinzugefügt habe. Ich bin sicher, dass es ein einfacher Fehler ist, den ich nicht finden kann.

    ein Muster-Code-Code unten:

    Quelle des Dialogs, der Clist CTRL enthält: generasacodicetagpre.

    meine benutzerdefinierte Clist Strg Quelle: generasacodicetagpre.

    Jede Hilfe wird geschätzt!

    p.s. Bitte geben Sie mir keine Tipps wie:

      .
    1. Setzen Sie Ihre Eigenschaft "eigene Zeichnung fest" auf true;
    2. Überprüfen Sie, Sie haben die Zeile "on_wmdrawitem ()" eingefügt
    3. Konvertieren Sie Ihre CLISTCTRL als Bericht;

      Ich habe schon alles ausprobiert ...: -)

      danke an alle!

      es

War es hilfreich?

Lösung 2

first of all... Thank you wasted your precious time with this stupid question. I never found anything about LVN_INSERT event. I write scientific software(most on Linux platform); I am not a long-time Win32 developer, so I don't know Win32 APIs in depth. I have modified source file of MyCustomCListCtrl class, as you have suggested. Code below seems to be the best( and faster )way to achieve what I want:

    /* 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;
    }

Can You confirm? From what I can see, it seems to work. :-) Thanks again!

IT

Andere Tipps

First, if you need to detect adding of single items, why don't you handle the LVN_INSERTITEM message? I mean, that's what that message is for. Handling NM_CUSTOMDRAW instead is the wrong way, since you won't necessarily get that notification if the control is hidden, your window minimized, ...

In your OnCustomDraw() you always get the same ID: that's because the list control always draws all visible items, so you get the ID of the first visible item. If you set a breakpoint there, then on the next run the control gets refreshed and the drawing starts again from the first visible item.

Note: since you're handling NM_CUSTOMDRAW, you won't get any notification of added items that are not inserted into the visible part of the control! So as I mentioned, you should handle LVN_INSERTITEM instead.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top