// IrisFODIS_CalibrationToolDlg.cpp: 实现文件 // #include "pch.h" #include "framework.h" #include "IrisFODIS_CalibrationTool.h" #include "IrisFODIS_CalibrationToolDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_ABOUTBOX }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CIrisFODISCalibrationToolDlg 对话框 CIrisFODISCalibrationToolDlg::CIrisFODISCalibrationToolDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_IRISFODIS_CALIBRATIONTOOL_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_vecFodisFile.clear(); } void CIrisFODISCalibrationToolDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_FODISDATA, m_ceFODISFilePath); DDX_Control(pDX, IDC_LIST_DATAPATH, m_lbFilePath); DDX_Control(pDX, IDC_EDIT_OUTPUTDATA, m_ceOutputPath); DDX_Control(pDX, IDC_EDIT_CALDATA, m_ceCalFilePath); } void CIrisFODISCalibrationToolDlg::ShowFileDialog(long lResID, LPCTSTR lpszDefExt, LPCTSTR lpszFilter, int iType) { CFileDialog *cfdSave; CString csFileExt; cfdSave = new CFileDialog(true, lpszDefExt, NULL, OFN_FILEMUSTEXIST, lpszFilter, GetParent()); if (IDOK == cfdSave->DoModal()) { csFileExt = cfdSave->GetFileExt(); CString cstrSavePath = cfdSave->GetPathName(); if (iType == 0) { ((CEdit *)GetDlgItem(lResID))->SetWindowText(cstrSavePath); } else if (iType == 1) { ((CListBox *)GetDlgItem(lResID))->AddString(cstrSavePath); } } delete cfdSave; } void CIrisFODISCalibrationToolDlg::ShowFolderDialog(long lResID, LPCTSTR lpszDefExt) { BROWSEINFO bi; char name[MAX_PATH]; ZeroMemory(&bi, sizeof(BROWSEINFO)); bi.hwndOwner = AfxGetMainWnd()->GetSafeHwnd(); bi.pszDisplayName = (LPWSTR)name; bi.lpszTitle = lpszDefExt; bi.ulFlags = BIF_RETURNFSANCESTORS; LPITEMIDLIST idl = SHBrowseForFolder(&bi); CString strDirectoryPath; SHGetPathFromIDList(idl, strDirectoryPath.GetBuffer(MAX_PATH)); strDirectoryPath.ReleaseBuffer(); if (strDirectoryPath.IsEmpty()) { return; } int iPos = strDirectoryPath.GetLength(); if (iPos == 3) { ((CEdit *)GetDlgItem(lResID))->SetWindowTextW(strDirectoryPath); } else { ((CEdit *)GetDlgItem(lResID))->SetWindowTextW(strDirectoryPath + _T("\\")); } UpdateData(false); } void CIrisFODISCalibrationToolDlg::ResetListBoxHScrollBar(long lResID) { CDC * dc = GetDC(); SIZE s; int index; CString str; long temp; for (index = 0; index < m_lbFilePath.GetCount(); index++) { m_lbFilePath.GetText(index, str); s = dc->GetTextExtent(str, str.GetLength() + 1); // 获取字符串的像素大小 temp = (long)SendDlgItemMessage(lResID, LB_GETHORIZONTALEXTENT, 0, 0); //temp得到滚动条的宽度 if (s.cx > temp) { SendDlgItemMessage(lResID, LB_SETHORIZONTALEXTENT, (WPARAM)s.cx, 0); } } ReleaseDC(dc); } void CIrisFODISCalibrationToolDlg::CreateInformDialog(CString cstrInformation, int iShow) { if (m_pdlgInfo != NULL) { delete m_pdlgInfo; m_pdlgInfo = NULL; } m_pdlgInfo = new CDlgInform; m_pdlgInfo->Create(IDD_DIALOG_INFORM, this); m_pdlgInfo->m_staInfo.SetWindowTextW(cstrInformation); m_pdlgInfo->CenterWindow(this); m_pdlgInfo->ShowWindow(iShow); m_pdlgInfo->m_staInfo.UpdateData(FALSE); m_pdlgInfo->UpdateData(FALSE); } UINT CIrisFODISCalibrationToolDlg::ThreadProcessFODISCal(LPVOID pParam) { CIrisFODISCalibrationToolDlg *pCaller = (CIrisFODISCalibrationToolDlg *)pParam; CalFrame FPODISCalDataFrame; tagDataFrame OneDataFrame; CalDataFrame OneCalDataFrame; CFile cfFPODISCal,cfOriFODISData,cfCalFODISData; CString cstrOneOutputFilePath; if (cfFPODISCal.Open(pCaller->m_cstrCalFilePath, CFile::modeRead)) { //cfFPODISCal.Read(&FPODISCalDataFrame, sizeof(FPODISCalDataFrame)); cfFPODISCal.Read((char *)&FPODISCalDataFrame.uiExposureTimeInMS, sizeof(UINT));//U32 cfFPODISCal.Read((char*)&FPODISCalDataFrame.fTemperature, sizeof(float)); cfFPODISCal.Read((char*)&FPODISCalDataFrame.iPixels, sizeof(int)); cfFPODISCal.Read((char*)FPODISCalDataFrame.fWaveLength, sizeof(float)*FPODISCalDataFrame.iPixels); cfFPODISCal.Read((char*)FPODISCalDataFrame.dCal_Gain, sizeof(double)*FPODISCalDataFrame.iPixels); cfFPODISCal.Read((char*)FPODISCalDataFrame.dCal_Offset, sizeof(double)*FPODISCalDataFrame.iPixels); //bReadIS2Cal = true; } else { AfxMessageBox(L"Open cal file Err!!!"); return -1; } for (UINT ui = 0; ui < pCaller->m_vecFodisFile.size(); ui++) { CString cstrInfo; int iTempFileCount = (int)pCaller->m_vecFodisFile.size(); cstrInfo.Format(_T("正在处理第%d个FODIS文件。。。共有%d个文件"), ui + 1, iTempFileCount); pCaller->m_pdlgInfo->m_staInfo.SetWindowText(cstrInfo); pCaller->m_pdlgInfo->PostMessageW(MYWM_INFORM_UPDATE); if (cfOriFODISData.Open(pCaller->m_vecFodisFile[ui], CFile::modeRead)) { int iPos = pCaller->m_vecFodisFile[ui].ReverseFind('\\'); cstrOneOutputFilePath = pCaller->m_cstrOutputFilePath + pCaller->m_vecFodisFile[ui].Right(pCaller->m_vecFodisFile[ui].GetLength()-iPos - 1); iPos = cstrOneOutputFilePath.ReverseFind('.'); cstrOneOutputFilePath = cstrOneOutputFilePath.Left(iPos) + L".is2r"; cfCalFODISData.Open(cstrOneOutputFilePath, CFile::modeCreate | CFile::modeWrite); while (cfOriFODISData.Read(&OneDataFrame, sizeof(OneDataFrame))) { OneCalDataFrame.dSyncTimes = OneDataFrame.dTimes; OneCalDataFrame.fTemperature = OneDataFrame.fTemperature; OneCalDataFrame.usExposureTime = OneDataFrame.usExposureTimeInMS; for (int i=0;i< FPODISCalDataFrame.iPixels;i++) { OneCalDataFrame.fData[i] = (float)((float)OneDataFrame.lData[i] * FPODISCalDataFrame.dCal_Gain[i] * ((float)FPODISCalDataFrame.uiExposureTimeInMS / (float)OneDataFrame.usExposureTimeInMS)); } cfCalFODISData.Write(&OneCalDataFrame, sizeof(OneCalDataFrame)); } cfCalFODISData.Close(); } else { AfxMessageBox(L"Open FODIS data file Err!!!"); return -2; } cfOriFODISData.Close(); } return 0; } BEGIN_MESSAGE_MAP(CIrisFODISCalibrationToolDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_FODISDATA, &CIrisFODISCalibrationToolDlg::OnBnClickedButtonFodisdata) ON_BN_CLICKED(IDC_BUTTON_CALDATA, &CIrisFODISCalibrationToolDlg::OnBnClickedButtonCaldata) ON_BN_CLICKED(IDC_BUTTON_OUTPUTDATA, &CIrisFODISCalibrationToolDlg::OnBnClickedButtonOutputdata) ON_BN_CLICKED(IDC_BUTTON_STARTCALC, &CIrisFODISCalibrationToolDlg::OnBnClickedButtonStartcalc) END_MESSAGE_MAP() // CIrisFODISCalibrationToolDlg 消息处理程序 BOOL CIrisFODISCalibrationToolDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr) { 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); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CIrisFODISCalibrationToolDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CIrisFODISCalibrationToolDlg::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 CIrisFODISCalibrationToolDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CIrisFODISCalibrationToolDlg::OnBnClickedButtonFodisdata() { // TODO: 在此添加控件通知处理程序代码 ShowFolderDialog(IDC_EDIT_FODISDATA, L"请选择数据路径"); m_vecFodisFile.clear(); m_lbFilePath.ResetContent(); bool bWorking = true; UpdateData(1); m_ceFODISFilePath.GetWindowTextW(m_cstrFODISFilePath); int iPos = m_cstrFODISFilePath.ReverseFind('\\'); m_cstrFODISFilePath = m_cstrFODISFilePath.Left(iPos + 1); m_ceOutputPath.SetWindowTextW(m_cstrFODISFilePath+L"Cal\\"); CFileFind cfFinder; bWorking = true; CString cstrPath = m_cstrFODISFilePath + _T("*.dat"); bool bRes = cfFinder.FindFile(cstrPath); if (!bRes) { return; } while (bWorking) { bWorking = cfFinder.FindNextFile(); if (cfFinder.IsDots()) { continue; } if (cfFinder.IsDirectory()) { CString str = cfFinder.GetFilePath(); } else { CString str = cfFinder.GetFilePath(); m_vecFodisFile.push_back(str); } } for (UINT ui = 0; ui < m_vecFodisFile.size(); ui++) { m_lbFilePath.AddString(m_vecFodisFile[ui]); } ResetListBoxHScrollBar(IDC_LIST_DATAPATH); } void CIrisFODISCalibrationToolDlg::OnBnClickedButtonCaldata() { // TODO: 在此添加控件通知处理程序代码 ShowFileDialog(IDC_EDIT_CALDATA, _T(".cal"), _T("Data Times Files (*.cal)|*.cal|"), 0); } void CIrisFODISCalibrationToolDlg::OnBnClickedButtonOutputdata() { // TODO: 在此添加控件通知处理程序代码 ShowFolderDialog(IDC_EDIT_OUTPUTDATA, L"请选择保存数据路径"); } void CIrisFODISCalibrationToolDlg::OnBnClickedButtonStartcalc() { // TODO: 在此添加控件通知处理程序代码 if (m_vecFodisFile.size()==0) { AfxMessageBox(L"No FODIS Data File Found!!!"); return; } m_ceCalFilePath.GetWindowTextW(m_cstrCalFilePath); if( m_cstrCalFilePath == L"") { AfxMessageBox(L"No Cal Data File Found!!!"); return; } m_ceOutputPath.GetWindowTextW(m_cstrOutputFilePath); if (m_cstrOutputFilePath == L"") { AfxMessageBox(L"No Output Filepath!!!"); return; } if (!PathIsDirectory(m_cstrOutputFilePath)) { CreateDirectory(m_cstrOutputFilePath, NULL); } CreateInformDialog(L"开始校准数据。。。", 1); m_ptrdProcess = AfxBeginThread(ThreadProcessFODISCal, this); }