Al control treeview a mi juicio le faltan algunas funciones como CheckAll o FindItem. Para esto escribi estas funciones. Lo que hacen es simplemente ir recorriendo el control, si tienen hijos no es archivo y por lo tanto entra y busca hermanos si son carpetas(tienen hijos) se vuelve a llamar a si misma hasta que no tiene mas hijos y entonces lo chekea y se ajustan los contadores. Siempre hay que conservar el valor anterior del HTREEITEM "hElementoMem" para volver a las precesivas carpetas cuando termina la llamada a la funcion recursiva y vuelve para terminar la funcion. Observar que se declara la variable hElementoMem dentro del bucle y que cada vez que se vuelve a llamar a la funcion recursiva se crea otra nueva variable y asi indefinidamente.
Con este sistema tambien se podrian buscar cadenas de texto en los items para que por ejemplo al pulsar sobre ellos se cargue el archivo y tambien lo he usado para montar la ruta completa del mismo y asi no tener que guardar un array con las rutas completas.
PD: Supongo que vosotros esto lo tendreis mas que visto, pero si no es asi o creeis que es de interes, gustoso os mandare los otros ejemplos citados en la descripcion.
void CReempView::SelTodoLista()//Al cargar una lista de archivos en un treeview con checks ejecutamos esta funcion
{
nArchTotal=0;
nArchCheq=0;
hElemento=m_CtrlLista.GetRootItem();
m_CtrlLista.SetCheck(hElemento);
m_CtrlLista.GetChildItem(hElemento);
RecurSelTodoLista();
}
void CReempView::RecurSelTodoLista()//Funcion recursiva
{
do{
if(!m_CtrlLista.ItemHasChildren(hElemento))//Si no tiene hijos
{
m_CtrlLista.SetCheck(hElemento,bSelTodo);
hElemento=m_CtrlLista.GetNextSiblingItem(hElemento);
nArchTotal++;
nArchCheq++;
}
else if(m_CtrlLista.ItemHasChildren(hElemento))//Si Tiene Hijos
{
HTREEITEM hElementoMem;
hElementoMem=hElemento;
m_CtrlLista.SetCheck(hElemento,bSelTodo);
hElemento=m_CtrlLista.GetChildItem(hElemento);
RecurSelTodoLista();
hElemento=hElementoMem;
hElemento=m_CtrlLista.GetNextSiblingItem(hElemento);
}
}while(hElemento!=NULL);
}
Éste código fue enviado por Antares el 28 de octubre del 2002 orionmaps@tiscali.es
Si quieres enviar tu propio código hazlo a eth_cotd@lycos.es
Sin duda, una forma peculiar de función recursiva :) ...
Por optimizar un poquillo, yo diria que sobra código en la siguiente línea:
else if(m_CtrlLista.ItemHasChildren(hElemento))
ya que es la misma comparación pero a la inversa yo pondría solo esto :ojo: :
else
un saludo