Какое сообщение или событие возникает, когда я вызываю метод CListCtrl :: InsertItem ()? - PullRequest
2 голосов
/ 24 октября 2008

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

Спасибо!

Ответы [ 4 ]

1 голос
/ 24 октября 2008

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

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

0 голосов
/ 24 октября 2008

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

0 голосов
/ 24 октября 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;
}
0 голосов
/ 24 октября 2008

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

пример:

m_myListbox.ModifyStyle(0, LBS_OWNERDRAWFIXED, 0);
...