2017-01-12 13 views
0

私はダイアログベースのMFCゲームをやっています。 ゲーム中にバトルフェイズがあり、少し遅れて画面に各テキストを表示したいのですが、 睡眠を試みてCTimeを試みましたが、どちらの戦闘でも最後のテキストだけが表示されます... ここコード例...遅延ウィンドウがテキストを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; 
    } 
} 

スリープ(700)があります。遅れても最後のものだけを表示します

Output.SetWindowTextW(SDialog); 

私はスレッドの何かを推測します。私を助けてください。

ありがとう

答えて

3

難しい方法、簡単な方法と恥ずかしい方法があります。

難しい方法は、マルチスレッドを行うことです - AfxBeginThreadをチェックし、あなたのCDNDPprojectDlgへのポインタを渡し、あなたの睡眠のたびにそこで仕事をしてください。ある時点では、共通のリソースにアクセスするときにメインスレッドと新しいスレッドを同期させる必要があるため、難しいです。そこで学ぶことはたくさんありますが、その前に多くの痛みがあります。

もう1つの方法は、タイマーSetTimerとOverTimerをオーバーライド

第3の方法は、Visual BasicでDoEventsのようなものを使用することです。何かをして画面が更新されたら、それを呼び出すだけです。私はあなたにそのコードを渡したことの知識を否定します。

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; 
} 

幸運を祈る!

+0

素晴らしい!あなたは私のヒーローです!ありがとう! – secret

+0

恥ずべきではありません。このパターンはしばしばPeekAndPumpと呼ばれます。すなわち、メッセージがメッセージキュー内で待機しているかどうかを確認し、そうであればそれらをディスパッチ(ポンプ)する。 – acraig5075

+1

ハハ - はい - それはVisual Basicへの参照のために恥ずかしいです - 私たちはすべてC++ snobsです、そうではありませんか? :)これは、(ダイアログの破壊のような)メッセージの覗き見やポンピングで多くのことが起こることがあるので、リフレッシュを処理する方法の中で最もクリーンではない...しかし、それは難しいです。 – BadJerry

関連する問題