📄 pickgcpdlg.cpp
字号:
// PickGCPDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RSIP.h"
#include "PickGCPDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPickGCPDlg dialog
CPickGCPDlg::CPickGCPDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPickGCPDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPickGCPDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_pView = (CView *)pParent;
}
void CPickGCPDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPickGCPDlg)
DDX_Control(pDX, IDC_LIST1, m_GCPsList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPickGCPDlg, CDialog)
//{{AFX_MSG_MAP(CPickGCPDlg)
ON_BN_CLICKED(IDC_REMOVEGCP, OnRemovegcp)
ON_BN_CLICKED(IDC_LOADCORFROMFILE, OnLoadcorfromfile)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPickGCPDlg message handlers
void CPickGCPDlg::OnOK()
{
if(m_Tics.m_dwTicsNumber < 6)
{
MessageBox("没有选择足够的地面控制点,其数目至少为6个!");
return;
}
CFileDialog fileDlg(FALSE,"*.GCP",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"GCPs Files(*.gcp)|*.gcp||",this);
if(fileDlg.DoModal() == IDOK)
{
CFile File;
if(0 == File.Open(fileDlg.GetPathName(),CFile::modeCreate|CFile::modeWrite))
{
MessageBox("不能创建文件!");
return;
}
File.Write(&m_nImageWidth,sizeof(int));
File.Write(&m_nImageHeight,sizeof(int));
m_Tics.WriteTo(File);
File.Close();
}
m_pView->PostMessage(WM_COMMAND,IDC_END_PICKGCP,0L);
//CDialog::OnOK();
}
void CPickGCPDlg::OnCancel()
{
m_pView->PostMessage(WM_COMMAND,IDC_END_PICKGCP,0L);
//CDialog::OnCancel();
}
void CPickGCPDlg::OnRemovegcp()
{
POSITION pos = m_GCPsList.GetFirstSelectedItemPosition();
if (pos == NULL)
{
MessageBox("须先选取欲删除的地面控制点!");
return;
}
else
{
// 弄清选择了那些地面控制点
int * pIndex = (int *)new int[m_GCPsList.GetItemCount()];
int dex = 0;
while (pos)
{
int nItem = m_GCPsList.GetNextSelectedItem(pos);
pIndex[dex] = nItem;
dex++;
}
for(int i=dex-1; i>=0; i--)
{
// 从视图中删除地面控制点
m_GCPsList.DeleteItem(pIndex[i]);
// 从内存中删除地面控制点
m_Tics.RemoveTic(pIndex[i]);
}
m_pView->PostMessage(WM_COMMAND,IDC_REFRESH,0L);
m_pView->PostMessage(WM_COMMAND,IDC_DRAWGCP,0L);
delete pIndex;
}
}
void CPickGCPDlg::OnLoadcorfromfile()
{
CFileDialog fileDlg(TRUE,"*.GCP",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"GCPs Files(*.gcp)|*.gcp||",this);
if(fileDlg.DoModal() == IDOK)
{
// 读数据
CFile File;
if(0 == File.Open(fileDlg.GetPathName(),CFile::modeRead))
{
MessageBox("不能打开文件!");
return;
}
File.Read(&m_nImageWidth,sizeof(int));
File.Read(&m_nImageHeight,sizeof(int));
m_Tics.ReadFrom(File);
File.Close();
// 显示数据
CGisPoint ptMapPoint, ptGeoPoint;
for(DWORD i=0; i<m_Tics.m_dwTicsNumber; i++)
{
m_Tics.GetPoints(i,ptMapPoint,ptGeoPoint);
AddTicToListCtrl(i,ptMapPoint,ptGeoPoint);
}
m_pView->PostMessage(WM_COMMAND,IDC_REFRESH,0L);
m_pView->PostMessage(WM_COMMAND,IDC_DRAWGCP,0L);
}
}
BOOL CPickGCPDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_GCPsList.InsertColumn( 1 , "影像坐标", LVCFMT_LEFT, 100 ,0 );
m_GCPsList.InsertColumn( 2 , "地理坐标", LVCFMT_LEFT, 140 ,0 );
CImageList *pimagelist;
pimagelist = new CImageList();
HICON hIcon;
pimagelist->Create(16, 16, TRUE/*bMask*/, 1, 1);
hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
pimagelist->Add(hIcon);
m_GCPsList.SetImageList(pimagelist,LVSIL_SMALL);
m_GCPsList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
return TRUE;
}
void CPickGCPDlg::OnDestroy()
{
CImageList *pimagelist;
pimagelist = m_GCPsList.GetImageList(LVSIL_SMALL);
pimagelist->DeleteImageList();
delete pimagelist;
CDialog::OnDestroy();
}
void CPickGCPDlg::AddTicPoint(const CGisPoint &ptMapPoint,const CGisPoint &ptGeoPoint)
{
m_Tics.AddTic(ptMapPoint, ptGeoPoint);
AddTicToListCtrl(m_Tics.m_dwTicsNumber-1,ptMapPoint,ptGeoPoint);
m_pView->PostMessage(WM_COMMAND,IDC_DRAWGCP,0L);
}
void CPickGCPDlg::AddTicToListCtrl(DWORD order,const CGisPoint &ptMapPoint,const CGisPoint &ptGeoPoint)
{
LV_ITEM Item;
Item.pszText = new char[64];
Item.mask = LVIF_IMAGE | LVIF_TEXT ;
Item.iItem = order;
Item.iSubItem = 0;
Item.state = 0;
Item.stateMask = 0;
Item.iImage = 0;
Item.cchTextMax = 0;
sprintf(Item.pszText , "(%d,%d)",(int)ptMapPoint.x,(int)ptMapPoint.y);
m_GCPsList.InsertItem( &Item );
Item.mask = LVIF_TEXT ;
Item.iSubItem = 1;
sprintf(Item.pszText,"(%.3f,%.3f)",ptGeoPoint.x,ptGeoPoint.y);
m_GCPsList.SetItem( &Item );
delete Item.pszText;
}
/////////////////////////////////////////////////////////////////////////////
// CInputCoordDlg dialog
CInputCoordDlg::CInputCoordDlg(CWnd* pParent /*=NULL*/)
: CDialog(CInputCoordDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CInputCoordDlg)
m_nCoordOrigin = 0;
m_nCoordType = 0;
m_nGCPID = 0;
m_nImageX = 0;
m_nImageY = 0;
m_dMapX = 0.0;
m_dMapY = 0.0;
//}}AFX_DATA_INIT
}
void CInputCoordDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInputCoordDlg)
DDX_Radio(pDX, IDC_COORDORIGIN_UPLEFT, m_nCoordOrigin);
DDX_Radio(pDX, IDC_COORDTYPE_BL, m_nCoordType);
DDX_Text(pDX, IDC_GCP_ID, m_nGCPID);
DDX_Text(pDX, IDC_IMAGE_X, m_nImageX);
DDX_Text(pDX, IDC_IMAGE_Y, m_nImageY);
DDX_Text(pDX, IDC_MAP_X, m_dMapX);
DDX_Text(pDX, IDC_MAP_Y, m_dMapY);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInputCoordDlg, CDialog)
//{{AFX_MSG_MAP(CInputCoordDlg)
ON_BN_CLICKED(IDC_MAPCORFLAG, OnMapcorflag)
ON_BN_CLICKED(IDC_COORDTYPE_BL, OnCoordtypeBl)
ON_BN_CLICKED(IDC_COORDTYPE_USER, OnCoordtypeUser)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInputCoordDlg message handlers
BOOL CInputCoordDlg::OnInitDialog()
{
CDialog::OnInitDialog();
GetDlgItem(IDC_COORDORIGIN_UPLEFT)->EnableWindow(FALSE);
GetDlgItem(IDC_COORDORIGIN_BOTTOMLEFT)->EnableWindow(FALSE);
if(m_nGCPID == 1)
GetDlgItem(IDC_MAPCORFLAG)->EnableWindow(TRUE);
else
GetDlgItem(IDC_MAPCORFLAG)->EnableWindow(FALSE);
ExpandDialog(IDC_DIVIDE,FALSE);
return TRUE;
}
void CInputCoordDlg::OnOK()
{
UpdateData();
if(m_nCoordType == 0) //Geography coor.
{
if(m_dMapY>90 || m_dMapY<-90 || m_dMapX>180 || m_dMapX<-180)
{
MessageBox("经纬度地理坐标输入错误!");
return;
}
}
CDialog::OnOK();
}
void CInputCoordDlg::OnMapcorflag()
{
static BOOL bExpand = TRUE;
ExpandDialog(IDC_DIVIDE,bExpand);
bExpand = !bExpand;
}
void CInputCoordDlg::OnCoordtypeBl()
{
GetDlgItem(IDC_COORDORIGIN_UPLEFT)->EnableWindow(FALSE);
GetDlgItem(IDC_COORDORIGIN_BOTTOMLEFT)->EnableWindow(FALSE);
}
void CInputCoordDlg::OnCoordtypeUser()
{
GetDlgItem(IDC_COORDORIGIN_UPLEFT)->EnableWindow(TRUE);
GetDlgItem(IDC_COORDORIGIN_BOTTOMLEFT)->EnableWindow(TRUE);
CheckRadioButton(IDC_COORDORIGIN_UPLEFT,IDC_COORDORIGIN_BOTTOMLEFT,IDC_COORDORIGIN_UPLEFT);
}
void CInputCoordDlg::EnableVisibleChildren()
{
CWnd *pWndCtrl = GetWindow(GW_CHILD);
CRect rcTest;
CRect rcControl;
CRect rcShow;
GetWindowRect(&rcShow);
while(pWndCtrl != NULL)
{
pWndCtrl->GetWindowRect(&rcControl);
if(rcControl.IntersectRect(rcShow,rcControl))
pWndCtrl->EnableWindow(TRUE);
else
pWndCtrl->EnableWindow(FALSE);
pWndCtrl = pWndCtrl->GetWindow(GW_HWNDNEXT);
}
if(IsDlgButtonChecked(IDC_COORDTYPE_BL))
{
GetDlgItem(IDC_COORDORIGIN_UPLEFT)->EnableWindow(FALSE);
GetDlgItem(IDC_COORDORIGIN_BOTTOMLEFT)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_COORDORIGIN_UPLEFT)->EnableWindow(TRUE);
GetDlgItem(IDC_COORDORIGIN_BOTTOMLEFT)->EnableWindow(TRUE);
}
if(m_nGCPID == 1)
GetDlgItem(IDC_MAPCORFLAG)->EnableWindow(TRUE);
else
GetDlgItem(IDC_MAPCORFLAG)->EnableWindow(FALSE);
}
void CInputCoordDlg::ExpandDialog(int nResourceID,BOOL bExpand)
{
//Expand the dialog if bExpand is TRUE
static CRect rcLarge;
static CRect rcSmall;
CString sExpand;
if(rcLarge.IsRectNull())
{
CRect rcLandmark;
CWnd * pWndLandmark = GetDlgItem(nResourceID);
ASSERT(pWndLandmark);
GetWindowRect(&rcLarge);
pWndLandmark->GetWindowRect(&rcLandmark);
rcSmall = rcLarge;
rcSmall.bottom = rcLandmark.top;
}
if(bExpand)
{
//Expand the dialog
SetWindowPos(NULL,0,0,rcLarge.Width(),rcLarge.Height(),
SWP_NOMOVE|SWP_NOZORDER);
sExpand = "<<收缩";
}
else
{
//Expand the dialog
SetWindowPos(NULL,0,0,rcSmall.Width(),rcSmall.Height(),
SWP_NOMOVE|SWP_NOZORDER);
sExpand = "展开>>";
}
EnableVisibleChildren();
SetDlgItemText(IDC_MAPCORFLAG,sExpand);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -