// OpTGD_3D_Dlg.cpp : implementation file // #include "stdafx.h" #include "geomative.h" #include "OpTGD_3D_Dlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern int g_iUILanguage; ///////////////////////////////////////////////////////////////////////////// // COpTGD_3D_Dlg dialog COpTGD_3D_Dlg::COpTGD_3D_Dlg(CWnd* pParent /*=NULL*/) : CDialog(COpTGD_3D_Dlg::IDD, pParent) { //{{AFX_DATA_INIT(COpTGD_3D_Dlg) m_Altitude = 0; //}}AFX_DATA_INIT } void COpTGD_3D_Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(COpTGD_3D_Dlg) DDX_Control(pDX, IDC_LAND_SIGN, m_LandSign); DDX_Control(pDX, IDC_EDIT, m_Edit); DDX_Control(pDX, IDC_TERRAIN_LIST, m_TerrainList); DDX_Text(pDX, IDC_Altitude, m_Altitude); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(COpTGD_3D_Dlg, CDialog) //{{AFX_MSG_MAP(COpTGD_3D_Dlg) ON_NOTIFY(NM_DBLCLK, IDC_TERRAIN_LIST, OnDblclkTerrainList) ON_EN_KILLFOCUS(IDC_EDIT, OnKillfocusEdit) ON_BN_CLICKED(IDC_ADD_DATA, OnAddData) ON_BN_CLICKED(IDC_COPY, OnCopy) ON_BN_CLICKED(IDC_CANCEL, OnCancel) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COpTGD_3D_Dlg message handlers BOOL COpTGD_3D_Dlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here //init member data m_Altitude = 0; m_column = 0; m_row = 0; m_sign = 0; m_DataList.RemoveAll(); m_Edit.ShowWindow(SW_HIDE); m_TerrainList.SetExtendedStyle(m_TerrainList.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); CString szTmp = _T(""); //初始化列 szTmp = "Altitude of pole"; m_TerrainList.InsertColumn(0,szTmp, 70,70); for (int n = 0; n < m_rect.right + 1; n++) { szTmp.Format("X%d", n); m_TerrainList.InsertColumn(n + 1,szTmp, 70,70); } //初始化行 for (int i = 0; i < m_rect.bottom + 1; i++) { szTmp.Format("Y%d", i); m_TerrainList.InsertItem(i, szTmp); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void COpTGD_3D_Dlg::OnDblclkTerrainList(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR; CRect rc; if(pNMListView->iItem!=-1) { m_row=pNMListView->iItem;//m_row为被选中行的行序号(int类型成员变量) m_column=pNMListView->iSubItem;//m_column为被选中行的列序号(int类型成员变量) m_TerrainList.GetSubItemRect(pNMListView->iItem, pNMListView->iSubItem,LVIR_LABEL,rc);//取得子项的矩形 rc.top+=41; rc.left+=18; rc.right+=18; rc.bottom+=45; CString szTmp = _T(""); szTmp = m_TerrainList.GetItemText(pNMListView->iItem, pNMListView->iSubItem); //编辑的表格必须要有内容,且第一列不能编辑 if (szTmp.GetLength() != 0 && szTmp.Left(1) != "Y") { m_Edit.SetWindowText(szTmp);//将子项的内容显示到编辑框中 m_Edit.ShowWindow(SW_SHOW);//显示编辑框 m_Edit.MoveWindow(&rc);//将编辑框移动到子项上面,覆盖在子项上 m_Edit.SetFocus();//使编辑框取得焦点 m_Edit.CreateSolidCaret(1,rc.Height()-5);//创建一个光标 m_Edit.ShowCaret();//显示光标 m_Edit.SetSel(0,-1);//使光标移到最后面 } } *pResult = 0; } void COpTGD_3D_Dlg::OnKillfocusEdit() { // TODO: Add your control notification handler code here CString str; m_Edit.GetWindowText(str);//取得编辑框的内容 if (str.GetLength() == 0) { str = _T("0"); } m_TerrainList.SetItemText(m_row,m_column,str);//将该内容更新到CListCtrl中 int nIndex = ( m_rect.right + 1) * m_row + (m_column - 1); m_DataList.SetAt(nIndex, str); m_Edit.ShowWindow(SW_HIDE);//隐藏编辑框 //把更新的数据替换m_datalist中的内容 } int COpTGD_3D_Dlg::GetLandSign() { return m_sign; } void COpTGD_3D_Dlg::OnOK() { // TODO: Add extra validation here if (m_DataList.GetSize() != ( (m_rect.right + 1) * (m_rect.bottom + 1 ) ) ) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("请输入所有的高度数据")); else MessageBoxEx(NULL, _T("Please input all the altitude data!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } int nId = m_LandSign.GetCurSel(); m_sign = m_LandSign.GetItemData(nId); CDialog::OnOK(); } void COpTGD_3D_Dlg::OnAddData() { // TODO: Add your control notification handler code here UpdateData(TRUE); CString szTmp = _T(""); szTmp.Format("%d", m_Altitude); int n = m_DataList.GetSize(); if (m_DataList.GetSize() < ( (m_rect.right + 1) * (m_rect.bottom + 1) ) ) { m_DataList.Add(szTmp); } ShowResult(); } void COpTGD_3D_Dlg::OnCopy() { // TODO: Add your control notification handler code here CString szTmp = _T(""); //复制时数据应满整行,否则用零填充 int nCount = 0; nCount = m_DataList.GetSize() % ( m_rect.right + 1 ); if (nCount != 0) { for (int n = 0; n < m_rect.right + 1 - nCount; n++) { szTmp = _T("0"); m_DataList.Add(szTmp); } } POSITION pos = m_TerrainList.GetFirstSelectedItemPosition(); if (pos != NULL) { while (pos) { int nItem = m_TerrainList.GetNextSelectedItem(pos); for (int n = 0; n < m_rect.right + 1; n++) { szTmp.Empty(); szTmp = m_TerrainList.GetItemText(nItem, n + 1); m_DataList.Add(szTmp); ShowResult(); } } } else { return; } } void COpTGD_3D_Dlg::SetRect(CRect rect) { m_rect.CopyRect(rect); } void COpTGD_3D_Dlg::ShowResult() { m_TerrainList.DeleteAllItems(); CString szTmp = _T(""); for (int n = 0; n < m_rect.bottom + 1; n++) { szTmp.Empty(); szTmp.Format("Y%d", n); m_TerrainList.InsertItem(n,szTmp); } int nRow = 0; //行从0开始 int nColumn = 1; //列从1开始 for (int i = 0; i < m_DataList.GetSize(); i++) { if (nColumn == m_rect.right + 2)//当列数等于矩形的横坐标时,数据换行显示 { nRow++; nColumn = 1; } m_TerrainList.SetItemText(nRow, nColumn, m_DataList.GetAt(i)); nColumn++; } } void COpTGD_3D_Dlg::OnCancel() { // TODO: Add your control notification handler code here CDialog::OnCancel(); } void COpTGD_3D_Dlg::InitData(CStringArray *f_array) { m_DataList.Copy(*f_array); ShowResult(); } int COpTGD_3D_Dlg::GetDataList(CStringArray *f_array) { f_array->Copy(m_DataList); return m_DataList.GetSize(); } BOOL COpTGD_3D_Dlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN) { return TRUE; } if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE) { return TRUE; } return CDialog::PreTranslateMessage(pMsg); }