Я работаю над проектом win32/MFC. У меня есть пользовательский элемент управления CListCtrl, который я должен время от времени добавлять некоторые строки символов. Мне абсолютно необходимо выполнить некоторые манипуляции с элементами, динамически добавленными в мой CListCtrl.Как обработать событие NM_CUSTOMDRAW для извлечения элементов списка
Ультра-В принципе, мне нужно:
- Обнаружение добавление отдельных элементов;
- Получить _single items_ IMMEDIATELY AFTER (в идеале, вскоре после вызова InsertItem());
- Магазин Значения отдельных элементов на карте, которые я буду использовать для выполнения других манипуляций.
Я думал об этом переопределении метода 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. Просьба не давать мне советы:
- Настройте свой «Собственный рисунок фиксированный» на Истину;
- Проверьте, что вы вставили строку «ON_WMDRAWITEM()»
- Преобразуйте свой CListCtrl в виде отчета;
Я уже попробовал все ... :-)
Спасибо всем!
IT
Это должно быть принято как ответ. – elimad