305 lines
6.7 KiB
C++
305 lines
6.7 KiB
C++
// 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);
|
|
}
|