Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

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);
}