项目MFC总结(二)——读取CSV文件将数据转化为图像显示在图片控件

功能

点击【打开文件】按钮,选择文件打开,将数据处理为图像(默认处理第10帧开始),然后将图像显示在图片控件。

注:整个项目有关图像处理的操作基本用OpenCV实现。

 

读取文件实现

1、添加按钮控件

在窗口界面,将控件拖进即可,控件在【view】->【TOOL Box】中。

2、鼠标右击更改点击【属性】更改属性

可更改:

名称(Caption)

ID(最好按功能名更改):如打开文件可命名为IDC_BUTTON_OPENFILE。

其他按自己的需求

3、添加点击响应事件

选中控件右击——>选择【添加事件处理程序】——》选择【BN_CLICKED】。如下:

项目MFC总结(二)——读取CSV文件将数据转化为图像显示在图片控件_第1张图片

 

 4、会自动跳转至处理程序,然后根据实际需求编写程序

项目MFC总结(二)——读取CSV文件将数据转化为图像显示在图片控件_第2张图片

 

这里是有用的关键代码,在此记录一下

  • 读取文件对话框代码:
	///TRUE为OPEN对话框,FALSE为SAVE AS对话框 
	CFileDialog dlg(TRUE);
	CString OpenFilePath;
	if (dlg.DoModal() == IDOK)
		OpenFilePath = dlg.GetPathName(); //获取文件路径
	OnPaint();
  • CString转string(c++的接口用的string)
//CString转string
	USES_CONVERSION;
	string file_path(W2A(OpenFilePath));
  • 在图片控件显示图像(OpenCV)

首先,在BOOL XXXXXXDlg::OnInitDialog()函数中加入以下窗口初始化代码:

//注:224*4, 126*4是窗口尺寸,可以更改
CRect rect;
	GetDlgItem(IDC_STATIC_IMG)->GetWindowRect(&rect);           //IDC_WAVE_DRAW为对应Picture Control的ID  
	ScreenToClient(&rect);
	GetDlgItem(IDC_STATIC_IMG)->MoveWindow(rect.left, rect.top, 224*4, 126*4, true);    //固定Picture Control控件的大小

	namedWindow("view",CV_WINDOW_AUTOSIZE);
	HWND hWnd = (HWND)cvGetWindowHandle("view");  //创建显示窗口
	HWND hParent = ::GetParent(hWnd);  //父窗口
	::SetParent(hWnd, GetDlgItem(IDC_STATIC_IMG)->m_hWnd); 
	::ShowWindow(hParent, SW_HIDE);

然后,在按钮单击事件函数中添加代码:

//获取图像并显示
	img = get_img(csvData_Slip, 1920, 1080, current_frame-1, Color);//这一句是我项目中的获取图像函数,要做更改
	CRect rect;
	GetDlgItem(IDC_STATIC_IMG)->GetClientRect(&rect); //获取图片控件窗口
	Rect dst(rect.left, rect.top, rect.right, rect.bottom); //窗口位置
	resize(img, current_img, cv::Size(rect.Width(), rect.Height())); //适应控件窗口大小
	imshow("view", current_img); //显示
  • 参数更新

一定要在代码段前后加上这两句,不然尤其编辑框的参数没办法更新显示!

	//数据更新
	UpdateData(TRUE);
    /
    代码段
      /
	UpdateData(FALSE);
  • 弹出消息提示对话框
// 显示消息对话框  ,参数按需求更改
nRes = MessageBox(_T("数据读取完成!"), _T("数据读取"), MB_OKCANCEL |     MB_ICONASTERISK);
// 判断消息对话框返回值。如果为IDCANCEL就return,否则继续向下执行   
if (IDCANCEL == nRes)
	return;

MessageBox的参数可以参考:http://www.jizhuomi.com/software/171.html

 

  • 关于MFC中定义全局变量和类成员变量的问题

1、当我们需要在单个整个文件用到某个变量时,需要将它定义为全局变量,只需要在对话框Cpp文件的开头申明即可。

项目MFC总结(二)——读取CSV文件将数据转化为图像显示在图片控件_第3张图片

2、当我们有好几个文件或者几个类之间需要相互调用的话,就需要把变量定义为类的公共成员变量,在对话框头文件添加即可。

项目MFC总结(二)——读取CSV文件将数据转化为图像显示在图片控件_第4张图片

 

3、在文件1调用文件2中的全局变量,还有一种方式就是在文件1中将变量声明为 extern,这样就可以自动在其他文件查找这个变量。

项目MFC总结(二)——读取CSV文件将数据转化为图像显示在图片控件_第5张图片

 

END! 

你可能感兴趣的:(【MFC】)