2010-05-13 7 views
0

J'ai un programme simple MFC qui affiche le progressbar..I utilisé le code ci-dessous pour afficher la barre de progression ..Problème afficher la boîte de message dans MFC

HWND dialogHandle = CreateWindowEx(0,WC_DIALOG,L"Proccessing...",WS_OVERLAPPEDWINDOW|WS_VISIBLE, 
        600,300,280,120,NULL,NULL,NULL,NULL); 
HWND progressBarHandle = CreateWindowEx(NULL,PROGRESS_CLASS,NULL,WS_CHILD|WS_VISIBLE|PBS_MARQUEE,40,20,200,20, 
      dialogHandle,(HMENU)IDD_PROGRESS,NULL,NULL); 

while(FALSE == testResult) 
    { 
     MSG msg; 
     SendMessage(progressBarHandle, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); 
     SendMessage(progressBarHandle,PBM_SETPOS,0,0); 
     ShowWindow(progressBarHandle,SW_SHOW); 
     Sleep(50); 
      if(TRUE == myCondition)//myCondition is a bool variable which is decalred globally 
      { 

       DestroyWindow(dialogHandle); 
       AfxMessageBox(L"Test Success"); 
      } 
     } 

quand je l'execute code..the ci-dessus La boîte de message s'affiche uniquement après un événement de survol de la souris. Si je déplace la souris, la boîte de message s'affichera si elle ne s'affiche pas tant que je n'ai pas déplacé la souris. Et aussi pendant que la barre de progression est en cours d'exécution si j'essaie de déplacer la fenêtre de la barre de progression .. Elle affiche un fond de fenêtre sur le lieu de déplacement et aussi dans la nouvelle région ou parfois coincée.

EDIT2: pompage de messages.

while(PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE) && (FALSE == testResult)) 
    { 
     if(msg.message == WM_QUIT) 
     { 
     DestroyWindow(dialogHandle); 
     return TRUE; 
     } 
     SendMessage(progressBarHandle, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); 
     SendMessage(progressBarHandle,PBM_SETPOS,0,0); 
     ShowWindow(progressBarHandle,SW_SHOW); 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
     //return 1; 
    } 
+1

Vous êtes sûr de gérer les messages Windows pendant ces événements? Ce que vous avez décrit ressemble à la pompe pour le flux d'événements a cessé d'être traitée. – AlG

+0

de cette façon le corps ne fonctionnera pas à moins qu'il y ait des messages dans la file d'attente, c'est-à-dire des messages de la souris. –

Répondre

0

Je ne suis pas sûr du comportement que vous essayez d'atteindre.
Le problème majeur est que votre fenêtre principale doit traiter les messages afin de se comporter correctement, et vous ne le faites pas.

while (FALSE == testResult) { 
    MSG msg; 
    // Here you `reset` the progress bar, one each turn, why? 
    SendMessage(progressBarHandle, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); 
    SendMessage(progressBarHandle,PBM_SETPOS,0,0); 
    ShowWindow(progressBarHandle,SW_SHOW); 
    Sleep(50); // <-- here you PAUSE main thread for 50 milliseconds 

    // myCondition is a bool variable which is decalred globally 
    if (TRUE == myCondition) { 
      DestroyWindow(dialogHandle); 
      AfxMessageBox(L"Test Success"); 
    } 

    // Here you'll loop, and you don't give the main thread a chance to 
    // process the message queue. 
} 

À mon avis, au lieu d'utiliser un Sleep(50); que vous pourriez installer un timer et utiliser son rappel pour mettre à jour la barre de progression. C'est une solution naïve, mais vous pouvez essayer.

Modifier: Peut-être que cela? Je ne l'ai pas testé.

while (FALSE == testResult) { 
    MSG msg; 
    // Here you `reset` the progress bar, one each turn, why? 
    SendMessage(progressBarHandle, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); 
    SendMessage(progressBarHandle,PBM_SETPOS,0,0); 
    ShowWindow(progressBarHandle,SW_SHOW); 
    Sleep(50); // <-- here you PAUSE main thread for 50 milliseconds 

    // myCondition is a bool variable which is decalred globally 
    if (TRUE == myCondition) { 
     AfxMessageBox(L"Test Success") 
     DestroyWindow(dialogHandle); 
     return TRUE; 
    } 

    // Process the message queue 
    while(PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE)) { 
     if(msg.message == WM_QUIT) { 
      DestroyWindow(dialogHandle); 
      return TRUE; 
     } 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 
+0

ok, pouvez-vous me dire comment il peut être géré par le fil principal. – kiddo

+0

@kiddo, ne préfères-tu pas utiliser une minuterie? –

+0

oui Nick, je peux le faire avec minuterie..mais cette chose je voulais juste connaître la cause du problème et je comment il peut être manipulé (juste pour la connaissance) .est-ce la même cause (que vous avez) qui fait la fenêtre de la barre de progression s'est-elle bloquée quand elle a été déplacée? – kiddo

0

AfxMessageBox appelle la MessageBox sur le CWinApp (par CWinApp Obtainable). En tant que tel, je vais deviner que le code que vous avez posté est dans un fil (également en raison de vos messages récents). Par conséquent, lorsque vous appelez le AfxMessageBox, il attend sur le thread principal pour qu'il s'affiche réellement.

Si vous appelez

MessageBox(NULL, L"Test Success", NULL, MB_OK); 

ça marche alors? Si oui, c'est très probablement votre problème ...

Edit: Hmm c'est dur parce que j'ai transplanté votre boucle d'origine dans une application MFC vide et cela a bien fonctionné. Le problème doit exister dans un autre morceau de code quelque part ... À quoi ressemble le thread qui définit myCondition?

+0

Goz, en fait cette fonction n'est pas dans le thread..mais il y a une autre fonction qui est en cours d'exécution byside (qui est indépendante de l'interface utilisateur) .J'ai également essayé MessageBox..il est toujours le même ... et pour votre information .. J'ai essayé de pomper le message .. il est toujours le même – kiddo

+0

s'il vous plaît vérifier mon edit – kiddo

Questions connexes