今天使用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.youkuaiyun.com/watkinsong/article/details/7360941
语法:
BOOLPeekMessage(
LPMSGIpMsg,
HWNDhWnd,
UINTwMSGfilterMin,
UINTwMsgFilterMax,
UINTwRemoveMsg
参数
lpMsg
接收消息信息的MSG结构指针。
hWnd
其消息被检查的
窗口句柄。
wMsgFilterMin
指定被检查的消息范围里的第一个消息。
wMsgFilterMax
指定被检查的消息范围里的最后一个消息。
wRemoveMsg
值
|
意义
|
---|---|
PM_NOREMOVE
|
PeekMessage处理后,消息不从队列里除掉。
|
PM_REMOVE
|
PeekMessage处理后,消息从队列里除掉。
|
PM_NOYIELD
|
此标志使系统不释放等待调用程序空闲的线程。可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。
|