您的位置:首页 > 其它

利用WINDOWS的消息机制进行截断视频的循环显示

2014-05-02 20:55 316 查看
今天使用MFC界面进行摄像头的视频的显示,从摄像头抓取每一帧并循环在picture控件里显示,但是遇到一个问题就是因为是在while循环中显示,只要摄像头有视频传入,while循环就不会退出,后面的操作就没办法进行,可以利用WINDOWS的消息机制进行解决。

1,

void C_2DTo3DDlg::OnBnClickedStmeadis()
{
// TODO: 在此添加控件通知处理程序代码
//
HWND hwnd;
MSG msg;
Mat frame;
BOOL isdone=FALSE;
if(lfCam.isOpened())
{
while(!isdone)
{
lfCam>>frame;
F_ShowImage( frame, m_lfImage, IDC_LeftPicture );
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) //点击右键或有键盘按键时退出视频显示
{
switch(msg.message)
{
case WM_RBUTTONDOWN:
case WM_KEYDOWN:
//
// Perform any required cleanup.
//
isdone = TRUE;
}
}
}
}
return;
}

2,直接if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
::TranslateMessage(&message);
::DispatchMessage(&message);
也行,就不用switch了。
3,用了setTimer函数,http://blog.csdn.net/watkinsong/article/details/7360941

语法:

BOOLPeekMessage(LPMSGIpMsg,HWNDhWnd,UINTwMSGfilterMin,UINTwMsgFilterMax,UINTwRemoveMsg

);



参数

lpMsg

接收消息信息的MSG结构指针。

hWnd

其消息被检查的窗口句柄

wMsgFilterMin

指定被检查的消息范围里的第一个消息。

wMsgFilterMax

指定被检查的消息范围里的最后一个消息。

wRemoveMsg

确定消息如何被处理。此参数可取下列值之一[1]:


意义

PM_NOREMOVE
PeekMessage处理后,消息不从队列里除掉。
PM_REMOVE
PeekMessage处理后,消息从队列里除掉。
PM_NOYIELD
此标志使系统不释放等待调用程序空闲的线程。可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: