Utilisation des contrôles de barre de progression
Cette rubrique explique comment utiliser une barre de progression pour indiquer la progression d’une longue opération d’analyse de fichiers.
Bon à savoir
Technologies
Prérequis
- C/C++
- Programmation de l’interface utilisateur Windows
Instructions
Créer un contrôle de barre de progression
L’exemple de code suivant crée une barre de progression et la positionne le long du bas de la zone cliente de la fenêtre parente. La hauteur de la barre de progression est basée sur la hauteur de la bitmap de flèche utilisée dans une barre de défilement. La plage est basée sur la taille du fichier divisée par 2 048, soit la taille de chaque « bloc » de données lu à partir du fichier. L’exemple définit également un incrément et avance la position actuelle de la barre de progression par l’incrément après l’analyse de chaque segment.
// 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;
}
Notes
Vous devez vous assurer d’utiliser correctement la fonction ReadFile pour garantir la sécurité de votre application. Par instance, dans l’exemple de code, vous devez case activée pour vous assurer que ReadFile
lit effectivement toutes les données demandées.
Notez également que le quatrième paramètre de CreateFile ((LPSECURITY_ATTRIBUTES)NULL) définit les valeurs de sécurité par défaut. Si vous avez besoin de paramètres de sécurité spécifiques, vous devez définir les valeurs appropriées dans les membres de la structure. Appelez sizeof pour définir la taille correcte de la structure LPSECURITY_ATTRIBUTES .
Pour plus d’informations, consultez Considérations relatives à la sécurité : contrôles Microsoft Windows.
Rubriques connexes