Какое сообщение или событие вызывается при вызове метода CListCtrl::InsertItem()?

Я планировал реализовать собственный CListCtrl. Я думал, что рисование элемента происходит после того, как элемент вставлен в элемент управления. Итак, мой метод объявляет класс, производный от CListCtrl, и переопределяет его метод DrawItem(). Проблема в том, что DrawItem никогда не вызывается после вставки элемента. Что-то не так с моим методом?

Спасибо!


person user26404    schedule 24.10.2008    source источник
comment
Попробуйте найти существующие теги, прежде чем создавать новые, если это возможно...   -  person Aardvark    schedule 29.10.2008


Ответы (4)


Чтобы переопределение DrawItem() вызывалось в классе, производном от CListCtrl, необходимо установить стиль LVS_OWNERDRAWFIXED, а также установить элемент управления в режим «Просмотр отчета». Насколько я знаю, ownerdraw работает только в режиме отчета.

Также проверьте правильность типа переменной в заголовочном файле (например, CMyListCtrl, а не CListCtrl) и проверьте правильность назначения DDX, как предложил Марк Рэнсом.

person Adam Pierce    schedule 24.10.2008

Вам нужно установить стиль LBS_OWNERDRAWFIXED для элемента управления. Вы можете сделать это в шаблоне ресурса или программно, используя функцию ModifyStyle().

пример:

m_myListbox.ModifyStyle(0, LBS_OWNERDRAWFIXED, 0);
person Adam Pierce    schedule 24.10.2008
comment
Это неправильно. LBS_OWNERDRAWFIXED — это стиль списка. Для CListCtrl соответствующий стиль — LVS_OWNERDRAWFIXED. - person ChrisN; 24.10.2008

Проблема может заключаться в том, что вы не связываете окно с экземпляром вашего класса. Это делается с помощью DDX_Control внутри метода DoDataExchange вашего диалогового окна. DDX_Control вызывает CWnd::SubclassWindow, что вы можете сделать сами, если хотите.

person Mark Ransom    schedule 24.10.2008

Возможно, вам также потребуется переопределить MeasureItem() и CompareItem(). Дополнительные сведения см. в статье Microsoft TN014.

Вот некоторый код, который я вырезал и вставил из одного из моих собственных проектов, поэтому я знаю, что он работает:

int CGraphicDroplist::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
    return 0;
}

void CGraphicDroplist::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    RECT r = lpDrawItemStruct->rcItem;
    CDC  pDC;
    pDC.Attach(lpDrawItemStruct->hDC);

// Put your code to draw the item here.

    pDC.Detach();
}

void CGraphicDroplist::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
    lpMeasureItemStruct->itemHeight = 100;
}
person Adam Pierce    schedule 24.10.2008
comment
Мой класс является производным от CListCtrl, поэтому в нем нет переопределяемых методов, таких как CompareItem или MeasureItem. Не могли бы вы объяснить мне, что происходит между вставкой элемента в CListCtrl и отображением на экране. И может ли метод DrawItem() нарисовать элемент, указанный программистом? Спасибо! - person user26404; 24.10.2008
comment
Ах, моя ошибка, я думал, что вы используете CListBox. Я опубликую другой ответ. - person Adam Pierce; 24.10.2008