2012-05-18 2 views
0

Я работаю над проектом win32/MFC. У меня есть пользовательский элемент управления CListCtrl, который я должен время от времени добавлять некоторые строки символов. Мне абсолютно необходимо выполнить некоторые манипуляции с элементами, динамически добавленными в мой CListCtrl.Как обработать событие NM_CUSTOMDRAW для извлечения элементов списка

Ультра-В принципе, мне нужно:

  1. Обнаружение добавление отдельных элементов;
  2. Получить _single items_ IMMEDIATELY AFTER (в идеале, вскоре после вызова InsertItem());
  3. Магазин Значения отдельных элементов на карте, которые я буду использовать для выполнения других манипуляций.

Я думал об этом переопределении метода DrawItem(). но событие OnDraw кажется не доступным для моего CListCtrl.

Событие никогда не генерируется.

ВАЖНО: Пожалуйста, обратите внимание, что MyCustomCListCtrl есть "прорисовки Fixed" свойство устанавливается в Истинного, но "View" свойство НЕ набора в виде отчета.

Итак, я решил обработать NW_CUSTOMDRAW события, написание моего CustomDraw Handler, как описан here и here:

Here вы можете посмотреть другой пример кода.

Затем, мне нужен способ получить отдельные ItemID из моего CListCtrl.
Точнее, мне нужен способ получить идентификаторы отдельных элементов из NMHDR struct.

Как я могу это сделать? Я могу получить только ID LAST, который я добавил. Я уверен, что это простая ошибка, которую я не могу найти.

Образец кусок кода ниже:

Источник Диалог, который содержит 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!"); 
} 

Мой заказ CList Ctrl Источник:

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

Любая помощь приветствуется!

P.S. Просьба не давать мне советы:

  1. Настройте свой «Собственный рисунок фиксированный» на Истину;
  2. Проверьте, что вы вставили строку «ON_WMDRAWITEM()»
  3. Преобразуйте свой CListCtrl в виде отчета;

Я уже попробовал все ... :-)

Спасибо всем!

IT

ответ

0

Прежде всего ... Спасибо, что потратил ваше драгоценное время на этот глупый вопрос. Я ничего не узнал о событии LVN_INSERT. Я пишу научное программное обеспечение (большинство на платформе Linux); Я не долгое время разработчик Win32, поэтому я не знаю Win32 API в глубину. Я изменил исходный файл класса MyCustomCListCtrl, как вы уже сказали. код ниже, кажется, лучше (и быстрее) способ добиться того, чего я хочу: /* файл 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; 
} 

Можете ли вы подтвердить? Из того, что я вижу, кажется, работает. :-) Еще раз спасибо!

IT

4

Во-первых, если вам нужно, чтобы обнаружить добавление отдельных элементов, то почему бы вам не справиться с LVN_INSERTITEM сообщение? Я имею в виду, для чего это сообщение. Обработка NM_CUSTOMDRAW вместо этого является неправильным способом, поскольку вы не обязательно получите это уведомление, если элемент управления скрыт, ваше окно минимизировано, ...

В вашем OnCustomDraw() вы всегда получаете одинаковый идентификатор: это потому, что список элемент управления всегда рисует все видимые элементы, поэтому вы получаете идентификатор первого видимого элемента. Если вы установите там точку останова, то при следующем запуске элемент управления будет обновлен, и чертеж начнется снова с первого видимого элемента.

Примечание: поскольку вы обрабатываете NM_CUSTOMDRAW, вы не получите уведомления о добавленных элементах, которые не вставлены в видимую часть элемента управления! Так, как я уже упоминал, вместо этого вы должны обращаться с LVN_INSERTITEM.

+0

Это должно быть принято как ответ. – elimad

 Смежные вопросы

  • Нет связанных вопросов^_^