Поделиться через


Использование индикатора выполнения

В этом разделе объясняется, как использовать индикатор выполнения для указания хода выполнения длительной операции синтаксического анализа файлов.

Что нужно знать

Технологии

Необходимые условия

  • C/C++
  • Программирование пользовательского интерфейса Windows

Инструкции

Создание элемента управления "Индикатор выполнения"

В следующем примере кода создается индикатор выполнения и он располагается вдоль нижней границы клиентской области родительского окна. Высота индикатора выполнения зависит от высоты растрового изображения со стрелкой, используемого в полосе прокрутки. Диапазон основан на размере файла, разделенного на 2048, который представляет собой размер каждого блока данных, считываемых из файла. В примере также устанавливается приращение и перемещается текущее положение ползунка после парсинга каждого блока.

// 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; 
}

Замечания

Чтобы обеспечить безопасность приложения, необходимо правильно использовать функцию ReadFile. Например, в примере кода необходимо проверить, что ReadFile фактически считывает все запрошенные данные.

Также обратите внимание, что четвертый параметр CreateFile—(LPSECURITY_ATTRIBUTES)NULL— задает значения безопасности по умолчанию. Если вам нужны определенные параметры безопасности, необходимо задать соответствующие значения в элементах структуры. Вызовите sizeof, чтобы задать правильный размер структуры LPSECURITY_ATTRIBUTES.

Дополнительные сведения см. в статье Вопросы безопасности: элементы управления Microsoft Windows.

с помощью элементов управления "Индикатор выполнения"

вопросы безопасности : элементы управления Microsoft Windows