2010-08-21 5 views
1

J'écris une application Windows CE en C++ en appliquant directement le WINAPI. Dans cette application, j'analyse un fichier texte, qui peut être ou ne pas être grand et peut donc prendre un certain temps à charger; et comme je vais ajouter des fonctionnalités pour charger des fichiers sur le réseau sans fil, j'ai pensé qu'il serait préférable d'ajouter une barre de progression.Utilisation de boîtes de dialogue de barre de progression modale dans Windows CE?

Mon but est d'afficher la barre de progression dans une boîte de dialogue modale, empêchant ainsi l'utilisateur d'interagir avec la fenêtre principale. Un thread est ensuite créé pour effectuer le chargement en arrière-plan, laissant le thread principal pour mettre à jour l'interface graphique. Cependant, l'utilisation de EndDialog() m'empêche de retourner au code qui charge le fichier jusqu'à la fermeture de la boîte de dialogue. Évidemment je veux montrer le dialogue et puis charger la charge, mettant à jour périodiquement la progression du fil d'arrière-plan. A ce stade, je ne connais que deux options pour contourner ceci:

  1. Créer la boîte de dialogue à l'aide CreateDialog, modifiez le gestionnaire de messages pour recevoir des messages désignés à la boîte de dialogue, désactivez la fenêtre principale et enfin créer le fil d'arrière-plan.
  2. Créez le thread d'arrière-plan dans un état initial suspendu, créez le dialogue en utilisant DialogBoxParam en passant l'ID de thread, et en capturant le WM_INITDIALOG reprenez le thread.

Bien que l'un de ces deux fonctionneraient probablement (je penche vers la deuxième option), je suis curieux de savoir si cela est la façon dont les barres de progression sont censés être traités dans un environnement Windows - ou s'il y a une façon plus légère et plus intelligente de le faire.

Répondre

0

Vous n'avez rien à faire de particulièrement délicat ou inhabituel. Il suffit de créer la boîte de dialogue modale avec DialogBox(). Dans le gestionnaire WM_INITDIALOG de votre procédure de boîte de dialogue, créez le thread d'arrière-plan pour charger le fichier. Au fur et à mesure du chargement, envoyez le message PBM_SETPOS au contrôle de la barre de progression pour le mettre à jour.

Une fois le chargement terminé, appelez le EndDialog() pour fermer la boîte de dialogue. Cependant, EndDialog() doit être appelée à partir de votre procédure de dialogue. Donc, pour ce faire, vous devez envoyer un message fictif (par exemple WM_APP):

DialogBox(..., DlgProc); 
// File loading is done and dialog box is gone now 
... 
INT_PTR CALLBACK DlgProc(HWND hwnd, UINT msg, LPARAM lparam, WPARAM wparam) 
{ 
    switch(msg) 
    { 
    case WM_INITDIALOG: 
     CreateThread(..., LoadingThread, ...); 
     return TRUE; 

    case WM_APP: 
     EndDialog(hwnd); 
     return TRUE; 
    ... 
    } 

    return FALSE: 
} 

DWORD WINAPI LoadingThread(LPVOID param) 
{ 
    // Load the file 
    while(!done) 
    { 
     ... 
     SendMessage(hwndProgressBar, PBM_SETPOS, progress, 0); 
    } 

    SendMessage(hwndDialogBox, WM_APP, 0, 0); 
    return 0; 
} 
+0

Ceci est à peu près exactement ce que je fais (option 2), sauf que j'ai choisi de déplacer la configuration et de la création du fil à l'extérieur du dialogue. La raison en est que j'ai isolé toute la boîte de dialogue de la barre de progression dans sa propre classe et que je ne veux pas avoir de fonctionnalité liée au back-end. Je n'appellerais pas vraiment cela «fantaisie». ^^ – gablin

Questions connexes