// MFCMvsSampleDlg.cpp : 实现文件 // #include "stdafx.h" #include "MFCMvsSample.h" #include "MFCMvsSampleDlg.h" #include "afxdialogex.h" #include "MFCTools.h" #include "./src/VsOutputs.h" #ifdef _DEBUG #define new DEBUG_NEW #endif using namespace VisionSystem; // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CMFCMvsSampleDlg 对话框 CMFCMvsSampleDlg::CMFCMvsSampleDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMFCMvsSampleDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFCMvsSampleDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); // DDX_Control(pDX, IDC_LIST_RESULT, m_listBoxResult); DDX_Control(pDX, IDC_LIST_RUN_RESULT, m_listCtrlResult); } BEGIN_MESSAGE_MAP(CMFCMvsSampleDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BTN_OPEN_PROJ, &CMFCMvsSampleDlg::OnBnClickedBtnOpenProj) ON_BN_CLICKED(IDC_BTN_CLOSE_PROJ, &CMFCMvsSampleDlg::OnBnClickedBtnCloseProj) ON_BN_CLICKED(IDC_BTN_RUN_ONCE, &CMFCMvsSampleDlg::OnBnClickedBtnRunOnce) ON_BN_CLICKED(IDC_BTN_RUN_PROJ, &CMFCMvsSampleDlg::OnBnClickedBtnRunProj) ON_BN_CLICKED(IDC_BTN_STOP_PROJ, &CMFCMvsSampleDlg::OnBnClickedBtnStopProj) END_MESSAGE_MAP() // CMFCMvsSampleDlg 消息处理程序 BOOL CMFCMvsSampleDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 //ShowWindow(SW_MINIMIZE); // TODO: 在此添加额外的初始化代码 // 设置列表框 DWORD dwStyle = m_listCtrlResult.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT; dwStyle |= LVS_EX_GRIDLINES; m_listCtrlResult.SetExtendedStyle(dwStyle); CRect listCtrlRect; m_listCtrlResult.GetWindowRect(&listCtrlRect); m_listCtrlResult.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 100); m_listCtrlResult.InsertColumn(1, _T("Type"), LVCFMT_LEFT, 100); m_listCtrlResult.InsertColumn(2, _T("Value"), LVCFMT_LEFT, listCtrlRect.right - listCtrlRect.left - 100); // 控制按钮状态 GetDlgItem(IDC_BTN_OPEN_PROJ)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_CLOSE_PROJ)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_RUN_ONCE)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_RUN_PROJ)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_STOP_PROJ)->EnableWindow(FALSE); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMFCMvsSampleDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMFCMvsSampleDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(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 { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CMFCMvsSampleDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CMFCMvsSampleDlg::OnBnClickedBtnOpenProj() { // 选择工程文件 CString cstrFileName = selectedFile(); if (cstrFileName.IsEmpty()) { return; } // 创建ProjectApp对象 m_vsProjectApp = CVsProjectAppFactory::instance()->createProjectApp(); _ASSERTE(NULL != m_vsProjectApp); // 使用异步模式打开,创建Sink对象 IVisionSysProjectSinkPtr projectSink = shared_from_this(); std::string projectFile = CStringToString(cstrFileName); int32_t ret = m_vsProjectApp->open( projectFile, projectSink); if (VS_OK != ret) { ::AfxMessageBox(_T("Open project file failed!")); return; } // 控制按钮状态 GetDlgItem(IDC_BTN_OPEN_PROJ)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_CLOSE_PROJ)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_RUN_ONCE)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_RUN_PROJ)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_STOP_PROJ)->EnableWindow(FALSE); } void CMFCMvsSampleDlg::OnBnClickedBtnCloseProj() { if (NULL == m_vsProjectApp) { ::AfxMessageBox(_T("Project not opened!")); } m_vsProjectApp->close(); m_vsProjectApp = IVisionSysProjectAppPtr(); // 控制按钮状态 GetDlgItem(IDC_BTN_OPEN_PROJ)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_CLOSE_PROJ)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_RUN_ONCE)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_RUN_PROJ)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_STOP_PROJ)->EnableWindow(FALSE); // 清空界面数据 static CImageHelper sImageHelper; sImageHelper.setDisplayBackGround(GetDlgItem(IDC_STATIC_DISPLAY)->GetSafeHwnd()); m_listCtrlResult.DeleteAllItems(); } void CMFCMvsSampleDlg::OnBnClickedBtnRunOnce() { if (NULL == m_vsProjectApp) { ::AfxMessageBox(_T("Project not opened!")); } m_vsProjectApp->runOnce(); // 控制按钮状态 GetDlgItem(IDC_BTN_OPEN_PROJ)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_CLOSE_PROJ)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_RUN_ONCE)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_RUN_PROJ)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_STOP_PROJ)->EnableWindow(FALSE); } void CMFCMvsSampleDlg::OnBnClickedBtnRunProj() { if (NULL == m_vsProjectApp) { ::AfxMessageBox(_T("Project not opened!")); } m_vsProjectApp->run(); // 控制按钮状态 GetDlgItem(IDC_BTN_OPEN_PROJ)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_CLOSE_PROJ)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_RUN_ONCE)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_RUN_PROJ)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_STOP_PROJ)->EnableWindow(TRUE); } void CMFCMvsSampleDlg::OnBnClickedBtnStopProj() { if (NULL == m_vsProjectApp) { ::AfxMessageBox(_T("Project not opened!")); } m_vsProjectApp->stopRun(); // 控制按钮状态 GetDlgItem(IDC_BTN_OPEN_PROJ)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_CLOSE_PROJ)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_RUN_ONCE)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_RUN_PROJ)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_STOP_PROJ)->EnableWindow(FALSE); } CString CMFCMvsSampleDlg::selectedFile() { CFileDialog dlgOpenFile( TRUE, // TRUE: 打开文件, FALSE: 保存文件 _T("job"), // 保存文件时缺省文件后缀 NULL, // 编辑框文件名 OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, // 不显示隐藏文件和只能输入存在文件 _T("VisionProject file(*.job)|*.job||"),// 文件过滤 this); // 父窗口指针 if (dlgOpenFile.DoModal() == IDOK) { return dlgOpenFile.GetPathName(); } return _T(""); } void CMFCMvsSampleDlg::onRunResult(const VisionSystem::CVsOutputsPtr& outputs) { static CImageHelper sImageHelper; int32_t ret = 0; VisionSystem::VsParameterMapType* resultParams = outputs->rawOutputs(); m_listCtrlResult.DeleteAllItems(); uint32_t rowCtrl = 0; VsOutAreaArray outAreas; VsImagePtr image; VisionSystem::VsParameterMapType::iterator iterOutput = resultParams->begin(); for (; iterOutput != resultParams->end(); ++iterOutput) { CString cstrName = StringToCString(iterOutput->first); m_listCtrlResult.InsertItem(rowCtrl, cstrName); CString cstrType = StringToCString(iterOutput->second->type()); m_listCtrlResult.SetItemText(rowCtrl, 1, cstrType); CString cstrVal = StringToCString(iterOutput->second->parameterToString()); m_listCtrlResult.SetItemText(rowCtrl++, 2, cstrVal); // 如果是图像则显示,多幅图像仅显示第一幅图像 if (iterOutput->second->type() == CStringToString(CString("Image"))) { if (NULL != image) { continue; } ret = iterOutput->second->getAsImage(image); } // 获取结果区域 if (iterOutput->second->type() == CStringToString(CString("OutAreaArray"))) { iterOutput->second->getAsOutAreaArray(outAreas); } } // 显示图像 if (NULL != image) { sImageHelper.showGrayImage( GetDlgItem(IDC_STATIC_DISPLAY)->GetSafeHwnd(), image->data, image->width, image->height, outAreas); } if (VS_OK != ret) { MessageBox(_T("Get image failed.")); } }