⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pickgcpdlg.cpp

📁 基于小波的SAR斑点处理
💻 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 + -