// ModifyLinePointDlg.cpp : 实现文件 // #include "stdafx.h" #include "ModifyLinePointDlg.h" #include "afxdialogex.h" #include #include "string" #include #include #include // CModifyLinePointDlg 对话框 IMPLEMENT_DYNAMIC(CModifyLinePointDlg, CBCGPDialog) CModifyLinePointDlg::CModifyLinePointDlg(CWnd* pParent /*=NULL*/) : CBCGPDialog(CModifyLinePointDlg::IDD, pParent) , m_bCirclingPoint(0) { EnableVisualManagerStyle(TRUE, TRUE); m_gLat = 0.0; m_gLon = 0.0; m_bCheck = false; splitSymbol = "EWNSs+\/-,;°度′'’分\""”秒、,; "; dSymbol = "°"; mSymbol = "′"; sSymbol = "\""; m_bCirclingPointVisible = true; m_selectedPointID = 0; } CModifyLinePointDlg::~CModifyLinePointDlg() { } void CModifyLinePointDlg::DoDataExchange(CDataExchange* pDX) { CBCGPDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO_TYPE, m_PositionType); DDX_Control(pDX, IDC_EDIT_LON, m_strLon); DDX_Control(pDX, IDC_EDIT_LAT, m_strLat); DDX_Control(pDX, IDC_COMBO_POINTID, m_PointID); } BEGIN_MESSAGE_MAP(CModifyLinePointDlg, CBCGPDialog) ON_CBN_SELCHANGE(IDC_COMBO_PT, &CModifyLinePointDlg::OnCbnSelchangeComboPt) ON_CBN_SELCHANGE(IDC_COMBO_TYPE, &CModifyLinePointDlg::OnCbnSelchangeComboType) ON_BN_CLICKED(IDOK, &CModifyLinePointDlg::OnBnClickedOk) ON_BN_CLICKED(IDCANCEL, &CModifyLinePointDlg::OnBnClickedCancel) ON_BN_CLICKED(IDC_SETCIRCLINGPOINT, &CModifyLinePointDlg::OnBnClickedSetcirclingpoint) ON_EN_KILLFOCUS(IDC_EDIT_LON, &CModifyLinePointDlg::OnEnKillfocusEditLon) ON_EN_KILLFOCUS(IDC_EDIT_LAT, &CModifyLinePointDlg::OnEnKillfocusEditLat) ON_CBN_SELCHANGE(IDC_COMBO_POINTID, &CModifyLinePointDlg::OnCbnSelchangeComboPointid) END_MESSAGE_MAP() //设置盘旋点按钮是否可见 void CModifyLinePointDlg::SetCirclingPointRBTNVisible(bool isVisible) { m_bCirclingPointVisible = isVisible; }; //勾选盘旋点 void CModifyLinePointDlg::CheckedCirclingPoint() { m_bCheck = true; }; void CModifyLinePointDlg::SetLonLat(double lon,double lat) { m_gLat = lat; m_gLon = lon; } void CModifyLinePointDlg::GetLonLat(double &lon,double &lat, int &pointID) { lon = m_gLon; lat = m_gLat; pointID = m_selectedPointID; } // 经纬度转字符串度分秒 void CModifyLinePointDlg::getDMSString(double lon,double lat,string &str_lon,string &str_lat) { int lon_d,lon_m,lat_d,lat_m; double lon_s,lat_s; angle.DegtoDms(lon,lon_d,lon_m,lon_s); angle.DegtoDms(lat,lat_d,lat_m,lat_s); string str_lat_s = angle.DoubleToString(lat_s,4); string str_lon_s = angle.DoubleToString(lon_s,4); str_lon = angle.IntToString(lon_d) + dSymbol + angle.IntToString(lon_m) + mSymbol + str_lon_s + sSymbol; str_lat = angle.IntToString(lat_d) + dSymbol + angle.IntToString(lat_m) + mSymbol + str_lat_s + sSymbol; } double CModifyLinePointDlg::getEditValue(const int ID) { double value = -200.0; CString cstr; GetDlgItemText(ID,cstr); int typeID = m_PositionType.GetCurSel(); if (typeID==0) //度 { value = _tstof(cstr); } else if (typeID==1) //度分秒 { vector vec_str = angle.split(cstr.GetBuffer(),splitSymbol); int d = stoi(vec_str.at(0)); int m = stoi(vec_str.at(1)); double s = stod(vec_str.at(2)); angle.DmstoDeg(d,m,s,value); } return value; } bool CModifyLinePointDlg::IsCirclingPoint() { return m_bCirclingPoint; } void CModifyLinePointDlg::InitEidtText() { string str_lon,str_lat; if (posTypeID==0) //度 { str_lon = angle.DoubleToString(m_gLon,7); str_lat = angle.DoubleToString(m_gLat,7); } else if (posTypeID == 1) //度分秒 { getDMSString(m_gLon,m_gLat,str_lon,str_lat); } // 编辑框中默认显示的经纬度 SetDlgItemText(IDC_EDIT_LON,str_lon.c_str()); SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str()); } bool CModifyLinePointDlg::checkLon(string strLon,int type) { if (type==0) //度 { string str_match = "^\\-?(\\d{1,2}\\.?\\d*|1[0-7]?\\d{1}\\.?\\d*|180\\.?0*)$"; regex regexNumber1(str_match); return regex_match(strLon,regexNumber1); } else if (type==1) //度分秒,xx;xx;xx.xx { /* string str_match = "^[-]?((\\d|[1-9]\\d|1[0-7]\\d)[;](\\d|[0-5]\\d)[;](\\d|[0-5]\\d)(\\.\\d{1,6})?[;]?$)"; regex regexNumber1(str_match); bool b = regex_match(strLon,regexNumber1);*/ wstring str_match = L"^[EW+-]?((\\d|[1-9]\\d|1[0-7]\\d)[s\\-,;°度/、;](\\d|[0-5]\\d)[s\\-,;/′、;'’ 分](\\d|[0-5]\\d)(\\.\\d{1,})?[s\\-,;/\""” 秒]?$)"; wregex regexNumber1(str_match); return regex_match(angle.String2WString(strLon),regexNumber1); } } bool CModifyLinePointDlg::checkLat(string strLat,int type) { if (type==0) //度 { string sm = "^\\-?([0-8]?\\d{1}\\.?\\d*|90\\.?0*)$"; regex regexNumber(sm); return regex_match(strLat,regexNumber); } else if (type==1) //度分秒,xx;xx;xx.xx { /* string sm = "^[-]?((\\d|[1-8]\\d)[;](\\d|[0-5]\\d)[;](\\d|[0-5]\\d)(\\.\\d{1,6})?[;]?$)"; regex regexNumber(sm); return regex_match(strLat,regexNumber);*/ wstring str_match2 = L"^[NS+-]?((\\d|[1-8]\\d)[s\\-,;°度/、;](\\d|[0-5]\\d)[s\\-,;/′、;'’ 分](\\d|[0-5]\\d)(\\.\\d{1,})?[s\\-,;/\""” 秒]?$)"; wregex regexNumber2(str_match2); return regex_match(angle.String2WString(strLat),regexNumber2); } } // CModifyLinePointDlg 消息处理程序 BOOL CModifyLinePointDlg::OnInitDialog() { CBCGPDialog::OnInitDialog(); CenterWindow(); m_PositionType.AddString(_T("度分秒")); m_PositionType.AddString(_T("度")); m_PositionType.SetCurSel(0); posTypeID = 0; lastTypeID = 0; m_bCirclingPoint = 0; // 编辑框中默认显示第一项的文字“谷歌” InitEidtText(); //SetDlgItemText(IDC_EDIT_LON,_T("119.623546")); //SetDlgItemText(IDC_EDIT_LAT,_T("32.562147")); GetDlgItem(IDC_SETCIRCLINGPOINT)->ShowWindow(m_bCirclingPointVisible); if (m_bCheck) //勾选盘旋点 { ((CButton *)GetDlgItem(IDC_SETCIRCLINGPOINT))->SetCheck(true); m_bCheck = true; } //在下拉列表中添加航点号 CString cstr; for (int i=0;i vec_lat = angle.split(strLat.GetBuffer(),splitSymbol); vector vec_lon = angle.split(strLon.GetBuffer(),splitSymbol); int lon_d = stoi(vec_lon.at(0)); int lon_m = stoi(vec_lon.at(1)); double lon_s = stod(vec_lon.at(2)); angle.DmstoDeg(lon_d,lon_m,lon_s,tarLon); int lat_d = stoi(vec_lat.at(0)); int lat_m = stoi(vec_lat.at(1)); double lat_s = stod(vec_lat.at(2)); angle.DmstoDeg(lat_d,lat_m,lat_s,tarLat); SetDlgItemText(IDC_EDIT_LON,angle.DoubleToString(tarLon).c_str()); SetDlgItemText(IDC_EDIT_LAT,angle.DoubleToString(tarLat).c_str()); } else if (posTypeID==1) //度分秒 { double lat,lon; lat = _tstof(strLat); lon = _tstof(strLon); string str_lat,str_lon; getDMSString(lon,lat,str_lon,str_lat); SetDlgItemText(IDC_EDIT_LON,str_lon.c_str()); SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str()); } } //确认按钮 void CModifyLinePointDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 m_gLon = getEditValue(IDC_EDIT_LON); m_gLat = getEditValue(IDC_EDIT_LAT); // 编辑框中默认显示的经纬度 //SetDlgItemText(IDC_EDIT_LON,str_lon.c_str()); //SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str()); m_bCirclingPoint = ((CButton *)GetDlgItem(IDC_SETCIRCLINGPOINT))->GetCheck(); CBCGPDialog::OnOK(); } void CModifyLinePointDlg::OnBnClickedCancel() { // TODO: 在此添加控件通知处理程序代码 CBCGPDialog::OnCancel(); //CBCGPDialog::OnClose(); } void CModifyLinePointDlg::OnBnClickedSetcirclingpoint() { if (!m_bCheck) { ((CButton *)GetDlgItem(IDC_SETCIRCLINGPOINT))->SetCheck(true); m_bCheck = true; } else { ((CButton *)GetDlgItem(IDC_SETCIRCLINGPOINT))->SetCheck(false); m_bCheck = false; } } void CModifyLinePointDlg::OnEnKillfocusEditLon() { // TODO: 在此添加控件通知处理程序代码 CString cstr; GetDlgItemText(IDC_EDIT_LON,cstr); int typeID = m_PositionType.GetCurSel(); bool b = checkLon(cstr.GetBuffer(),typeID); if (!b) { BCGPMessageBox("经度范围或格式有误,请重新输入!"); m_strLon.SetFocus(); } } void CModifyLinePointDlg::OnEnKillfocusEditLat() { // TODO: 在此添加控件通知处理程序代码 CString cstr; GetDlgItemText(IDC_EDIT_LAT,cstr); int typeID = m_PositionType.GetCurSel(); bool b = checkLat(cstr.GetBuffer(),typeID); if (!b) { BCGPMessageBox("纬度范围或格式有误,请重新输入!"); m_strLat.SetFocus(); } } void CModifyLinePointDlg::SetSelectedPointID(int PointID){ m_selectedPointID = PointID + 1; //m_selectedPointID = PointID; } // 选择航点下拉列表变化时触发 void CModifyLinePointDlg::OnCbnSelchangeComboPointid() { // TODO: 在此添加控件通知处理程序代码 m_selectedPointID = m_PointID.GetCurSel() + 1; TRACE(_T("当前选中航点ID: %d \n"),m_selectedPointID); //修改经纬度文本框的值 CString cstr; if(posTypeID==0) { //度 cstr.Format(_T("%f"), m_editLineDataGroup.pts[m_selectedPointID-1].dX); SetDlgItemText(IDC_EDIT_LON,cstr); cstr.Format(_T("%f"), m_editLineDataGroup.pts[m_selectedPointID-1].dY); SetDlgItemText(IDC_EDIT_LAT,cstr); } else if(posTypeID==1) { // 度分秒 string str_lon, str_lat; getDMSString(m_editLineDataGroup.pts[m_selectedPointID-1].dX, m_editLineDataGroup.pts[m_selectedPointID-1].dY,str_lon, str_lat); SetDlgItemText(IDC_EDIT_LON,str_lon.c_str()); SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str()); } }