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

📄 classifyinfodlg.cpp

📁 基于小波的SAR斑点处理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ClassifyInfoDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RSIP.h"
#include "ClassifyInfoDlg.h"
#include "RSIPView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CClassifyInfoDlg dialog

CClassifyInfoDlg::CClassifyInfoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CClassifyInfoDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CClassifyInfoDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_pView = (CRSIPView *)pParent;

	m_aClassifyInfoArray.RemoveAll();
	m_aIDList.RemoveAll();

	m_nResult = -1;
	m_nResultID = -1;
}

CClassifyInfoDlg::~CClassifyInfoDlg()
{
	/*
	CRsThematicInfo * pRSClassInfo;
	for(int i=0; i<m_aClassifyInfoArray.GetSize(); i++)
	{
		pRSClassInfo = (CRSClassInfo *)m_aClassifyInfoArray.GetAt(i);
		delete pRSClassInfo;
	}
	m_aClassifyInfoArray.RemoveAll();
	*/
	int *pInt = NULL;
	for(int i=0; i<m_aIDList.GetSize(); i++)
	{
		pInt = (int *)m_aIDList.GetAt(i);
		ASSERT(pInt != NULL);
		delete pInt;
		pInt = NULL;

		pInt = (int *)m_aClassList.GetAt(i);
		ASSERT(pInt != NULL);
		delete pInt;
		pInt = NULL;
	}
	m_aIDList.RemoveAll();
	m_aClassList.RemoveAll();
}

void CClassifyInfoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CClassifyInfoDlg)
	DDX_Control(pDX, IDC_CLASSINFOLIST, m_ClassifyInfoList);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CClassifyInfoDlg, CDialog)
	//{{AFX_MSG_MAP(CClassifyInfoDlg)
	ON_BN_CLICKED(IDC_RESET, OnReset)
	ON_BN_CLICKED(IDC_COMBINE, OnCombine)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CClassifyInfoDlg message handlers

