0

我对视觉工作室很陌生。我正在尝试加载图像并将其显示在具有两个按钮启动和停止的 UI 上。每次我完成我的总帧计数时,下一次按下开始时,我的图像加载速度比以前更快,最终图像的速度如此之快,以至于它们消失或显示为黑色。线程速度或图像加载时间随着每个周期的增加而增加。我怎样才能限制这个..或者在显示两个图像之间设置一个时间间隔。谢谢你。代码如下:

    void CmirrorImageDlg::OnBnClickedStart()
    {
        m_play = TRUE;
        CString num = NULL;
        num.Format(_T("Pause"));
        m_start.EnableWindow(false);
        m_stop.EnableWindow(true);
        m_stop.SetWindowTextW(num);
        m_pThread = AfxBeginThread(Operate, (LPVOID)this, THREAD_PRIORITY_NORMAL);

    }


    void CmirrorImageDlg::OnBnClickedStop()
    {
        m_play = FALSE;
        CString num = NULL;
        num.Format(_T("Resume"));
        m_start.EnableWindow(true);
        m_stop.EnableWindow(false);
        m_start.SetWindowTextW(num);
        m_count = 0;

        //m_pThread = AfxBeginThread(Operate, (LPVOID)this, THREAD_PRIORITY_ABOVE_NORMAL);
        // TODO: Add your control notification handler code here
    }


UINT CmirrorImageDlg::Operate(LPVOID param)
{
    CmirrorImageDlg* pDlg = (CmirrorImageDlg*) param;

    CString test;
    while ( pDlg->m_play && pDlg->m_count < TOTAL_FRAME_NUMBER)
    {
        test.Format(_T("images/%.4d.BMP"),pDlg->m_count);

        pDlg->hbitmap = (HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

        pDlg->inv_hbitmap = pDlg->GetInvertedBitmap(pDlg->hbitmap, TRUE); 
        pDlg->inv_hbitmap_1 = pDlg->GetInvertedBitmap(pDlg->hbitmap , FALSE);
        //CBitmap map = LoadBitmapW(test);
        //filePath = IDB_BITMAP1;
        //filePath++;



        //IDB_PICTURE2.LoadBitmapW(filePath);
        pDlg->m_picture.SetBitmap(pDlg->hbitmap);
        pDlg->m_picture_2.SetBitmap(pDlg->inv_hbitmap);
        pDlg->m_picture_3.SetBitmap(pDlg->inv_hbitmap_1);

        CString num = NULL;
        num.Format(_T("%d"),pDlg->m_count);
        pDlg->m_label.SetWindowTextW(num);
        // TODO: Add your control notification handler code here
        pDlg->m_count++;

    }
    if(pDlg->m_count >= TOTAL_FRAME_NUMBER)
    {
        CString num = NULL;
        num.Format(_T("%d"),0);

        pDlg->m_count = 0;
        pDlg->m_play= false;
        pDlg->m_label.SetWindowTextW(num);

        pDlg->m_picture.SetBitmap(NULL);
        pDlg->m_picture_2.SetBitmap(NULL);
        pDlg->m_picture_3.SetBitmap(NULL);

        CString num1 = NULL;
        num.Format(_T("Stop"));
        pDlg->m_start.EnableWindow(true);
        pDlg->m_stop.EnableWindow(false);
        pDlg->m_stop.SetWindowTextW(num);
        num.Format(_T("Start"));
        pDlg->m_start.SetWindowTextW(num);
        //pDlg->m_pThread->SuspendThread();

    }

    return 0;
}
4

1 回答 1

0

一个相当简单的选择:

为您的对话框设置一个 WM_TIMER 以每 40 毫秒触发一次(如果您想要每秒 25 帧)。如果不播放,计时器处理程序将不执行任何操作。

当用户点击播放时,您将加载第一张图片,然后设置“正在播放”标志。在计时器处理程序中,它将获取当前加载的图像并将其blit到屏幕上,然后加载下一个图像并返回。当序列中没有更多图像时,您清除“正在播放”标志。

因为您总是在计时器触发时显示当前图像,所以加载下一张图像需要多长时间并不重要(只要您可以比播放速度更快)。

于 2012-09-13T04:17:39.340 回答