2017-01-12 1 views
0

Je fais le jeu MFC basé par boîte de dialogue. Pendant le jeu il y a une phase de bataille, et je veux afficher chaque texte sur l'écran avec un petit retard, J'ai essayé d'utiliser le sommeil et j'ai essayé CTime, mais les deux affichent seulement le dernier texte à chaque bataille ... ici est un exemple du code ...Retarder le texte d'affichage de fenêtres sur le mfc

void CDNDPprojectDlg::OnBnClickedAction() 
{ 
    CString Damaged; 
    damage=me->Attack(enemy,WeID); 
    SDialog.Format(_T("You done %d damage, using %s,\r\n %s has %d HP left"), damage,Damaged,monName,enemy->getHP()); 
    Output.SetWindowTextW(SDialog); 

    if(enemy->getHP() <1) 
    { 
     Won(); 
     return; 
    } 
    NextAttack(); 
    if(me->getHP() <1) 
    { 
     Died(); 
     return; 
    } 
} 

Au début des 3 fonctions il y a Sleep (700). il fait un retard, mais seul le dernier affichage

Output.SetWindowTextW(SDialog); 

que je mets ... Je suppose que quelque chose de filetage, s'il vous plaît me aider.

grâce

Répondre

3

Il y a une façon difficile, un moyen facile et d'une manière honteuse. La manière la plus difficile est de faire du multi threading - vérifiez AfxBeginThread, vous passez un pointeur sur votre CDNDPprojectDlg, et faites le travail là après votre sommeil. C'est difficile parce qu'à un moment donné vous devrez synchroniser votre thread principal et votre nouveau thread quand ils accèderont à une ressource commune ... beaucoup à apprendre là-bas mais avant ça beaucoup de douleur

L'autre façon est soit d'utiliser un timer SetTimer et override OnTimer

La troisième façon consiste à utiliser quelque chose comme DoEvents dans Visual Basic (ah la honte!). Appelez-le simplement après avoir fait quelque chose et votre écran se rafraîchira. Je refuserai toute connaissance de vous avoir transmis ce code.

BOOL DoEvents() 
{ 
    MSG msg; 
    while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    { 
     if (msg.message == WM_QUIT) 
     { 
      return FALSE; 
     } 
     if (!AfxGetApp()->PreTranslateMessage(&msg)) 
     { 
      ::TranslateMessage(&msg); 
      ::DispatchMessage(&msg); 
     } 
    } 
    return TRUE; 
} 

Bonne chance!

+0

Incroyable !!! tu es mon héros! Merci! – secret

+0

Pas honteux. Ce modèle est souvent appelé PeekAndPump. c'est-à-dire vérifier si des messages sont en attente dans la file d'attente des messages (coup d'oeil) et si oui, les envoyer (les pomper). – acraig5075

+1

Ha ha - oui - c'est honteux à cause de sa référence à Visual Basic bien sûr - nous sommes tous des snobs C++, n'est-ce pas? :) Cela dit que beaucoup de choses peuvent arriver dans le furetage et le pompage des messages (comme la destruction de la boîte de dialogue), donc ce n'est pas la façon la plus simple de gérer un rafraîchissement ... mais c'est si facile. – BadJerry