MFC一个按钮实现开始和结束,该怎么解决

MFC一个按钮实现开始和结束
要做一个视频录制的功能
使用的是opencv+vs2010,基于对话框的MFC
想要用一个按钮实现录制的开始和结束
就是点击该按钮,开始录制,再点击就结束录制。期间按钮的名字也要变化

请问各位大大该怎么做呢?
------解决思路----------------------
在按钮的响应函数中添加下列代码试试 
CString str = (CButton*)GetDlgItem(BUTTON_ID)->GetWindowText();
if(str == "暂停")
        GetDlgItem(BUTTON_ID)->SetWindowText(_T("继续"));
else
        GetDlgItem(BUTTON_ID)->SetWindowText(_T("暂停"));
------解决思路----------------------
你需要的是多线程后台处理,防止界面冻结

要不就用个定时器,把while这段去掉,while内部的内容放定时器里面
保存时打开定时器,停止则关闭定时器
这样界面应该也不会卡死
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

我用了相似的思路
当按下开始录制后按钮可以变为save,但此时画面冻结,程序不响应
强制关掉后相应文件夹有录制的视频,但视频很慢并且播放器没有视频长度及进度条
    int state=0;
    CvVideoWriter* videoWriter;

    void CMytestDlg::OnBnClickedButtonTape()
    {
       if(state==0)
       {
          state=1;
          CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
          pWnd_video->SetWindowText(_T("Save"));
          //指定视频中每一帧的大小 
          CvSize size = cvSize(width,height);
          //需要初始化一个写视频文件的对象,这里注意使用的编解码器格式是MJPG  帧率设置为5
          videoWriter = 
            cvCreateVideoWriter("../videotap/test.avi",CV_FOURCC('M','J','P','G'),5,size);
       }
       else
       {
          state=0;
          CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
          pWnd_video->SetWindowText(_T("Videotape"));
       } 
        //每隔200ms,从摄像头中取出一帧 
        while(cvWaitKey(200))
        {   
            if(state==0)
             break;
          //得到从摄像头中获取的帧 
            IplImage* frame = cvQueryFrame(capture1); 
            //将帧写入视频文件中 
            cvWriteFrame(videoWriter,frame);   
        } 
    }


原因很明显,你把视频录制的功能和页面管理功能都放在一个线程里面了,所以出现页面冻结现象。常见问题而已,解决办法有很多,不用担心(一般情况下,MFC是将对话框管理线程作为主线程)。酱紫做就可以(主要思路):
step1:在XXXDlg.cpp文件中定义1个bool全局变量和子线程函数
UINT threadfun1(LPVOID lpParameter)
{
while (全局变量)
{
WaitForSingleObject(g_hEvent,INFINITE);
                //--------音频录制代码放在这里---------//
SetEvent(g_hEvent);
}

return 0;
}
step2:在你的按钮响应函数里面启动、关闭等线程管理功能
void XXXDlg::OnBnClickedButton1()
{
        全局变量 = !全局变量;//逻辑控制
        g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
SetEvent(g_hEvent);                           //设置对象为有信号状态
AfxBeginThread(threadfun1,this);
}
注:g_hEvent为全局Handle变量。
给分吧!

你好,我对多线程不怎么了解,按你的方法依葫芦画瓢了下。但得到的视频似乎只有第一帧,能帮忙分析下么
bool state=false;
HANDLE g_hEvent;
CvVideoWriter* videoWriter;

UINT threadfun1(LPVOID lpParameter)
{
while (state)
{
WaitForSingleObject(g_hEvent,INFINITE);
        //指定视频中每一帧的大小  
CvSize size = cvSize(width,height);
//需要初始化一个写视频文件的对象,这里注意使用的编解码器格式是MJPG  帧率设置为5
videoWriter =  
        cvCreateVideoWriter("../videotap/test.avi",CV_FOURCC('M','J','P','G'),5,size);
//得到从摄像头中获取的帧  
        IplImage* frame = cvQueryFrame(capture1);  
        //将帧写入视频文件中  
        cvWriteFrame(videoWriter,frame); 
SetEvent(g_hEvent);
}
return 0;
}
void CMytestDlg::OnBnClickedButtonTape()
{
state=!state;
if(state)
{
CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
pWnd_video->SetWindowText(_T("Save"));

}
else
{
CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
pWnd_video->SetWindowText(_T("Videotape"));
}
g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
SetEvent(g_hEvent);                           //设置对象为有信号状态
AfxBeginThread(threadfun1,this);   
}


设置断点检查一下:当state为真时候,看看你的程序是否一直停留在while()循环里面。如果是这样滴话,那就不是多线程的问题,而是你的音频录制代码的问题了。