WinNT Sí
Win95 Sí
Win32s Sí
• Biblioteca = user32.lib • Cabecera = winser.h
• Unicode = WinNT
• Plataforma = Nada

DlgDirList

La función DlgDirList llena el list box especificado con los nombres de todos los ficheros en el camino o nombre de fichero especificado.

Sintaxis

int DlgDirList(
    HWND hDlg,          // manipulador de cuadro de diálogo con list box
    LPTSTR lpPathSpec,  // puntero a cadena de camino o nombre de fichero
    int nIDListBox,     // identificador de list box
    int nIDStaticPath,  // identificador de control estático
    UINT uFileType      // atributos de fichero a mostrar
   );

Parámetros

hDlg: identifica el cuadro de diálogo que contiene el list box.

lpPathSpec: apunta a una cadena terminada en cero que contiene el camino o el nombre de fichero. DlgDirList modifica esta cadena, de modo que debe ser lo suficientemente larga para contener las modificaciones. Para más información sobre este parámetro, ver la sección de observaciones.

nIDListBox: especifica el identificador de un list box. Si este parámetro es cero, DlgDirList asume que no existe list box y no intenta llenarlo.

nIDStaticPath: especifica el identificador del control estático usado para mostrar el disco y directorio actuales. Si este parámetro es cero, DlgDirList asume que no existe tal control.

uFileType: especifica los atributos de los nombres de fichero a mostrar. Este parámetro debe tener uno o más de los siguientes valores:

Valor Descripción
DDL_ARCHIVE Incluye los ficheros con bit de archivo.
DDL_DIRECTORY Incluye subdirectorios. Los nombres de subdirectorio se muestran entre corchetes ([ ]).
DDL_DRIVES Incluye unidades. Las unidades de almacenamiento se listan en el formato [-x-], donde x es la letra de la unidad.
DDL_EXCLUSIVE Incluye sólo ficheros con los atributos especificados. Por defecto, se muestran los ficheros de lectura-escritura aunque no se especifique el valor DDL_READWRITE.
DDL_HIDDEN Incluye ficheros ocultos.
DDL_READONLY Incluye ficheros de sólo lectura.
DDL_READWRITE Incluye ficheros de lectura-escritura sin atributos adicionales.
DDL_SYSTEM Incluye ficheros de sistema.
DDL_POSTMSGS Envía los mensajes lentos (post) a la cola de mensajes de la aplicación. Por defecto, DlgDirList envía los mensajes directamente al procedimiento de diálogo.

Valor de retorno

Si se crea una lista, aunque sea una lista vacía, el valor de retorno es distinto de cero. Si la cadena de entrada no contiene un camino de búsqueda válido, el valor de retorno es cero.

Observaciones

Si se especifica una cadena de longitud cero para el parámetro lpPathSpec o si se especifica sólo un nombre de directorio sin nombre de fichero, la cadena se cambiará por *.*.

El parámetro lpPathSpec tiene el formato siguiente:

[drive:] [[\u]directory[\idirectory]\u] [filename]

En este ejemplo, drive es una letra de unidad de almacenamiento, directory es un nombre de directorio válido y filename es un nombre de fichero válido que debe contener al menos un comodín (? o *).

Si lpPathSpec incluye una unidad de almacenamiento o un nombre de directorio, o ambos, la unidad de almacenamiento y el directorio se cambian a los valores espeficados antes de que se llene el list box. El control estático identificado por el parámetro nIDStaticPath también se actualiza con la nueva unidad de almacenamiento o nombre de directorio, o ambos.

Después de que el list box se llene, DlgDirList actualiza lpPathSpec eliminando la porción de la unidad de almacenamiento o del directorio, o ambos, del camino o nombre de fichero.

DlgDirList envía los mensajes LB_RESETCONTENT y LB_DIR al list box.



suministrado por FreeFind
Valid HTML 4.0! Valid CSS!

Comentarios de los usuarios (4)

Cristian
2018-02-21 10:59:51

buenos dias, tengo una duda con el identificador de la list box. tengo este codigo:

cmd12=  CreateWindow(TEXT("LISTBOX"),TEXT("123"),
              WS_BORDER | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP |WS_CHILD,
              180, 180 ,160 ,60,
              hwnd, (HMENU) 2, NULL, NULL
              );
