diff --git a/GISControlDlg.aps b/GISControlDlg.aps index 72999e4..498ea36 100644 Binary files a/GISControlDlg.aps and b/GISControlDlg.aps differ diff --git a/GISControlDlg.rc b/GISControlDlg.rc index f278b21..cf48b73 100644 --- a/GISControlDlg.rc +++ b/GISControlDlg.rc @@ -115,19 +115,19 @@ BEGIN CONTROL "",IDC_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_CHECKBOXES | WS_BORDER | WS_HSCROLL | WS_TABSTOP,0,0,107,110,WS_EX_CLIENTEDGE END -IDD_XY_DIALOG DIALOGEX 0, 0, 103, 43 +IDD_XY_DIALOG DIALOGEX 0, 0, 112, 79 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "地图定位" FONT 9, "微软雅黑", 400, 0, 0x86 BEGIN - LTEXT "经度:",IDC_STATIC,3,3,26,8 - EDITTEXT IDC_EDIT_LON,26,1,65,12,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_CLIENTEDGE - LTEXT "纬度:",IDC_STATIC,3,16,26,8 - EDITTEXT IDC_EDIT_LAT,26,14,65,12,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_CLIENTEDGE - LTEXT "°",IDC_STATIC,95,0,8,8 - LTEXT "°",IDC_STATIC,95,13,8,8 - PUSHBUTTON "确定",IDC_CONFIRM_BTN,58,31,41,10 - CONTROL "手动输入",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,30,43,10 + LTEXT "经度:",IDC_STATIC,6,24,26,8 + EDITTEXT IDC_EDIT_LON,39,22,65,12,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_CLIENTEDGE + LTEXT "纬度:",IDC_STATIC,6,40,26,8 + EDITTEXT IDC_EDIT_LAT,39,38,65,12,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_CLIENTEDGE + PUSHBUTTON "确定",IDC_CONFIRM_BTN,59,55,41,13 + CONTROL "手动输入",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,55,43,13 + LTEXT "坐标类型:",IDC_STATIC,5,9,36,8 + COMBOBOX IDC_COMBO_TYPE_XY,39,8,65,63,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP END IDD_DISTANCE_DIALOG DIALOGEX 0, 0, 161, 56 @@ -345,13 +345,13 @@ FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "确定",IDOK,11,97,50,14 PUSHBUTTON "取消",IDCANCEL,71,97,50,14 - LTEXT "坐标类型:",IDC_STATIC,11,26,40,10 + LTEXT "坐标类型:",IDC_STATIC,11,26,47,10 LTEXT "经度:",IDC_STATIC,11,43,40,10 EDITTEXT IDC_EDIT_LON,50,41,70,15,ES_AUTOHSCROLL,WS_EX_RIGHT LTEXT "纬度:",IDC_STATIC,11,62,40,10 EDITTEXT IDC_EDIT_LAT,50,59,70,15,ES_AUTOHSCROLL,WS_EX_RIGHT COMBOBOX IDC_COMBO_TYPE,50,25,70,63,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "设置为盘旋点",IDC_SETCIRCLINGPOINT,"Button",BS_AUTORADIOBUTTON,11,81,59,10 + CONTROL "设置为盘旋点",IDC_SETCIRCLINGPOINT,"Button",BS_AUTORADIOBUTTON,11,81,67,10 LTEXT "航点号:",IDC_STATIC,12,9,34,10 COMBOBOX IDC_COMBO_POINTID,50,8,70,63,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP END @@ -411,6 +411,8 @@ BEGIN IDD_XY_DIALOG, DIALOG BEGIN + RIGHTMARGIN, 109 + BOTTOMMARGIN, 75 END IDD_DISTANCE_DIALOG, DIALOG diff --git a/GISDlg.cpp b/GISDlg.cpp index 97d1102..fc1f817 100644 --- a/GISDlg.cpp +++ b/GISDlg.cpp @@ -2470,7 +2470,7 @@ void CGISDlg::MouseMoveMap1(short Button, short Shift, long x, long y) return; } - //显示经纬度坐标时 + //显示经纬度坐标时(地图定位) if (m_bHaveShowLonLatDlg && m_pLonLatDlg ->GetAutoEditStatus()) { double dX = 0; @@ -2877,7 +2877,7 @@ void CGISDlg::DrawLineLabel(long &drawLayerID, const double ptLon1, const double labelCategory.SetFontName(_T("Times New Roman")); labelCategory.SetFontSize(10); - labesPtr.AddLabel(str, textLon, textLat, 0, 0); + //labesPtr.AddLabel(str, textLon, textLat, 0, 0); } //重绘 diff --git a/LonLatDlg.cpp b/LonLatDlg.cpp index 5432f67..4b07326 100644 --- a/LonLatDlg.cpp +++ b/LonLatDlg.cpp @@ -14,9 +14,10 @@ IMPLEMENT_DYNAMIC(CLonLatDlg, CDialog) CLonLatDlg::CLonLatDlg(CWnd* pParent /*=NULL*/) : CDialog(CLonLatDlg::IDD, pParent) { - + //EnableVisualManagerStyle(TRUE, TRUE); m_lon = 0.0; m_lat = 0.0; + posTypeID = 0; } CLonLatDlg::~CLonLatDlg() @@ -28,15 +29,18 @@ void CLonLatDlg::DoDataExchange(CDataExchange* pDX) CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_LON, m_lon); DDX_Text(pDX, IDC_EDIT_LAT, m_lat); + DDX_Control(pDX, IDC_EDIT_LON, m_lon_edit); + DDX_Control(pDX, IDC_EDIT_LAT, m_lat_edit); + DDX_Control(pDX, IDC_COMBO_TYPE_XY, m_coord_type); } BEGIN_MESSAGE_MAP(CLonLatDlg, CDialog) ON_BN_CLICKED(IDC_CONFIRM_BTN, &CLonLatDlg::OnBnClickedConfirmBtn) ON_BN_CLICKED(IDC_CHECK1, &CLonLatDlg::OnBnClickedCheck1) + ON_CBN_SELCHANGE(IDC_COMBO_TYPE_XY, &CLonLatDlg::OnCbnSelchangeComboType) END_MESSAGE_MAP() - // CLonLatDlg 消息处理程序 //获取是否手动输入状态 @@ -50,11 +54,20 @@ bool CLonLatDlg::GetAutoEditStatus() //输入:经度lon,纬度lat void CLonLatDlg::SetLonLatInfo(const double lon, const double lat) { - m_lon = lon; - m_lat = lat; - - UpdateData(FALSE); - //UpdateData(TRUE); + if (posTypeID==0) //度 + { + m_lon = lon; + m_lat = lat; + UpdateData(FALSE); + } + else if (posTypeID==1) // 度分秒 + { + string str_lat,str_lon; + angle.getDMSString(lon,lat,str_lon,str_lat); + SetDlgItemText(IDC_EDIT_LON,str_lon.c_str()); + SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str()); + } + } void CLonLatDlg::OnCancel() @@ -84,15 +97,17 @@ BOOL CLonLatDlg::OnInitDialog() m_CheckBox.SubclassDlgItem(IDC_CHECK1, this); m_CheckBox.SetCheck(BST_UNCHECKED); // 设置默认未选中状态 - m_isMouseMove = true; + m_isMouseMove = true; + m_coord_type.AddString(_T("度")); + m_coord_type.AddString(_T("度分秒")); + m_coord_type.SetCurSel(0); + lastTypeID = 0; return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } - - void CLonLatDlg::OnBnClickedConfirmBtn() { // TODO: 在此添加控件通知处理程序代码 @@ -108,6 +123,7 @@ void CLonLatDlg::OnBnClickedConfirmBtn() } +// ‘手动输入’单选框变化时触发函数 void CLonLatDlg::OnBnClickedCheck1() { // TODO: 在此添加控件通知处理程序代码 @@ -115,10 +131,71 @@ void CLonLatDlg::OnBnClickedCheck1() { // 复选框被选中 m_isMouseMove = false; + // 文本框设为可编辑 + m_lon_edit.SetReadOnly(FALSE); + m_lat_edit.SetReadOnly(FALSE); } else { // 复选框未选中 m_isMouseMove = true; + // 文本框设为只读 + m_lon_edit.SetReadOnly(TRUE); + m_lat_edit.SetReadOnly(TRUE); + } +} + + +// 坐标类型改变事件 +void CLonLatDlg::OnCbnSelchangeComboType() +{ + std::string splitSymbol = "EWNSs+\/-,;°度′'’分\""”秒、,; "; + CString strLat,strLon; + m_lat_edit.GetWindowTextA(strLat); + m_lon_edit.GetWindowTextA(strLon); + + posTypeID = m_coord_type.GetCurSel(); + //TRACE(_T("当前选择 %d\n"),posTypeID); + if (lastTypeID == posTypeID) //类型未改变,不执行坐标变换 + { + return; + } + else + { + lastTypeID = posTypeID; // 更新坐标方式 + } + + if (posTypeID==0) //度 + { + double tarLon,tarLat; + + vector 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; + angle.getDMSString(lon,lat,str_lon,str_lat); + + SetDlgItemText(IDC_EDIT_LON,str_lon.c_str()); + SetDlgItemText(IDC_EDIT_LAT,str_lat.c_str()); } } diff --git a/LonLatDlg.h b/LonLatDlg.h index 11c82b4..66eb2ee 100644 --- a/LonLatDlg.h +++ b/LonLatDlg.h @@ -1,9 +1,11 @@ #pragma once #include "resource.h" +#include "afxwin.h" +#include "angle.h" //功能:显示经度、纬度信息 -class CLonLatDlg : public CDialog +class CLonLatDlg : public CDialog //, public CBCGPDialog { DECLARE_DYNAMIC(CLonLatDlg) @@ -33,13 +35,21 @@ private: double m_lon; double m_lat; virtual void OnCancel(); - CRect m_rcDlgArea; - bool m_isMouseMove; CButton m_CheckBox; + int lastTypeID; //(上次选中的)坐标类型 1->度分秒,0->度 + int posTypeID; // 当前坐标类型 1->度分秒,0->度 + Angle angle; public: virtual BOOL OnInitDialog(); afx_msg void OnBnClickedConfirmBtn(); afx_msg void OnBnClickedCheck1(); + // 经度-文本框 + CEdit m_lon_edit; + // 纬度-文本框 + CEdit m_lat_edit; + afx_msg void OnCbnSelchangeComboType(); + // 坐标类型 + CComboBox m_coord_type; }; diff --git a/ModifyLinePointDlg.cpp b/ModifyLinePointDlg.cpp index 878982a..57b464a 100644 --- a/ModifyLinePointDlg.cpp +++ b/ModifyLinePointDlg.cpp @@ -96,9 +96,6 @@ void CModifyLinePointDlg::getDMSString(double lon,double lat,string &str_lon,str string str_lat_s = angle.DoubleToString(lat_s,4); string str_lon_s = angle.DoubleToString(lon_s,4); -/* - str_lon = angle.IntToString(lon_d) + splitSymbol + angle.IntToString(lon_m) + splitSymbol + str_lon_s; - str_lat = angle.IntToString(lat_d) + splitSymbol + angle.IntToString(lat_m) + splitSymbol + str_lat_s;*/ 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; } diff --git a/angle.cpp b/angle.cpp index bb356ae..1861e08 100644 --- a/angle.cpp +++ b/angle.cpp @@ -139,3 +139,20 @@ std::wstring Angle::String2WString(const std::string &s) return wstrResult; } +void Angle::getDMSString(double lon,double lat,string &str_lon,string &str_lat) +{ + std::string dSymbol = "°"; + std::string mSymbol = "′"; + std::string sSymbol = "\""; + int lon_d,lon_m,lat_d,lat_m; + double lon_s,lat_s; + DegtoDms(lon,lon_d,lon_m,lon_s); + DegtoDms(lat,lat_d,lat_m,lat_s); + + string str_lat_s = DoubleToString(lat_s,4); + string str_lon_s = DoubleToString(lon_s,4); + + str_lon = IntToString(lon_d) + dSymbol + IntToString(lon_m) + mSymbol + str_lon_s + sSymbol; + str_lat = IntToString(lat_d) + dSymbol + IntToString(lat_m) + mSymbol + str_lat_s + sSymbol; +} + diff --git a/angle.h b/angle.h index 834e24a..866a1c5 100644 --- a/angle.h +++ b/angle.h @@ -31,6 +31,8 @@ public: std::wstring String2WString(const std::string &s); // convert wstring to string std::string WString2String(const std::wstring &ws); - + // 经纬度转字符串度分秒 + void getDMSString(double lon,double lat,string &str_lon,string &str_lat); + }; diff --git a/resource.h b/resource.h index 9053467..614d514 100644 --- a/resource.h +++ b/resource.h @@ -143,6 +143,7 @@ #define IDD_DIALOG2 1049 #define IDD_SAVELINE 1049 #define IDC_BTN_CANCELEDIT 1049 +#define IDC_COMBO_TYPE_XY 1050 #define IDD_DIALOG_LIGHTREGION 1051 #define IDC_EDIT_MARKER_LON 1055 #define IDR_TOOLBAR3 1056 @@ -335,7 +336,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 1078 #define _APS_NEXT_COMMAND_VALUE 32907 -#define _APS_NEXT_CONTROL_VALUE 1050 +#define _APS_NEXT_CONTROL_VALUE 1051 #define _APS_NEXT_SYMED_VALUE 1000 #endif #endif