0

VisualStudioは初めてです。画像を読み込んで、開始と停止の2つのボタンを使用してUIに表示しようとしています。次回開始を押したときに合計フレームのカウントを完了するたびに、画像の読み込みが以前よりも速くなり、最後の画像では速度が非常に速いため、画像が消えたり黒く表示されたりします。スレッド速度または画像の読み込み時間は、各サイクルと同様に増加します。これを制限するにはどうすればよいですか..または2つの画像を表示する間に時間間隔を設定します。ありがとうございました。コードは次のとおりです。

    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フレームが必要な場合)。再生していない場合、タイマーハンドラーは何もしません。

ユーザーが再生を押すと、最初の画像が読み込まれ、「再生中」フラグが設定されます。タイマーハンドラー内で、現在ロードされている画像を取得して画面に表示し、次の画像をロードして戻ります。シーケンスに画像がなくなったら、「再生中」フラグをクリアします。

タイマーが起動すると常に現在の画像が表示されるため、次の画像の読み込みにかかる時間は関係ありません(再生よりも速くできる限り)。

于 2012-09-13T04:17:39.340 に答える