延迟窗口在mfc上显示文本

时间:2017-01-12 12:24:29

标签: c++ multithreading mfc sleep

我正在做基于对话的MFC游戏。 在游戏过程中有一个战斗阶段,我想在屏幕上显示每个文本一小段延迟, 我尝试使用睡眠并尝试过CTime,但两者都只显示每场战斗的最后一个文字...... 这是代码的一个例子......

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

在所有3个函数的开头都有Sleep(700)。它会延迟,但只显示最后一个

Output.SetWindowTextW(SDialog);

我放了...我想它是一些线程,请帮助我。

感谢

1 个答案:

答案 0 :(得分:3)

有一种艰难的方式,一种简单的方法和一种可耻的方式。

困难的方法是进行多线程 - 检查AfxBeginThread,将指针传递给CDNDPprojectDlg,并在每次睡眠后完成工作。这很难,因为有一点你需要在访问公共资源时同步你的主线程和你的新线程......在那之前要学到很多东西,但在那之前很多痛苦

另一种方法是使用计时器SetTimer并覆盖OnTimer

第三种方法是在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;
}
祝你好运!