Utilizzando modali barra di avanzamento le finestre di dialogo in Windows CE?
-
30-09-2019 - |
Domanda
Sto scrivendo un'applicazione Windows CE in C ++ di applicare direttamente il WINAPI. In questa applicazione ho analizzare un file di testo, che può o non può essere di grandi dimensioni e, quindi, può o non può prendere un po 'a carico; e come vorrei aggiungere funzionalità per caricare file attraverso la rete wireless, ho pensato che sarebbe stato meglio aggiungere una barra di avanzamento.
Il mio obiettivo è quello di visualizzare la barra di avanzamento in una finestra di dialogo modale, impedendo in tal modo l'utente di interagire con la finestra principale. Un thread viene creato per eseguire il caricamento in background, lasciando il thread principale per aggiornare l'interfaccia grafica.
Tuttavia, utilizzando impedisce EndDialog()
me per tornare al codice che carica il file fino a quando la finestra è stata chiusa. Ovviamente voglio mostrare la finestra di dialogo e poi caricare il carico, aggiornando periodicamente i progressi dal thread in background. A questo punto so solo di due opzioni per aggirare questo:
- Creare la finestra di dialogo utilizzando
CreateDialog
, modificare il gestore di messaggi per accogliere i messaggi designati per la finestra di dialogo, disattivare la finestra principale e, infine, creare il thread in background. -
Creare il thread in background in uno stato iniziale sospensione, creare la finestra di dialogo utilizzando
DialogBoxParam
passando lungo l'ID del thread, e quando si cattura ilWM_INITDIALOG
riprendere il filo.
Anche se uno qualsiasi di questi due sarebbe probabilmente il lavoro (sto appoggiato verso la seconda opzione), Sono curioso di sapere se questo è il modo in cui si suppone che le barre di avanzamento devono essere manipolati in un ambiente Windows - o se v'è un più snella, più intelligente modo di farlo.
Soluzione
Non devi fare nulla di particolarmente complicato o inusuali. Basta creare la finestra di dialogo modale con DialogBox()
. Nel gestore WM_INITDIALOG
del dialog box procedure, creare il thread in background per caricare il file. Come i progressi di carico, inviare il PBM_SETPOS
messaggio al controllo della barra di progresso per aggiornarlo.
Quando il completamento del caricamento, chiamata EndDialog()
per chiudere la finestra di dialogo. Tuttavia, EndDialog()
deve essere chiamato dall'interno del procedimento di dialogo. Quindi, per fare questo, è necessario inviare un messaggio fittizio (ad esempio 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;
}