PDA

Visualizza la versione completa : [C++] Creare e visualizzare un box di caricamento in Visual C++


Alcott
09-03-2007, 12:03
Ciao raga,
avrei la necessità di inserire nella mia applicazione un box senza pulsanti con la scritta "Caricamento..." (o roba del genere) e che, una volta terminato di caricare, questo si chiuda automaticamente.
In pratica, prima di chiudere una pagina con l' EndModal(), devo eseguire delle operazioni e nell' attesa vorrei far visualizzare il box, che poi si chiude automaticamente.

Grazie anticipatamente :ciauz:

MItaly
09-03-2007, 21:47
Puoi postare quello che hai scritto fino ad ora? Stai usando qualche framework (tipo MFC o ATL)?

Alcott
12-03-2007, 16:21
Ciao. Sto usando MFC.

Appena entro rendo la finestra modale, dall OnInitDlg mi viene generato un thread.
La schermata di caricamento dovrebbe apparire quando chiudo il thread, che aspetto per qualche secondo la chiusura di questu'ultimo.
Eccoti lo spezzone di codice per la chiusura del thread (spero basti):



void RFAmbiente::Chiudi() {
GetDlgItem(IDC_CHIUDI_CONFIG_MMC)->ShowWindow(FALSE);
GetDlgItem(IDC_CHIUDI_CONFIG_MMC2)->ShowWindow(TRUE);
UpdateWindow();

go = false;
//MessageBox(L"qui!");
if (threadTerminato == false) {
// Sleep(5000);
TerminateThread(rfThread, -1);
Sleep(1000);
CloseHandle(rfThread);
}

Logger::log(L"RFAmbiente", L"OnChiudi 1", 9);

// if (hf!=NULL && modalita!=2 && modalita!=3) SIMUtil::ClosePort(hf);
if (hf != NULL) {
SIMUtil::GetCMD(hf, "AT*BRK");
Sleep(2000);
SIMUtil::GetCMD(hf, "AT*Q");
Sleep(3000);
SIMUtil::ClosePort(hf);
hf = NULL;
}

EndDialog(0);
}

void RFAmbiente::OnChiudiConfigMmc() {

if (modalita==0 || (salva==1 && result!=NULL) || modalita==3) {
MessageBox(L"QUI 1!");
if (modalita!=0 && salva!=1 && modalita!=3) {
MessageBox(L"QUI 2!");
if (SystemUtil::InputBox(
CString("I dati non verranno memorizzati; sei sicuro di voler abbandonare l'operazione di RFAmbiente?"),
MB_YESNO)==IDYES) {
MessageBox(L"QUI 3!");
result = NULL;
Chiudi();
}
}
else {
MessageBox(L"QUI 4!");
Chiudi();
}
}
else {
MessageBox(L"QUI 5!");
if (SystemUtil::InputBox(
CString("I dati non sono stati ancora memorizzati; sei sicuro di voler abbandonare l'operazione di RFAmbiente?"),
MB_YESNO)==IDYES) {
MessageBox(L"QUI 6!");
Chiudi();
}
}
}


Premendo sul pulsante di chiusura della finestra, mi viene richiamato il metodo OnChiudiConfigMmc().
Per quanto riguarda il box, mi basta anche una cosa statica che ha solo la scritta senza elementi "dinamici" (tipo barre di caricamento etc).
Un altra cosetta :) Nel primo IF del metodo Chiudi(), mi conviene usare secondo te il WaitForSingleObject() o va bene così?

Grazie :ciauz:

MItaly
12-03-2007, 16:59
Be', non basta mostrare una normale finestra (in un thread separato) e poi chiuderla quando termini di attendere l'altro thread? Quanto alla seconda domanda, io userei una WaitForSingleObject.

Loading