2014-01-08 4 views
1

У меня есть CListCtrl в диалоговом окне MFC. То, что мне нужно сделать, это разбить некоторые элементы на основе условия, чтобы пользователь не мог его выбрать. До сих пор я изменил цвет, но это не правильное решение. Мой код выглядит так:Отключить или greyout строки в CListCtrl Функция Customdraw

void CSomeDialog::OnCustomdrawElementList(NMHDR *pNMHDR, LRESULT *pResult) 
{ 

NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); 
*pResult = 0; 

if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) 
    { 
    *pResult = CDRF_NOTIFYITEMDRAW; 
    } 
else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) 
    { 

    COLORREF crText; 

    //Here I want to do disable based on some condition of the data related to the item// 
    if ((pLVCD->nmcd.dwItemSpec % 2) == 0) 
     crText = RGB(255,0,0); 
    else if ((pLVCD->nmcd.dwItemSpec % 2) == 1) 
     crText = RGB(0,255,0); 

    // Storing the color back 
    pLVCD->clrText = crText; 

    *pResult = CDRF_DODEFAULT; 
    } 
} 

Я не могу найти ссылку на то, как отключить строку.

Еще одна проблема, даже после управления разделяющей частью, как получить данные, относящиеся к элементу здесь, в этой пользовательской функции рисования? pLVCD-> nmcd.lItemlParam можно использовать для вызова GetItemData(). Пожалуйста помоги.

ответ

0

Рисование и отключение ряда - это нечто иное.

Чтобы отключить строку, чтобы ее нельзя было выбрать, используйте LVN_ITEMCHANGING. Проверьте, изменился ли статус с невыбранного на выбранный (сравните uNewState и uOldState о смене LVIS_SELECTED). Если вы не хотите разрешать выбор этого элемента, просто верните TRUE в сообщение WM_NOTIFY.

Чтобы связать данные с элементом в виде списка, легко использовать свободное поле lParam. Здесь вы можете сохранить некоторые пользовательские данные, которые могут указывать на внутреннюю структуру, которая у вас есть. Вы также можете получить доступ к этому полю в процедурах рисования.

+0

На самом деле я должен как-то позволить пользователю мгновенно узнать, что некоторые элементы недействительны для текущего контекста. Для этого мне приходится седеть строку. Я могу изменить цвета, но это не остановит их от выбора инвалидов. Альтернативы, такие как отключение кнопки OK/внутренняя обработка недопустимого всплывающего окна/предупреждения, не являются предпочтительными. –