halcon配置mfc报错函数找不到标识符
1个回答
展开全部
任务:将参数保存到配置文件和从配置文件读取参数项。
一开始,我想通过halcon中的open_file,等算子来文件的保存和读取,虽然没有报错,但是保存的文件不知在哪,估计没有保存成功。查资料过程中,了解到可以用配置文件实现这功能。
第一步,编辑资源中的菜单项,添加两个菜单,本例子中使用“设置”和“读取”两菜单项。
第二步,添加菜单事件响应。
第三步,修改设置菜单项响应函数如下:
void CHalconMFCDlg::OnSetParameter()
{
// TODO: Add your command handler code here
CString Filename,pathname;
CString strSection,strSectionKey,strValue;
CFileDialog dlg(FALSE, ".ini",NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("配置文件|*.ini|All files|*.*||"));//OFN_ALLOWMULTISELECT打开多文档选项。
if (dlg.DoModal()==IDOK) //如果返回为确定,获得选择的文件名
{
//获取完整文件名
pathname = dlg.GetPathName( ); //
char PathBuff[256];
//GetCurrentDirectory(256,PathBuff); // 获取当前路径。
//pathname.Format("%s\%s",PathBuff,Filename);
strSection = "显示区域";
strSectionKey = "左上角行坐标 ";
//strValue = "";
strValue.Format("%d",m_Row1);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "左上角列坐标 ";
//strValue = "";
strValue.Format("%d",m_Col1);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "右下角行坐标 ";
//strValue = "";
strValue.Format("%d",m_Row2);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "右下角列坐标 ";
//strValue = "";
strValue.Format("%d",m_Col2);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSection = "分割方法";
strSectionKey = "分割方法 ";
//strValue = "";
m_ComboSelectMethod.GetWindowTextA(PathBuff,256);
strValue.Format("%s",PathBuff);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
MessageBox("设置已保存");
}
}
第四步,修改读取菜单项响应函数如下:
void CHalconMFCDlg::OnGetParameter()
{
// TODO: Add your command handler code here
CString Filename,pathname;
CString strSection,strSectionKey,strValue;
char strBuff[256];
CFileDialog dlg(TRUE,".ini",NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("配置文件|*.ini||"));//OFN_ALLOWMULTISELECT打开多文档选项。
if (dlg.DoModal()==IDOK) //如果返回为确定,获得选择的文件名
{
//读取完整文件名,包括路径和后缀
Filename = dlg.GetPathName( );
//读取ini文件中的字符串
strSection = "分割方法";
strSectionKey = "分割方法 ";
GetPrivateProfileString( strSection, strSectionKey,NULL, strBuff,80, Filename);
strValue.Format("%s",strBuff);
//读取ini文件中的数字
strSection = "显示区域";
strSectionKey = "左上角行坐标 ";
m_Row1 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "左上角列坐标 ";
m_Col1 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "右下角行坐标 ";
m_Row2 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "右下角列坐标 ";
m_Col2 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
//更新相应数据
m_ComboSelectMethod.SetWindowTextA(strValue);
UpdateData(FALSE);
}
}
在前面的基础上,添加这些代码就可以实现配置文件的读写。这里简单的介绍配置文件读写涉及到的几个函数。
//一、向ini文件中写入信息的函数
//1. 把信息写入系统的win.ini文件
BOOL WriteProfileString(
LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串
LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节
LPCTSTR lpString // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键
)
//2. 把信息写入自己定义的.ini文件
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
LPCTSTR lpString, // 同上
LPCTSTR lpFileName // 要写入的文件的文件名。若该ini文件与程序在同一个目录下,
// 也可使用相对路径,否则需要给出绝度路径。
)
//若在win.ini中创建一个Test节,并在该节中创建一个键id,其值为xym,则可以这样写:
WriteProfileString("Test", "id", "xym");
//若在Ex1目录下的ex1.ini中创建一个Test节,并在该节中创建一个键id,其值为xym
WritePrivateProfileString("Test", "id", "xym", "d:\vc\Ex1\ex1.ini");
//若Ex1.ini文件与读写该文件的程序在同一个目录下,则上面语句也可写为:
WritePrivateProfileString("Test", "id", "xym", ".\ex1.ini");
需要注意的是,C系列的语言中,转义字符“\”表示反斜线“”。另外,当使用相对路径时,“\”前的“.”号不能丢掉了。
//二、从ini文件中读取数据的函数
//1、从系统的win.ini文件中读取信息
//(1) 读取字符串
DWORD GetProfileString(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名,读取该键的值
LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值
LPTSTR lpReturnedString,// 一个指向缓冲区的指针,接收读取的字符串
DWORD nSize // 指定lpReturnedString指向的缓冲区的大小
)
//如:
CString str;
GetProfileString("Test", "id", "Error", str.GetBuffer(20),20);
//(2) 读取整数
UINT GetProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault // 若指定的键名不存在,该值作为读取的默认值
)
//如使用以下语句写入了年龄信息:
WriteProfileString("Test", "age", "25");
// 在win.ini中创建一个Test节,并在该节中创建一个键age,其值为25。
//则可用以下语句读取age键的值:
int age;
age = GetProfileInt("Test", "age", 0);
//2、从自己的ini文件中读取信息
//(1) 读取字符串
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // 同1(1)
LPCTSTR lpKeyName, // 同1(1)
LPCTSTR lpDefault, // 同1(1)
LPTSTR lpReturnedString,// 同1(1)
DWORD nSize, // 同1(1)
LPCTSTR lpFileName // 读取信息的文件名。若该ini文件与程序在同一个目录下,
// 也可使用相对路径,否则需要给出绝度路径。
)
//如:
CString str;
GetPrivateProfileString( "Test", "id","Error", str.GetBuffer(20), 20,".\ex1.ini");
//或:
GetPrivateProfileString( "Test", "id","Error", str.GetBuffer(20), 20,"d:\vc\Ex1\ex1.ini");
//(2) 读取整数
UINT GetPrivateProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault, // 若指定的键名不存在,该值作为读取的默认值
LPCTSTR lpFileName // 同上
)
//如使用以下语句写入了年龄信息:
WritePrivateProfileString("Test","age","25",".\ex1.ini");
//在ex1.ini中创建一个Test节,并在该节中创建一个键age,其值为25。
//则可用以下语句读取age键的值:
int age;
age = GetPrivateProfileInt("Test","age",0,".\ex1.ini");
一开始,我想通过halcon中的open_file,等算子来文件的保存和读取,虽然没有报错,但是保存的文件不知在哪,估计没有保存成功。查资料过程中,了解到可以用配置文件实现这功能。
第一步,编辑资源中的菜单项,添加两个菜单,本例子中使用“设置”和“读取”两菜单项。
第二步,添加菜单事件响应。
第三步,修改设置菜单项响应函数如下:
void CHalconMFCDlg::OnSetParameter()
{
// TODO: Add your command handler code here
CString Filename,pathname;
CString strSection,strSectionKey,strValue;
CFileDialog dlg(FALSE, ".ini",NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("配置文件|*.ini|All files|*.*||"));//OFN_ALLOWMULTISELECT打开多文档选项。
if (dlg.DoModal()==IDOK) //如果返回为确定,获得选择的文件名
{
//获取完整文件名
pathname = dlg.GetPathName( ); //
char PathBuff[256];
//GetCurrentDirectory(256,PathBuff); // 获取当前路径。
//pathname.Format("%s\%s",PathBuff,Filename);
strSection = "显示区域";
strSectionKey = "左上角行坐标 ";
//strValue = "";
strValue.Format("%d",m_Row1);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "左上角列坐标 ";
//strValue = "";
strValue.Format("%d",m_Col1);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "右下角行坐标 ";
//strValue = "";
strValue.Format("%d",m_Row2);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSectionKey = "右下角列坐标 ";
//strValue = "";
strValue.Format("%d",m_Col2);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
strSection = "分割方法";
strSectionKey = "分割方法 ";
//strValue = "";
m_ComboSelectMethod.GetWindowTextA(PathBuff,256);
strValue.Format("%s",PathBuff);
WritePrivateProfileString(strSection,strSectionKey,strValue,pathname);
MessageBox("设置已保存");
}
}
第四步,修改读取菜单项响应函数如下:
void CHalconMFCDlg::OnGetParameter()
{
// TODO: Add your command handler code here
CString Filename,pathname;
CString strSection,strSectionKey,strValue;
char strBuff[256];
CFileDialog dlg(TRUE,".ini",NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("配置文件|*.ini||"));//OFN_ALLOWMULTISELECT打开多文档选项。
if (dlg.DoModal()==IDOK) //如果返回为确定,获得选择的文件名
{
//读取完整文件名,包括路径和后缀
Filename = dlg.GetPathName( );
//读取ini文件中的字符串
strSection = "分割方法";
strSectionKey = "分割方法 ";
GetPrivateProfileString( strSection, strSectionKey,NULL, strBuff,80, Filename);
strValue.Format("%s",strBuff);
//读取ini文件中的数字
strSection = "显示区域";
strSectionKey = "左上角行坐标 ";
m_Row1 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "左上角列坐标 ";
m_Col1 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "右下角行坐标 ";
m_Row2 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
strSectionKey = "右下角列坐标 ";
m_Col2 = GetPrivateProfileInt(strSection,strSectionKey,10,Filename);
//更新相应数据
m_ComboSelectMethod.SetWindowTextA(strValue);
UpdateData(FALSE);
}
}
在前面的基础上,添加这些代码就可以实现配置文件的读写。这里简单的介绍配置文件读写涉及到的几个函数。
//一、向ini文件中写入信息的函数
//1. 把信息写入系统的win.ini文件
BOOL WriteProfileString(
LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串
LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。若为NULL,则删除整个节
LPCTSTR lpString // 键的值,是一个以0结束的字符串。若为NULL,则删除对应的键
)
//2. 把信息写入自己定义的.ini文件
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
LPCTSTR lpString, // 同上
LPCTSTR lpFileName // 要写入的文件的文件名。若该ini文件与程序在同一个目录下,
// 也可使用相对路径,否则需要给出绝度路径。
)
//若在win.ini中创建一个Test节,并在该节中创建一个键id,其值为xym,则可以这样写:
WriteProfileString("Test", "id", "xym");
//若在Ex1目录下的ex1.ini中创建一个Test节,并在该节中创建一个键id,其值为xym
WritePrivateProfileString("Test", "id", "xym", "d:\vc\Ex1\ex1.ini");
//若Ex1.ini文件与读写该文件的程序在同一个目录下,则上面语句也可写为:
WritePrivateProfileString("Test", "id", "xym", ".\ex1.ini");
需要注意的是,C系列的语言中,转义字符“\”表示反斜线“”。另外,当使用相对路径时,“\”前的“.”号不能丢掉了。
//二、从ini文件中读取数据的函数
//1、从系统的win.ini文件中读取信息
//(1) 读取字符串
DWORD GetProfileString(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名,读取该键的值
LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值
LPTSTR lpReturnedString,// 一个指向缓冲区的指针,接收读取的字符串
DWORD nSize // 指定lpReturnedString指向的缓冲区的大小
)
//如:
CString str;
GetProfileString("Test", "id", "Error", str.GetBuffer(20),20);
//(2) 读取整数
UINT GetProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault // 若指定的键名不存在,该值作为读取的默认值
)
//如使用以下语句写入了年龄信息:
WriteProfileString("Test", "age", "25");
// 在win.ini中创建一个Test节,并在该节中创建一个键age,其值为25。
//则可用以下语句读取age键的值:
int age;
age = GetProfileInt("Test", "age", 0);
//2、从自己的ini文件中读取信息
//(1) 读取字符串
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // 同1(1)
LPCTSTR lpKeyName, // 同1(1)
LPCTSTR lpDefault, // 同1(1)
LPTSTR lpReturnedString,// 同1(1)
DWORD nSize, // 同1(1)
LPCTSTR lpFileName // 读取信息的文件名。若该ini文件与程序在同一个目录下,
// 也可使用相对路径,否则需要给出绝度路径。
)
//如:
CString str;
GetPrivateProfileString( "Test", "id","Error", str.GetBuffer(20), 20,".\ex1.ini");
//或:
GetPrivateProfileString( "Test", "id","Error", str.GetBuffer(20), 20,"d:\vc\Ex1\ex1.ini");
//(2) 读取整数
UINT GetPrivateProfileInt(
LPCTSTR lpAppName, // 同上
LPCTSTR lpKeyName, // 同上
INT nDefault, // 若指定的键名不存在,该值作为读取的默认值
LPCTSTR lpFileName // 同上
)
//如使用以下语句写入了年龄信息:
WritePrivateProfileString("Test","age","25",".\ex1.ini");
//在ex1.ini中创建一个Test节,并在该节中创建一个键age,其值为25。
//则可用以下语句读取age键的值:
int age;
age = GetPrivateProfileInt("Test","age",0,".\ex1.ini");
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询