[...]
INT_PTR CALLBACK DlgDelFileProc(HWND hDlg, UINT message, 
        UINT wParam, LONG lParam) 
{ 
    PTSTR pszCurDir; 
    PTSTR pszFileToDelete; 
    int iLBItem; 
    int cStringsRemaining; 
    int iRet; 
    TCHAR achBuffer[MAX_PATH]; 
    TCHAR achTemp[MAX_PATH]; 
    BOOL fResult;     
 
    switch (message) 
    { 
        case WM_INITDIALOG: 
 
           // Initialize the list box by filling it with files from 
           // the current directory. 
           pszCurDir = achBuffer; 
           GetCurrentDirectory(MAX_PATH, pszCurDir); 
           DlgDirList(hDlg, pszCurDir, ¿¿¿¿????, 0, DDL_HIDDEN);

entonces, ¿cual seria el tercer parametro de DlgDirList?¿se puede tener la declaracion del static en diferente callback que el proceso para rellenarlo?

gracias de antemano

Steven R. Davidson
2018-02-21 18:06:52

Hola Cristian,

El problema del ejemplo es que el control de "listbox" que fue creado tiene como ventana pariente, 'hwnd', que seguramente no es la ventana del cuadro del diálogo. 'DlgDirList()' espera identificadores de controles de la ventana que se indica. Esto es,

DlgDirList( hwnd, pszCurDir, 2, 0, DDL_HIDDEN );

La otra posibilidad es asociar el control de "listbox" al cuadro de diálogo; esto es,

cmd12 = CreateWindow(TEXT("LISTBOX"),TEXT("123"),
              WS_BORDER | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP |WS_CHILD,
              180, 180 ,160 ,60,
              hDlg, (HMENU) 2, NULL, NULL
              );
...
DlgDirList( hDlg, pszCurDir, 2, 0, DDL_HIDDEN );

La documentación dice: "hDlg: identifica el cuadro de diálogo que contiene el list box". Por lo tanto, hay que relacionar cada control con su ventana pariente. Si un control pertenece a una ventana, pero al invocar 'DlgDirList()' se escribe otra ventana, entonces esta función no usará el control deseado.

Espero que esto aclare la duda.

Steven

Cristian
2018-02-22 11:04:53

Buenas Steven, muchas gracias por responder tan rapido. Duda resuelta, gracias por la ayuda. Dejo el codigo completo para crear una listbox y llenarla con el nombre de los ficheros de la carpeta donde esta el programa. Luego recojo el nombre que tenemos seleccionado en la listbox cuando le damos a otro boton, abro el archivo y leo la primera linea de este. Espero que le pueda ayudar a alguien.

 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) //lo hago todo a traves de la ventana principal (no MDI)
{
         PTSTR pszCurDir; 
         char cad[512];
[...]
            hInstance = ((LPCREATESTRUCT)lParam)->hInstance;          	//creamos el control estatico listbox:
			cmd12=  CreateWindowEx(0,TEXT("LISTBOX"),TEXT("123"),
              WS_BORDER | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP |WS_CHILD| WS_VISIBLE,
              180, 180 ,160 ,60,
              hwnd, (HMENU) ID_LISTA, hInstance, NULL
              );
      
      //ahora vamos a recoger el dato del directorio donde nos encontramos:
    case XYZ:
      pszCurDir = achBuffer; //lo declaramos como buffer
      GetCurrentDirectory(MAX_PATH, pszCurDir);//guardamos el directorio
       DlgDirList(hwnd, pszCurDir , ID_LISTA, 0, DDL_HIDDEN );//en esta funcion pasamos los nombres a la lista;DDL_HIDDEN para mostrar archivos ocultos;ID_LISTA el "case" de la listbox creada anteriormente.
     break;

       //una vez tenemos la listbox creada, vamos a leer el elemento selecionado en la lista(leere el nombre,con otras funciones se puede leer el indice etc..)
  case ABC:
    DlgDirSelectEx(hwnd, cad, 50, ID_LISTA);//cogemos el dato y lo guardamos en "cad"
    
       //ahora, por ejemplo, vamos a leer la primera linea del archivo. (nota) uso fstream porque no me interesa meter todo el archivo en el buffer, trabajo con lineas. para controles edit no usar fstream.
    fstream fichero1;
    fichero1.open ( cad , ios::in);
    fichero1.getline(entrada.cadena1,128);//cojo la linea y la meto en una estructura creada previamente
   break;

si se te ocurre alguna forma de optimizarlo, todo sea por mejorar. enhorabuena por la web, es de gran ayuda y tiene mucha clase :)

Cristian
2018-02-22 12:45:56

me he dejado esto:

case ID_LISTA:
                 switch(HIWORD(wParam)) {
                   case LBN_DBLCLK:
                      if(DlgDirSelectEx(hwnd, cad, 50, ID_LISTA)) {
                         strcat(cad, "*.c");
                       
                      } else
                         MessageBox(hwnd, cad, "Fichero seleccionado", MB_OK);
                      break;
[\code]