Perguntas sobre CListCtrl com caixas de seleção
O controle de lista é definido como seleção única nos recursos.
Questão 1
Quero ter uma caixa de seleção no cabeçalho da primeira coluna da minhaCListCtrl
. NoOnInitDialog
eu tenho
m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
CString s;
s.LoadString(IDS_COLUMN1);
#ifndef HDS_CHECKBOXES
// Copied from Microsoft SDKs\Windows\v7.0A\Include\CommCtrl.h
#define HDS_CHECKBOXES 0x0400
#endif
CHeaderCtrl& header = *m_list.GetHeaderCtrl();
header.ModifyStyle(0, HDS_CHECKBOXES);
#ifndef HDF_CHECKBOX
// Copied from Microsoft SDKs\Windows\v7.0A\Include\CommCtrl.h
#define HDF_CHECKBOX 0x0040
#endif
LVCOLUMN lc = { 0 };
lc.mask = LVCF_FMT |LVCF_WIDTH |LVCF_TEXT | LVCF_SUBITEM;
lc.fmt |= HDF_CHECKBOX;
lc.cx = 96;
lc.pszText = (TCHAR*) (LPCTSTR)s;
m_list.InsertColumn(0, &lc);
Ele só apresenta a caixa de seleção do cabeçalho se eu adicionar o|LVS_EX_AUTOCHECKSELECT
, que definitivamente não quero, porque desejo que a ação de verificação e ação de seleção seja usada para diferentes propósitos.
Questão 2
Preciso definir um valor booleano e marcar como modificado quando o usuário marcar ou desmarcar um item. Mas não quero que essa ação ocorra ao inserir itens, por exemplo, ao preencher a lista no carregamento do formulário, mas é acionada sem a minha intenção, comoInsertItem
aciona "uma ação desmarcar" emOnItemChanged
.
Obrigou-me a condicionar cada inserto com umm_is_inserting
bandeira do membro:
m_is_inserting = true;
m_list.InsertItem(i, m_array[i]->GetName());
m_is_inserting = false;
e reagir de acordo com aLVN_ITEMCHANGED
manipulador
void CMyDialog::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if (pNMListView->uChanged & LVIF_STATE)
{
if (pNMListView->uNewState & LVIS_SELECTED)
OnSelect();
else
{
if (pNMListView->iItem != -1)
{
if ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) == 0x1000)
{
if (!m_is_inserting)
{
m_array[pNMListView->iItem]->m_active = false;
SetModified();
}
}
else if ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) == 0x2000)
{
if (!m_is_inserting)
{
m_array[pNMListView->iItem]->m_active = true;
SetModified();
}
}
}
}
}
*pResult = 0;
}
Existe uma maneira melhor de distinguir uma ação real de verificação / desmarcação do usuário de umaInsertItem
efeito colateral?
Questão 3
Existe uma convenção simbólica melhor para obter o estado de marcar / desmarcar? Números mágicos0x1000
e0x2000
são bem sem sentido!
Desde já, obrigado.