求助:本地函数定义是非法的,这个怎么改
[code=C/C++][/code]// cameratestDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "cameratest.h"
#include "cameratestDlg.h"
#include ".\cameratestdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CcameratestDlg 对话框
CcameratestDlg::CcameratestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CcameratestDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CcameratestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CcameratestDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CcameratestDlg 消息处理程序
BOOL CcameratestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将\“关于...\”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CcameratestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CcameratestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CcameratestDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
//库函数的初始化和销毁实现
int CcameratestDlg::BuildSystem(void)
{
if(0!=m_nDeviceState)
{
return 1;
}
try
{
CreateDevice("IMAGE_CAP_DS",m_pDevImageCapture);//创建图像采集设备
ASSERT(m_pDevImageCapture); //确认设备存在
if(m_pDevImageCapture) //如果设备存在
{
AddMsgReceiver(m_pDevImageCapture); //添加设备到消息接收队列
m_pDevImageCapture->Init(); //图像采集设备初始化
m_pDevImageCapture->QueryInterface(InterfaceID_IMAGECAPTURE,
(LPVOID*)&m_pImageCapture); //查询图像采集接口
}
m_nDeviceState=1;//0 Raw,1 inited,2 running
m_pDevList[0]=new char[256]; //分配存放图像采集设备名称空间
m_pDevList[1]=new char[256];
m_pDevList[2]=new char[256];
int nSource=m_pImageCapture->GetDeviceName(m_pDevList); //获得设备接口
if(nSource==0)
{
AfxMessageBox("no camera found.\nclick to quit.");
return 1;
}
m_cbxCamera.ResetContent(); //设备名称组合框清空
for(int i=0;i<nSource;i++) //添加名称到组合框
{
m_cbxCamera.AddString(m_pDevList[i]);
}
m_cbxCamera.SetCurSel(0); //设置第一个设备选中
m_cbxResolution.ResetContent(); //分辨率组合框清空
m_cbxResolution.AddString("160*120"); //添加分辨率到组合框
m_cbxResolution.AddString("320*240");
m_cbxResolution.AddString("640*480");
m_cbxResolution.SetCurSel(0); //设置第一个设备选中
m_cbxFrameRate.ResetContent(); //分辨率组合框清空
m_cbxFrameRate.AddString("10"); //添加帧率到组合框
m_cbxFrameRate.AddString("20");
m_cbxFrameRate.AddString("30");
m_cbxFrameRate.SetCurSel(0); //设置第一个设备选中
UpdateData(FALSE); //更新数据
}
catch(.../*IngeniousException&e*/) //捕获一切异常处理
{
Cleanup();
MessageBox("设备初始化失败!","ERROR",MB_OK);//报错信息
return 0;
}
//库函数销毁函数
int CcameratestDlg::DestroySystem(void)
{
if(m_pImageCapture) //m_pImageCapture还存在
{
m_pImageCapture->End(); //停止采集设备
m_pImageCapture->Release(); //释放空间
m_pImageCapture=NULL; //置空
}
m_nDeviceState=0; //设备状态复原
return 0;
}
//清除垃圾空间
void CcameratestDlg::Cleanup(void)
{
if(m_pImageCapture) //m_pImageCapture还存在
{
m_pImageCapture->Release(); //释放空间
m_pImageCapture=NULL; //置空
}
m_nDeviceState=0; //设备状态复原
}
//WM_DESTROY消息相应函数
void CcameratestDlg::OnDestroy()
{
CDialog::OnDestroy();
DestroySystem();
}
//添加具体功能的实现;
//获得设备参数设置
int CcameratestDlg::GetDeviceSetting(void)
{
UpdateData(); //更新数据
m_cbxCamera.GetWindowText(m_strCamera);//得到图像采集设备名称
if(m_strCamera=="")
{
MessageBox("请选择一种摄像头");
return 1;
}
unsigned short nCurSel=m_cbxResolution.GetCurSel();//选取分辨率
switch(nCurSel)
{
default:
{
MessageBox("请选择分辨率");
return 1;
}
break;
case 0:
{
m_nWidthPixel=160;
m_nHeightPixel=120;
}
break;
case 1:
{
m_nWidthPixel=320;
m_nHeightPixel=240;
}
break;
case 2:
{
m_nWidthPixel=640;
m_nHeighPixel=480;
}
break;
}
n_CurSel=m_cbxFrameRate.GetCurSel();
switch(nCurSel) //选取帧率
{
default:
{
MessageBox("请选择帧率");
return 1;
}
break;
case 0:
{
m_nFrameRate=10;
}
break;
case 1:
{
m_nFrameRate=20;
}
break;
case 2:
{
m_nFrameRate=30;
}
break;
}
UpdateData(FALSE);
return 0;
}
//启动设备函数
int CcameratestDlg::Start(void)
{
if(0==m_nDeviceState)
{
BuildSystem();
}
return 0;
}
void CcameratestDlg::OnBnClickedBtnStart()//点击“开始”按钮事件处理函数
{
if(0==m_nDeviceState) //未初始化
{
Start(); //启动
}
if (!GetDeviceSetting()) //获得设备参数
{
m_pImageCapture->BindDevName((char*)(LPCSTR)m_strCamera);//绑定设备名称
m_pImageCapture->SetVideoSettings(m_nWidthPixel,m_nHeightPixel,m_nFrameRate);//设置设备参数值
CWnd* pWnd=GetDlgItem(IDC_IMAGE); //获得图片控件指针
m_pImageCapture->BinCapWnd(pWnd->GetSafeHwnd());//绑定到图片控件上
m_pImageCapture->Init(); //初始化
m_pImageCapture->Start(); //运行起来
m_nDeviceState=2; //状态赋给2
}
}
//退出函数
void CcameratestDlg::OnBnClickedBtnExit()
{
OnCancel();
}
最后编译
c:\MTSoft\Program\Demo\cameratest\cameratestDlg.cpp(234): error C2601: “CcameratestDlg::OnDestroy” : 本地函数定义是非法的
c:\MTSoft\Program\Demo\cameratest\cameratestDlg.cpp(340): error C2601: “CcameratestDlg::OnBnClickedBtnExit” : 本地函数定义是非法的
c:\MTSoft\Program\Demo\cameratest\cameratestDlg.cpp(321): error C2601: “CcameratestDlg::OnBnClickedBtnStart” : 本地函数定义是非法的
c:\MTSoft\Program\Demo\cameratest\cameratestDlg.cpp(244): error C2601: “CcameratestDlg::GetDeviceSetting” : 本地函数定义是非法的
c:\MTSoft\Program\Demo\cameratest\cameratestDlg.cpp(210): error C2601: “CcameratestDlg::DestroySystem” : 本地函数定义是非法的
c:\MTSoft\Program\Demo\cameratest\cameratestDlg.cpp(223): error C2601: “CcameratestDlg::Cleanup” : 本地函数定义是非法的
c:\MTSoft\Program\Demo\cameratest\cameratestDlg.cpp(312): error C2601: “CcameratestDlg::Start” : 本地函数定义是非法的
[解决办法]
语法错误,自己好好查查
int CcameratestDlg::BuildSystem(void)
{
if(0!=m_nDeviceState)
{
return 1;
}
try
{
CreateDevice("IMAGE_CAP_DS",m_pDevImageCapture);//创建图像采集设备
ASSERT(m_pDevImageCapture); //确认设备存在
if(m_pDevImageCapture) //如果设备存在
{
AddMsgReceiver(m_pDevImageCapture); //添加设备到消息接收队列
m_pDevImageCapture->Init(); //图像采集设备初始化
m_pDevImageCapture->QueryInterface(InterfaceID_IMAGECAPTURE,
(LPVOID*)&m_pImageCapture); //查询图像采集接口
}
m_nDeviceState=1;//0 Raw,1 inited,2 running
m_pDevList[0]=new char[256]; //分配存放图像采集设备名称空间
m_pDevList[1]=new char[256];
m_pDevList[2]=new char[256];
int nSource=m_pImageCapture->GetDeviceName(m_pDevList); //获得设备接口
if(nSource==0)
{
AfxMessageBox("no camera found.\nclick to quit.");
return 1;
}
m_cbxCamera.ResetContent(); //设备名称组合框清空
for(int i=0;i<nSource;i++) //添加名称到组合框
{
m_cbxCamera.AddString(m_pDevList[i]);
}
m_cbxCamera.SetCurSel(0); //设置第一个设备选中
m_cbxResolution.ResetContent(); //分辨率组合框清空
m_cbxResolution.AddString("160*120"); //添加分辨率到组合框
m_cbxResolution.AddString("320*240");
m_cbxResolution.AddString("640*480");
m_cbxResolution.SetCurSel(0); //设置第一个设备选中
m_cbxFrameRate.ResetContent(); //分辨率组合框清空
m_cbxFrameRate.AddString("10"); //添加帧率到组合框
m_cbxFrameRate.AddString("20");
m_cbxFrameRate.AddString("30");
m_cbxFrameRate.SetCurSel(0); //设置第一个设备选中
UpdateData(FALSE); //更新数据
}
catch(.../*IngeniousException&e*/) //捕获一切异常处理
{
Cleanup();
MessageBox("设备初始化失败!","ERROR",MB_OK);//报错信息
return 0;
}
//比如这里,上一个函数的结束符呢????
//库函数销毁函数
int CcameratestDlg::DestroySystem(void)
{
[解决办法]
从第一个出错的往前找,先查{}的匹配情况。