C++ MFC

目录

MFC——窗口静态显示

MFC——定时器:窗口动态显示

MFC——【X】退出菜单缓存清除

MFC——警告弹窗MessageBox

MFC——相机单帧采集

MFC——多线程

 


MFC——窗口静态显示

利用Opencv库进行窗口显示

需要材料:CvvImage.h和CvvImage.cpp

步骤:第一步:头文件、第二步:声明、第三步:使用

/*
功能;画入指定IDC
第一步:头文件:在当前的类的的头文件代码区头包含:#include "CvvImage.h"
第二步:将函数在当前所在的类的头文件声明:void CMFC_CalibrationDlg::drawToDC(IplImage* image, UINT ID)
第三步:使用 
IplImage img = src;	
drawToDC(&img, 自己指定IDC窗口);	//显示	
*/
void C自己MFC的Dlg::drawToDC(IplImage* image, UINT ID)//画到指定ID(默认IDC_STATIC)在头文件声明函数
{
	CDC* pDC = GetDlgItem(ID)->GetDC();
	HDC pHdc = pDC->GetSafeHdc();

	CRect rect;
	GetDlgItem(ID)->GetClientRect(&rect);

	CvvImage cimg;
	cimg.CopyOf(image);
	cimg.DrawToHDC(pHdc, rect);

	ReleaseDC(pDC);
}


MFC——定时器:窗口动态显示

/*
// 窗口定时事件
窗口类向导——》消息——》WMTimer——》OnTimer双击——》编辑代码
使用:
SetTimer(1, 10, NULL);//开启定时器1
KillTimer(1);    //关闭定时器防止缓存滞留
*/
void CdahengDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	switch (nIDEvent)
	{
	case 1://Timer(1)
	{			//objImageDataPtr获取相机缓存
			   my_camera.objImageDataPtr = my_camera.ObjStreamPtr->GetImage(100);//超时时间使用500ms,用户可以自行设定
			   if (my_camera.objImageDataPtr->GetStatus() == GX_FRAME_STATUS_SUCCESS)
			   {
				   my_camera.ImageFlag = true;		//图片采集成功

				   //假设原始数据是BayerRG8图像,则 GX_BIT_0_7
				   void* pRGB24Buffer = NULL;
				   pRGB24Buffer = my_camera.objImageDataPtr->ConvertToRGB24(GX_BIT_0_7, GX_RAW2RGB_NEIGHBOUR, true);

				   Mat test;
				   test.create(my_camera.objImageDataPtr->GetHeight(), my_camera.objImageDataPtr->GetWidth(), CV_8UC3);
				   memcpy(test.data, pRGB24Buffer, my_camera.objImageDataPtr->GetPayloadSize() * 3);
				   if (test.data){
					   IplImage image;
					   image = test;
					   drawToDC(&image, IDC_STATIC_SHOW);
				   }
			   }
			  else
			  {
				  KillTimer(1);    //关闭定时器防止缓存滞留
				  if (MessageBox(_T("请连接相机"), _T("相机事件"), MB_YESNO | MB_ICONWARNING) == IDNO)
				  {
					  //关闭定时刷新					 
					  break;
				  }
			  }
			  break;
	}
	case 2://Timer(2)
	{
			  // 用户程序
			  break;
	}

	}

	CDialogEx::OnTimer(nIDEvent);
}

MFC——【X】退出菜单缓存清除

/*
//窗口关闭【X】的事件
窗口类向导——》消息——》WMClose双击——》OnClose程序块——》添加代码
使用:
直接在此程序块进行操作
*/
void CdahengDlg::OnClose()
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	// 关闭相机
	if (my_camera.DeviceFlag == true)
	{
		my_camera.DeviceFlag = false;
		my_camera.ImageFlag = false;
		my_camera.OpenFlag = true;//初始化重启
		KillTimer(1);    //关闭定时器防止缓存滞留
		//发送停采命令
		my_camera.ObjFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();
		my_camera.ObjStreamPtr->StopGrab();

		//释放资源
		my_camera.ObjStreamPtr->Close();
		my_camera.ObjDevicePtr->Close();
		//反初始化库
		MessageBox(_T("相机【确定】关闭"), _T("相机事件..."));
		IGXFactory::GetInstance().Uninit();
	}	
	
	CDialogEx::OnClose();
}

MFC——警告弹窗MessageBox

// 更多功能查找其他说明书
MessageBox(_T("相机【确定】关闭"), _T("相机事件..."));

MFC——相机单帧采集

/*利用按钮进行标志位,然后定时器里面进行赋值命令*/

// 图像处理
void CdahengDlg::OnBnClickedButtonPro()
{
	// TODO:  在此添加控件通知处理程序代码
	if (my_camera.OpenFlag == true)
	{
		MessageBox(_T("请打开相机"));
		return;
	}
	if (my_camera.ImageFlag == true)
	{
		my_camera.ImageClo = true;//相片结束标志
	}	
}


// 采集命令
if (my_camera.ImageClo == true)//相片处理按钮标志
{
	test.copyTo(my_camera.src);
	if (my_camera.src.data)
	{
		IplImage image;
		image = my_camera.src;
		drawToDC(&image, IDC_STATIC_SHOWPRO);
		my_camera.ImageClo = false;//相片结束标志
	}
}

项目链接

MFC——多线程

猜你喜欢

转载自blog.csdn.net/weixin_41275726/article/details/84995723