2014-09-08 3 views
0

В настоящее время я работаю над таблицей свойств и тем, что моя вторая страница состоит из списка. Я добавил флажок в заголовок столбца и установил listcontrol с помощью стиля LVS_EX_CHECKBOX. Итак, теперь самый первый столбец и его заголовок состоят из флажков.Проблема с обработкой заголовка столбца списка управления?

, когда я устанавливаю флажки, соответствующие элементам один за другим, и когда я проверяю флажок последнего элемента в списке, тогда флажок заголовка также получает флажок. До этого момента это нормально. Теперь я не выбрал все флажки и теперь попробовал щелкнуть заголовок, чтобы установить флажок check для всех элементов checkboxes. К сожалению, я не могу установить флажки элементов списка. Только этот флажок заголовка проверяется и не проверяется.

Добавление флажка в listheader следующим образом в классе страниц.

BOOL OnInitDialog() 
{ 
DWORD dwStyle = ::GetWindowLong(header, GWL_STYLE); 
dwStyle |= HDS_CHECKBOXES; 
::SetWindowLong(header, GWL_STYLE, dwStyle); 

m_listCtrl.SetExtendedStyle(m_listCtrl.GetExtendedStyle() | 
          LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); 

} 

Я попытался обработки следующие события для получения чекбокс заголовок столбца нажмите

HDN_ITEMCLICK 

HDN_ITEMSTATEICONCLICK 

// Это реализуется в обработчике событий LVN_ITEMCHANGED (При проверке элементов списка CheckBox по одному и для окончательной проверки в списке я устанавливаю флажок заголовка).

void CMFPSearchListView::OnListViewItemchanged(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
LVCOLUMN pColumn = {0}; 
pColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
m_listCtrl.GetColumn(0, &pColumn); 
if(blAllChecked) 
    pColumn.fmt |= HDF_CHECKED; 
else 
    pColumn.fmt &= ~HDF_CHECKED; 


//m_listCtrl.InsertColumn(1, &pColumn); 
m_listCtrl.SetColumn(0, &pColumn); 
*pResult=0;  
} 

Может кто-нибудь, пожалуйста, сообщите мне, если я не инициирую правильное событие. Любая помощь приветствуется.

ответ

0

Это сообщение HDN_ITEMSTATEICONCLICK, которое необходимо обработать.

ON_NOTIFY(HDN_ITEMSTATEICONCLICK, 0, &CMFPSearchListView::OnHdnItemStateIconClickListctrl) 

Handler Код:

void CMFPSearchListView::OnHdnItemStateIconClickListctrl(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    LPNMHEADER pNMHeader = (LPNMHEADER)pNMHDR; 

    // first determine whether the click was a checkbox change 
    if (pNMHeader->pitem->mask & HDI_FORMAT && pNMHeader->pitem->fmt & HDF_CHECKBOX) 
    { 
     // now determine whether it was checked or unchecked 
     BOOL bUnChecked = pNMHeader->pitem->fmt & HDF_CHECKED; 

     // apply check state to each list item 
     for (int nItem = 0; nItem < m_listCtrl.GetItemCount(); nItem++) 
      m_listCtrl.SetCheck(nItem, !bUnChecked); 
    } 

    *pResult = 0; 
} 
+0

Спасибо за ваш reply.When я сделал, как Вы предложили, когда я проверяю флажок заголовка, то все элементы становятся проверены, но целые элементы в списке приходят в режим выбора (выбор синего цвета для всех элементов в списке). Как мы можем избежать этого выбора, когда мы выбираем флажок заголовка, только элементы должны быть выбраны правильно? Перед тем, как этот выбор не наступит. После этого, как вы предложили , это из-за каких-либо настроек стиля? – Siva

+0

На самом деле listcontrol имеет следующий стиль. m_listCtrl.SetExtendedStyle (m_listCtrl.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); изменить стиль listcontrol? – Siva

+0

Все выбранные элементы являются поведением CListCtrl по умолчанию при возврате с 'pResult = 0;' – acraig5075

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