BOOL CClassifyInfoDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	Refresh();
	
	return TRUE;
}
void CClassifyInfoDlg::Refresh()
{
	m_ClassifyInfoList.DeleteAllItems();

	m_ClassifyInfoList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
	
	m_ClassifyInfoList.InsertColumn( 1 , "类名", LVCFMT_LEFT, 140 ,0 );
	m_ClassifyInfoList.InsertColumn( 2 , "ID值", LVCFMT_LEFT, 100 ,0 );
	m_ClassifyInfoList.InsertColumn( 3 , "颜色", LVCFMT_LEFT, 100 ,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_ClassifyInfoList.SetImageList(pimagelist,LVSIL_SMALL);

	CRsThematicInfo * pRSClassInfo;
	COLORREF clrColor;
	for(int i=0; i<m_aClassifyInfoArray.GetSize(); i++)
	{
		pRSClassInfo = (CRSClassInfo *)m_aClassifyInfoArray.GetAt(i);
		
		LV_ITEM Item;
		Item.pszText = new char[64];
		
		Item.mask = LVIF_IMAGE | LVIF_TEXT ;
		Item.iItem = i;
		Item.iSubItem = 0;
		Item.state = 0;
		Item.stateMask = 0;
		Item.iImage = 0;
		Item.cchTextMax = 0;
		strcpy(Item.pszText , pRSClassInfo->m_szClassName);
		//if(nOrder == m_RsClassInfoFile.m_nClassCount-1)
		//	m_ClassifyInfoList.InsertItem( &Item );
		//else
		m_ClassifyInfoList.InsertItem( &Item );

		Item.mask = LVIF_TEXT ;
		Item.iSubItem = 1;
		sprintf(Item.pszText,"%2d",pRSClassInfo->m_nValue);
		m_ClassifyInfoList.SetItem( &Item  );
	
		Item.iSubItem = 2;
		clrColor = pRSClassInfo->m_clrColor;
		sprintf(Item.pszText,"(%3d,%3d,%3d)",GetRValue(clrColor),
			GetGValue(clrColor),
			GetBValue(clrColor));
		m_ClassifyInfoList.SetItem( &Item  );

		delete Item.pszText;
	}
}

void CClassifyInfoDlg::OnReset()
{
	CRsThematicInfo * pRSClassInfo;
	POSITION nSelect = m_ClassifyInfoList.GetFirstSelectedItemPosition();
	while(nSelect)
	{
		// 取信息
		int nSelected = m_ClassifyInfoList.GetNextSelectedItem(nSelect);
		pRSClassInfo = (CRSClassInfo *)m_aClassifyInfoArray.GetAt(nSelected);
		ASSERT(pRSClassInfo != NULL);

		// 显示信息供修改
		CClassInfoResetDlg resetDlg;
		resetDlg.m_szName = pRSClassInfo->m_szClassName;
		resetDlg.m_nID = pRSClassInfo->m_nValue;
		resetDlg.m_nRed = GetRValue(pRSClassInfo->m_clrColor);
		resetDlg.m_nGreen = GetGValue(pRSClassInfo->m_clrColor);
		resetDlg.m_nBlue = GetBValue(pRSClassInfo->m_clrColor);

		// 内存中修改信息
		if(resetDlg.DoModal() == IDOK)
		{
			pRSClassInfo->m_szClassName = resetDlg.m_szName;
			pRSClassInfo->m_nValue = resetDlg.m_nID;
			pRSClassInfo->m_clrColor = RGB(resetDlg.m_nRed,resetDlg.m_nGreen,resetDlg.m_nBlue);
		}

		// 显示修改结果
		LV_ITEM Item;
		Item.pszText = new char[64];

		Item.mask = LVIF_IMAGE | LVIF_TEXT ;
		Item.iItem = nSelected;
		Item.iSubItem = 0;
		Item.state = 0;
		Item.stateMask = 0;
		Item.iImage = 0;
		Item.cchTextMax = 0;
		strcpy(Item.pszText , pRSClassInfo->m_szClassName);
		m_ClassifyInfoList.SetItem( &Item );

		Item.mask = LVIF_TEXT ;
		Item.iSubItem = 1;
		sprintf(Item.pszText,"%2d",pRSClassInfo->m_nValue);
		m_ClassifyInfoList.SetItem( &Item  );
	
		Item.iSubItem = 2;
		COLORREF clrColor = pRSClassInfo->m_clrColor;
		sprintf(Item.pszText,"(%3d,%3d,%3d)",GetRValue(clrColor),
			GetGValue(clrColor),
			GetBValue(clrColor));
		m_ClassifyInfoList.SetItem( &Item  );


		delete Item.pszText;
	}
}

void CClassifyInfoDlg::OnCombine()
{
	CCombineClassDlg combineClassDlg(this);
	CRsThematicInfo * pRSClassInfo;

	POSITION nSelect = m_ClassifyInfoList.GetFirstSelectedItemPosition();
	while(nSelect)
	{
		// 取信息
		int nSelected = m_ClassifyInfoList.GetNextSelectedItem(nSelect);
		pRSClassInfo = (CRSClassInfo *)m_aClassifyInfoArray.GetAt(nSelected);
		ASSERT(pRSClassInfo != NULL);

		// 给“合并类别”窗口赋初始信息;
		// 同时给后面的“合并”操作准备信息;
		// 内存释放在本类中进行。
		int * pInt1 = (int *)new int;
		*pInt1 = pRSClassInfo->m_nValue;
		combineClassDlg.m_aIDs.Add(pInt1);	// 不释放内存
		m_aIDList.Add(pInt1);

		// 给后面的“修改类别信息”操作准备信息;
		// 内存释放在本类中进行。
		int * pInt2 = (int *)new int;
		*pInt2 = nSelected;
		m_aClassList.Add(pInt2);
	}

	// 获取合并后的ID值和类的序号
	if(combineClassDlg.DoModal() == IDOK)
	{
		m_nResult = combineClassDlg.m_nResult;
		m_nResultID = combineClassDlg.m_nResultID;

		// 从需要归并的类中剔除保留的类
		int * p = (int *)m_aIDList.GetAt(m_nResult);	// ID值
		delete p;
		m_aIDList.RemoveAt(m_nResult);
		p = (int *)m_aClassList.GetAt(m_nResult);		// 序号
		delete p;
		m_aClassList.RemoveAt(m_nResult);

		// 更新专题图数据
		BYTE * pData = m_pView->GetDocument()->m_pRSImage->m_pImgData;
		int height = m_pView->GetDocument()->m_pRSImage->m_nImgHeight;
		int width = m_pView->GetDocument()->m_pRSImage->m_nImgWidth;
		BOOL flag = FALSE;
		for(int i = 0; i<height; i++)
			for(int j=0; j<width; j++)
			{
				for(int k=0; k<m_aIDList.GetSize(); k++)
				{
					int *pp = (int *)m_aIDList.GetAt(k);
					if(pData[i*width+j] == *pp)
					{
						pData[i*width+j] = m_nResultID;
						break;
					}
				}
			}

		// 更新类别信息(去除转变为其他类的类别信息)
		for(int l=m_aClassList.GetSize()-1; l>=0; l--)
		{
			int * ppp = (int *)m_aClassList.GetAt(l);
			pRSClassInfo = (CRSClassInfo *)m_aClassifyInfoArray.GetAt(*ppp);
			ASSERT(pRSClassInfo != NULL);
			delete pRSClassInfo;

			m_aClassifyInfoArray.RemoveAt(*ppp);
			m_pView->GetDocument()->m_pRSImage->m_aThemeInfoArray.RemoveAt(*ppp);
		}

		// 更新类别信息的显示
		Refresh();

		// 刷新专题图显示
		m_pView->GetDocument()->UpdateAllViews(NULL);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CClassInfoDlg1 dialog


CClassInfoDlg1::CClassInfoDlg1(CWnd* pParent /*=NULL*/)
	: CDialog(CClassInfoDlg1::IDD, pParent)
{
	//{{AFX_DATA_INIT(CClassInfoDlg1)
	m_nClassID = 0;
	m_nMethod = -1;
	//}}AFX_DATA_INIT
	m_nPntCount = 0;
	m_pPointArray = NULL;

	m_nPntNumber = 0;
	m_pPntArray = NULL;

	m_nCurrentIndex = 0;
	m_bChange = FALSE;
	m_pView = (CRSIPView *)pParent;
	m_pRSClassifyInfoFile = new CRSClassifyInfoFile();

	Initial();
}

void CClassInfoDlg1::Initial()
{
	m_pRSClassifyInfoFile->m_nImageCount = m_pView->GetDocument()->m_pRSImage->m_nLinkedImage;
	m_pRSClassifyInfoFile->m_nImageHeight = m_pView->GetDocument()->m_pRSImage->m_nImgHeight;
	m_pRSClassifyInfoFile->m_nImageWidth = m_pView->GetDocument()->m_pRSImage->m_nImgWidth;
	
	CString * pszTemp;
	CString * pszTmp;
	for(int j=0; j<m_pRSClassifyInfoFile->m_nImageCount; j++)
	{
		pszTemp = (CString *)m_pView->GetDocument()->m_pRSImage->m_aLinkedImageNameArray.GetAt(j);
		pszTmp = new CString();
		*pszTmp = *pszTemp;
		m_pRSClassifyInfoFile->m_aImageNameArray.Add(pszTmp);
	}
}

CClassInfoDlg1::~CClassInfoDlg1()
{
	if(m_pRSClassifyInfoFile != NULL)
	{
		delete m_pRSClassifyInfoFile;
		m_pRSClassifyInfoFile = NULL;
	}
}
void CClassInfoDlg1::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CClassInfoDlg1)
	DDX_Control(pDX, IDC_CLASSNAMELIST, m_ClassNameList);
	DDX_Text(pDX, IDC_CLASSID, m_nClassID);
	DDV_MinMaxInt(pDX, m_nClassID, 0, 255);
	DDX_Radio(pDX, IDC_NEWCLASS, m_nMethod);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CClassInfoDlg1, CDialog)
	//{{AFX_MSG_MAP(CClassInfoDlg1)
	ON_BN_CLICKED(IDC_NEWCOLOR, OnNewcolor)
	ON_BN_CLICKED(IDC_NEWCLASS, OnNewclass)
	ON_BN_CLICKED(IDC_EXISTCLASS, OnExistclass)
	ON_CBN_SELCHANGE(IDC_CLASSNAMELIST, OnSelchangeClassnamelist)
	ON_WM_PAINT()
	ON_EN_CHANGE(IDC_CLASSCOLORRED, OnChangeClassColor)
	ON_BN_CLICKED(IDC_SAVECLASSINFO, OnSaveclassinfo)
	ON_EN_CHANGE(IDC_CLASSCOLORGREEN, OnChangeClassColor)
	ON_EN_CHANGE(IDC_CLASSCOLORBLUE, OnChangeClassColor)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CClassInfoDlg1 message handlers

BOOL CClassInfoDlg1::OnInitDialog() 
{
	CDialog::OnInitDialog();

	GetDlgItem(IDC_SAVECLASSINFO)->EnableWindow(FALSE);
	GetDlgItem(IDC_NEWCLASS)->EnableWindow(TRUE);
	GetDlgItem(IDC_EXISTCLASS)->EnableWindow(TRUE);

	m_ClassNameList.ResetContent();
	if(m_pRSClassifyInfoFile != NULL)
	{
		CRSClassInfo * pTemp=NULL;
		CString pszTemp;
		int num = m_pRSClassifyInfoFile->m_aClassInfoArray.GetSize();
		if(num != 0)
		{
			for(int i=0; i<num; i++)
			{
				pTemp = (CRSClassInfo *)m_pRSClassifyInfoFile->m_aClassInfoArray.GetAt(i);
				pszTemp = pTemp->m_szClassName;
				m_ClassNameList.AddString(pszTemp);
			}
			m_ClassNameList.SetCurSel(m_nCurrentIndex);

			pTemp = (CRSClassInfo *)m_pRSClassifyInfoFile->m_aClassInfoArray.GetAt(m_nCurrentIndex);
			m_nClassID = pTemp->m_nValue;
			m_clrColor = pTemp->m_clrColor;
			m_bChange = TRUE;
			SetDlgItemInt(IDC_CLASSID,m_nClassID);
			SetDlgItemInt(IDC_CLASSCOLORRED,GetRValue(m_clrColor));
			SetDlgItemInt(IDC_CLASSCOLORGREEN,GetGValue(m_clrColor));
			SetDlgItemInt(IDC_CLASSCOLORBLUE,GetBValue(m_clrColor));
			m_bChange = FALSE;

			RECT Rect;
			SetRect(&Rect,86,99,113,125);
			MapDialogRect(&Rect);
			InvalidateRect(&Rect);
		}
	}

	return TRUE;
}

void CClassInfoDlg1::OnNewcolor() 
{
	CColorDialog ColorDlg(m_clrColor,CC_RGBINIT,this);
	if(ColorDlg.DoModal() == IDOK)
	{
		m_clrColor = ColorDlg.GetColor();
		m_bChange = TRUE;
		SetDlgItemInt(IDC_CLASSCOLORRED,GetRValue(m_clrColor));
		SetDlgItemInt(IDC_CLASSCOLORGREEN,GetGValue(m_clrColor));
		SetDlgItemInt(IDC_CLASSCOLORBLUE,GetBValue(m_clrColor));
		m_bChange = FALSE;

		((CRSClassInfo *)(m_pRSClassifyInfoFile->m_aClassInfoArray.GetAt(m_nCurrentIndex)))->m_clrColor = m_clrColor;

		RECT Rect;
		SetRect(&Rect,86,99,113,125);
		MapDialogRect(&Rect);
		
		InvalidateRect(&Rect);
	}
}

void CClassInfoDlg1::OnNewclass() 
{
	m_nMethod = 0;

	bool Flag = FALSE;
	int nClassCount;
	CRSClassInfo * pTemp;

	nClassCount = m_pRSClassifyInfoFile->m_aClassInfoArray.GetSize();
	for(int i=0; ; i++)
	{
		for(int j=0; j<nClassCount; j++)
		{
			pTemp = (CRSClassInfo *)m_pRSClassifyInfoFile->m_aClassInfoArray.GetAt(j);
			Flag = Flag || (i == pTemp->m_nValue);
		}
		if(Flag == TRUE)
			Flag = FALSE;
		else
		{
			SetDlgItemInt(IDC_CLASSID,i);
			break;
		}
	}
	m_ClassNameList.AddString("");
	m_ClassNameList.SetCurSel(nClassCount);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -