CListCtrl con preguntas de casillas de verificación
El Control de lista se define como Selección única en los recursos.
Pregunta 1
Quiero tener una casilla de verificación en el encabezado de la primera columna de miCListCtrl
. Sobre elOnInitDialog
yo tengo
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);
Solo presenta la casilla de verificación del encabezado si agrego el extendido|LVS_EX_AUTOCHECKSELECT
, que definitivamente no quiero porque deseo que la acción de verificación y la acción de selección se usen para diferentes propósitos.
Pregunta 2
Necesito establecer un elemento booleano y marcarlo como modificado cuando el usuario marca o desmarca un elemento. Pero no quiero que ocurra esta acción al insertar elementos, por ejemplo, al completar la lista al cargar el formulario, pero se desencadena sin mi intención, comoInsertItem
desencadena "una acción de desmarcar" enOnItemChanged
.
Me obligó a acondicionar cada inserto con unm_is_inserting
bandera de miembro:
m_is_inserting = true;
m_list.InsertItem(i, m_array[i]->GetName());
m_is_inserting = false;
y reaccionar en consecuencia en elLVN_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;
}
¿Hay una mejor manera de distinguir una acción real de verificación / desmarcación de usuario de unaInsertItem
¿efecto secundario?
Pregunta 3
¿Existe una mejor convención simbólica para obtener el estado de marcar / desmarcar? Números mágicos0x1000
y0x2000
son bastante sin sentido!
Gracias por adelantado.