// CFlyLineDesign.cpp: 实现文件 // #include "stdafx.h" #include "FlyLineDesign.h" #include "SetSaveLineID.h" #include "Globe.h" #include "LineDesign.h" // CFlyLineDesign 对话框 CFlyLineDesign::CFlyLineDesign(CWnd* pParent /*=NULL*/) : CDialog(CFlyLineDesign::IDD, pParent) { InitiazeAllMembers(); //总的航点个数 m_totalPtNums = 255; //航线数据集合 m_pLinePts = new PtStruct[m_totalPtNums]; memset(m_pLinePts, 0, sizeof(PtStruct)*m_totalPtNums); //航点模式为“置点” g_ptModeInLineDesign = 0; } CFlyLineDesign::~CFlyLineDesign() { if (m_pLinePts != NULL) { delete []m_pLinePts; m_pLinePts = NULL; } } void CFlyLineDesign::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_ALT, m_ptAlt); DDV_MinMaxDouble(pDX, m_ptAlt, 0, 5000); DDX_Text(pDX, IDC_EDIT_LAT, m_ptLat); DDV_MinMaxDouble(pDX, m_ptLat, -90.0, 90.0); DDX_Text(pDX, IDC_EDIT_LON, m_ptLon); DDV_MinMaxDouble(pDX, m_ptLon, -180.0, 180.0); DDX_Text(pDX, IDC_EDIT_STAY_TIME, m_flySpeed); DDX_Control(pDX, IDC_COMBO_PT, m_comboPt); } BEGIN_MESSAGE_MAP(CFlyLineDesign, CDialog) ON_BN_CLICKED(IDC_BTN_ADD_POINT, OnAddFlyLinePoint) ON_BN_CLICKED(IDC_BTN_EDIT_POINT, OnEditFlyLinePoint) ON_BN_CLICKED(IDC_BTN_DELETE_POINT, OnDeleteFlyLinePoint) ON_BN_CLICKED(IDC_BTN_SAVE_LINE, OnSaveFlyLine) ON_CBN_SELCHANGE(IDC_COMBO_PT, OnCbnSelchangeComboPt) ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel) END_MESSAGE_MAP() //初始化所有的变量 void CFlyLineDesign::InitiazeAllMembers() { m_ptAlt = 0.0; m_ptLat = 0.0; m_ptLon = 0.0; //清空航线数据集合 m_linePtNums = 0; //清空当前的航点数据 memset(&m_curPoint, 0, sizeof(PtStruct)); m_linePtNums = 0; //是否增加新的航点 m_bAddNewPoint = true; } //清除已有的航线数据,包括界面显示的数据 void CFlyLineDesign::ClearCurrentData() { //清空所有的变量 InitiazeAllMembers(); //清空组合框的数据集合 if (m_comboPt.GetCount() > 0) { m_comboPt.ResetContent(); } GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_SAVE_LINE)->EnableWindow(FALSE); //刷新显示 UpdateData(FALSE); } //功能:增加新的航点 //输入:经度lon,纬度lat void CFlyLineDesign::AddPoint(const double lon, const double lat) { m_curPoint.dX = lon; m_curPoint.dY = lat; //设置当前界面的数据 SetWindowMembersValue(m_curPoint); UpdateData(FALSE); } //功能:增加新的航点 //输入:航点数据体ptStruct void CFlyLineDesign::AddPoint(const PtStruct ptStruct) { //“置点”按钮可选 GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE); //航点编号 m_curPoint.nPt = ptStruct.nPt; //经度 m_curPoint.dX = ptStruct.dX; //纬度 m_curPoint.dY = ptStruct.dY; //插入航点编号 InsertComboBox(ptStruct.nPt); //设置下拉列表框的焦点 m_comboPt.SetCurSel(ptStruct.nPt-1); //设置当前界面的数据 SetWindowMembersValue(ptStruct); UpdateData(FALSE); } //功能:对话框界面操作——增加新的航点 void CFlyLineDesign::OnAddFlyLinePoint() { //获得软件界面输入的数据 GetWindowMembersValue(m_curPoint); //加入航线集合中 m_pLinePts[m_linePtNums] = m_curPoint; m_linePtNums ++; m_bAddNewPoint = true; if (m_linePtNums > 0) { GetDlgItem(IDC_BTN_SAVE_LINE)->EnableWindow(TRUE); } //发送消息到主程序,进行标绘 if (g_mapHwnd != NULL) { ::SendMessage(g_mapHwnd, WM_ADD_LINE_POINT, 0, 0); } //“置点”按钮可选 GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(FALSE); } //功能:对话框界面操作——修改航点 void CFlyLineDesign::OnEditFlyLinePoint() { //初始化 memset(&m_curPoint, 0, sizeof(PtStruct)); //获得软件界面输入的数据 GetWindowMembersValue(m_curPoint); //编辑位置 int editPos = m_comboPt.GetCurSel(); //航点编号 m_curPoint.nPt = editPos +1; //更新航点数据 m_pLinePts[editPos] = m_curPoint; GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE); g_ptModeInLineDesign = 0; //向主程序发送航点删除信息 if (g_mapHwnd != NULL) { ::SendMessage(g_mapHwnd, WM_EDIT_LINE_POINT, (WPARAM)(&m_curPoint), 0); } } //功能:对话框界面操作——删除航点 void CFlyLineDesign::OnDeleteFlyLinePoint() { UpdateData(TRUE); //删除航点的航点号 int pointID = m_comboPt.GetCurSel(); //向主程序发送航点删除信息 if (g_mapHwnd != NULL) { ::SendMessage(g_mapHwnd, WM_DELETE_LINE_POINT, (WPARAM)pointID, 0); } //删除选定点,改点后面的点依次往前移动一位 for (int i=pointID; i0) { m_comboPt.ResetContent(); for (int i=0; i 0) { m_curPoint = m_pLinePts[m_linePtNums-1]; //设置下拉列表框显示最后一个元素 m_comboPt.SetCurSel(m_linePtNums-1); } else { memset(&m_curPoint, 0, sizeof(PtStruct)); } //设置软件界面显示的数据 SetWindowMembersValue(m_curPoint); UpdateData(FALSE); GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE); g_ptModeInLineDesign = 0; } //功能:对话框界面操作——保存航线 void CFlyLineDesign::OnSaveFlyLine() { int Char_tmp; Char_tmp = ((CComboBox*)GetDlgItem(IDC_COMBO_CHAR))->GetCurSel(); switch (Char_tmp) { case 0: m_ptCarctr = 1; break; case 1: m_ptCarctr = 3; break; case 2: m_ptCarctr = 5; break; case 3: m_ptCarctr = 7; break; case 4: m_ptCarctr = 11; break; } g_ptModeInLineDesign = 0; //如果航线数据为空,返回 if (m_linePtNums <= 0) { CDialog::OnOK(); } //航线文件路径 CString strFlyLineName = _T(""); //航线编号 int designLineID = 0; //航路特征字 int lineProperty = 0; //弹出航线选择对话框 CSetSaveLineID dlg; if (dlg.DoModal() == IDOK) { //航路文件名 strFlyLineName = dlg.m_strFlyLineName; //航线编号 designLineID = dlg.m_designLineID; //航路特征字 lineProperty = dlg.m_lineProperty; } else { return ; } //选择航点特征字 m_ptCarctr=((CComboBox*)GetDlgItem(IDC_COMBO_CHAR))->GetCurSel() ; //写出航线数据 FILE *fp = fopen(strFlyLineName, "w" ); if ( fp == NULL ) { CDialog::OnOK(); } else { PtStruct pt; memset(&pt, 0, sizeof(PtStruct)); //原点数据写入 fprintf(fp, "%d, %d, %.7f, %.7f, %.2lf, %d, %02X, %02X\n", designLineID, 0, g_gcsLon, g_gcsLat, 0.0, 0, 0, 2); //遍历航点集合数据 for ( int i = 0; i < m_linePtNums; i++ ) { pt = m_pLinePts[i]; //将除最后一个点的数据写入文件 if ( i < (m_linePtNums-1)) { fprintf(fp, "%d, %d, %.7f, %.7f, %.2lf, %d, %02X, %02X\n", designLineID, pt.nPt, pt.dX, pt.dY, pt.nH, pt.nV, pt.ch1, pt.ch2); } else//将最后一个点的航段特征数据写入文件 { fprintf(fp, "%d, %d, %.7f, %.7f, %.2lf, %d, %02X, %02X\n", designLineID, pt.nPt, pt.dX, pt.dY, pt.nH, pt.nV, pt.ch1, lineProperty); } } fclose( fp ); //弹出保存成功对话框 AfxMessageBox(_T("航线文件保存成功!")); //发送对话框关闭消息到主程序 if (g_mapHwnd != NULL) { ::SendMessage(g_mapHwnd, WM_CLOSE_LINEDESIGN_DIALOG, 0, 0); //关闭对话框 CDialog::OnCancel(); } } } //界面数据赋值 //输入:航点数据体pt void CFlyLineDesign::SetWindowMembersValue(const PtStruct pt) { //经度 m_ptLon = pt.dX; //纬度 m_ptLat = pt.dY; //高度 m_ptAlt = pt.nH; //飞行速度 m_flySpeed = pt.nV; } //功能:获得界面输入的数据 //输入:航点数据体pt //输出:航点数据体pt void CFlyLineDesign::GetWindowMembersValue(PtStruct &pt) { UpdateData(TRUE); //经度 pt.dX = m_ptLon; //纬度 pt.dY = m_ptLat; //高度 pt.nH = m_ptAlt; //飞行速度 pt.nV = m_flySpeed; //航路特征字 pt.ch2 = 0X02; } BOOL CFlyLineDesign::OnInitDialog() { CDialog::OnInitDialog(); // SetWindowPos( &CWnd::wndTop, m_rcLineDesignArea.left, m_rcLineDesignArea.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE); ( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->InsertString(0, _T("复飞航线") ); ( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->InsertString(1, _T("还有航点") ); ( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->InsertString(2, _T("归航回收") ); ( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->InsertString(3, _T("着陆轨迹切入点") ); ( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->InsertString(4, _T("接地点") ); ( ( CComboBox * ) GetDlgItem( IDC_COMBO_CHAR ) )->SetCurSel(0); GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_SAVE_LINE)->EnableWindow(FALSE); // MoveWindow(m_rcLineDesignArea.left, m_rcLineDesignArea.top, 0, 0, TRUE); //移动到固定的显示区域 // SetWindowPos( &CWnd::wndTop, m_rcLineDesignArea.left, m_rcLineDesignArea.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_HIDEWINDOW ); SetWindowPos( &CWnd::wndTop, m_rcLineDesignArea.left, m_rcLineDesignArea.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_HIDEWINDOW ); // ShowWindow(SW_HIDE); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } //功能:移动对话框到给定的显示区域 void CFlyLineDesign::MoveToGivenArea(const CRect rcArea) { m_rcLineDesignArea = rcArea; m_rcLineDesignArea.top += 20; } //功能:下拉列表框航点编号更改 void CFlyLineDesign::OnCbnSelchangeComboPt() { UpdateData(TRUE); //没有航点数据时,返回 if (m_linePtNums <= 0) { GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE); g_ptModeInLineDesign = 0; return; } //下拉列表框的航点编号不存在于航线集合中时,返回 if (m_comboPt.GetCurSel()+1 > m_linePtNums) { GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE); g_ptModeInLineDesign = 0; return; } else { //选中的航点编号 int selectID = m_comboPt.GetCurSel(); //航点数据 m_curPoint = m_pLinePts[m_comboPt.GetCurSel()]; //设置软件界面显示的数据 SetWindowMembersValue(m_curPoint); UpdateData(FALSE); GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(TRUE); //向主程序发送待编辑的航点数据 if (g_mapHwnd != NULL) { ::SendMessage(g_mapHwnd, WM_EDIT_LINE_POINT, (WPARAM)(&m_curPoint), 1); } g_ptModeInLineDesign = 1; } } void CFlyLineDesign::OnBnClickedCancel() { //发送对话框关闭消息到主程序 if (g_mapHwnd != NULL) { ::SendMessage(g_mapHwnd, WM_CLOSE_LINEDESIGN_DIALOG, 0, 0); } g_ptModeInLineDesign = 0; CDialog::OnCancel(); } //功能:往下拉列表框增加一行数据 //输入:点号pointID void CFlyLineDesign::InsertComboBox(const int pointID) { //判断下该项目是否存在,存在,不新建 if (m_comboPt.GetCount() >= pointID) { return; } CString str = _T(""); str.Format(_T("%d"), pointID); //插入组合框中 m_comboPt.InsertString(pointID-1, str); } //功能:编辑航点数据 //输入:经度lon,纬度lat void CFlyLineDesign::EditPoint(const double lon, const double lat) { //航点数据 m_curPoint.dX = lon; m_curPoint.dY = lat; //更新航点数据 m_pLinePts[m_curPoint.nPt-1] = m_curPoint; //设置软件界面显示的数据 SetWindowMembersValue(m_curPoint); UpdateData(FALSE); GetDlgItem(IDC_BTN_ADD_POINT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_EDIT_POINT)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_DELETE_POINT)->EnableWindow(FALSE); //向主程序发送航点编辑信息 if (g_mapHwnd != NULL) { ::SendMessage(g_mapHwnd, WM_EDIT_LINE_POINT, (WPARAM)(&m_curPoint), 1); } }