Compartir a través de


Cómo usar controles de barra de progreso

En este tema se explica cómo usar una barra de progreso para indicar el progreso de una operación larga de análisis de archivos.

Lo que necesita saber

Tecnologías

Requisitos previos

  • C/C++
  • Programación de la interfaz de usuario de Windows

Instrucciones

Crear un control de barra de progreso

El código de ejemplo siguiente crea una barra de progreso y la coloca en la parte inferior del área cliente de la ventana primaria. El alto de la barra de progreso se basa en el alto del mapa de bits de flecha usado en una barra de desplazamiento. El intervalo se basa en el tamaño del archivo dividido por 2048, que es el tamaño de cada "fragmento" de datos que se lee del archivo. En el ejemplo también se establece un incremento y se avanza la posición actual de la barra de progreso por el incremento después de analizar cada fragmento.

// ParseALargeFile - uses a progress bar to indicate the progress of a parsing operation.
//
// Returns TRUE if successful, or FALSE otherwise.
//
// hwndParent - parent window of the progress bar.
//
// lpszFileName - name of the file to parse. 
// 
// Global variable 
//     g_hinst - instance handle.
//

extern HINSTANCE g_hinst; 

BOOL ParseALargeFile(HWND hwndParent, LPTSTR lpszFileName) 
{ 
    RECT rcClient;  // Client area of parent window.
    int cyVScroll;  // Height of scroll bar arrow.
    HWND hwndPB;    // Handle of progress bar.
    HANDLE hFile;   // Handle of file.
    DWORD cb;       // Size of file and count of bytes read.
    LPCH pch;       // Address of data read from file.
    LPCH pchTmp;    // Temporary pointer.

    // Ensure that the common control DLL is loaded, and create a progress bar 
    // along the bottom of the client area of the parent window. 
    //
    // Base the height of the progress bar on the height of a scroll bar arrow.
    
    InitCommonControls(); 
    
    GetClientRect(hwndParent, &rcClient); 
    
    cyVScroll = GetSystemMetrics(SM_CYVSCROLL); 

    hwndPB = CreateWindowEx(0, PROGRESS_CLASS, (LPTSTR) NULL, 
                            WS_CHILD | WS_VISIBLE, rcClient.left, 
                            rcClient.bottom - cyVScroll, 
                            rcClient.right, cyVScroll, 
                            hwndParent, (HMENU) 0, g_hinst, NULL);

    // Open the file for reading, and retrieve the size of the file. 

    hFile = CreateFile(lpszFileName, GENERIC_READ, FILE_SHARE_READ, 
                       (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, 
                       FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); 

    if (hFile == (HANDLE) INVALID_HANDLE_VALUE)
        return FALSE; 

    cb = GetFileSize(hFile, (LPDWORD) NULL); 

    // Set the range and increment of the progress bar. 

    SendMessage(hwndPB, PBM_SETRANGE, 0, MAKELPARAM(0, cb / 2048));
    
    SendMessage(hwndPB, PBM_SETSTEP, (WPARAM) 1, 0); 

    // Parse the file. 
    pch = (LPCH) LocalAlloc(LPTR, sizeof(char) * 2048); 
    
    pchTmp = pch; 
    
    do { 
        ReadFile(hFile, pchTmp, sizeof(char) * 2048, &cb, (LPOVERLAPPED) NULL);
        
        // TODO: Write an error handler to check that all the
        // requested data was read.
        //
        // Include here any code that parses the
        // file. 
        //  
        //  
        //  
        // Advance the current position of the progress bar by the increment.
        
        SendMessage(hwndPB, PBM_STEPIT, 0, 0); 
        
    } while (cb); 

    CloseHandle((HANDLE) hFile);
    
    DestroyWindow(hwndPB);

    return TRUE; 
}

Comentarios

Debe asegurarse de usar correctamente la función ReadFile para garantizar la seguridad de la aplicación. Por ejemplo, en el código de ejemplo, debe comprobar que ReadFile realmente lee todos los datos solicitados.

Observe también que el cuarto parámetro de CreateFile ((LPSECURITY_ATTRIBUTES)NULL establece los valores de seguridad predeterminados. Si necesita una configuración de seguridad específica, debe establecer los valores adecuados en los miembros de la estructura. Llame a sizeof para establecer el tamaño correcto de la estructura LPSECURITY_ATTRIBUTES .

Para obtener más información, vea Consideraciones de seguridad: Controles de Microsoft Windows.

Uso de controles de barra de progreso

Consideraciones de seguridad: Controles de Microsoft Windows