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

📄 dlghitmiss.cpp

📁 用C++实现的数字图像处理各个算法源代码 我精心整理的 很难的啊 希望可以给大家带来帮助
💻 CPP
字号:
// DlgHitMiss.cpp : implementation file
//

#include "stdafx.h"
#include "dip.h"
#include "DlgHitMiss.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDlgHitMiss dialog


CDlgHitMiss::CDlgHitMiss(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgHitMiss::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgHitMiss)
		// NOTE: the ClassWizard will add member initialization here
	m_nStruH  = 2;
	m_nStruW  = 2;
	m_nStruXc = 1;
	m_nStruYc = 1;
	m_bStru00 = 0;
	m_bStru01 = 1;
	m_bStru02 = 0;
	m_bStru03 = 0;
	m_bStru04 = 0;
	m_bStru05 = 2;
	m_bStru06 = 1;
	m_bStru07 = 0;
	m_bStru08 = 0;
	m_bStru09 = 0;
	m_bStru10 = 0;
	m_bStru11 = 0;
	m_bStru12 = 0;
	m_bStru13 = 0;
	m_bStru14 = 0;
	m_bStru15 = 0;
	m_bStru16 = 0;
	m_bStru17 = 0;
	m_bStru18 = 0;
	m_bStru19 = 0;
	m_bStru20 = 0;
	m_bStru21 = 0;
	m_bStru22 = 0;
	m_bStru23 = 0;
	m_bStru24 = 0;
	//}}AFX_DATA_INIT
	m_nHmaskLen = 0;
	m_nMmaskLen = 0;
}


void CDlgHitMiss::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgHitMiss)
	DDX_Control(pDX, IDC_STRU00, m_ctrlStru00);
	DDX_Control(pDX, IDC_STRU01, m_ctrlStru01);
	DDX_Control(pDX, IDC_STRU02, m_ctrlStru02);
	DDX_Control(pDX, IDC_STRU03, m_ctrlStru03);
	DDX_Control(pDX, IDC_STRU04, m_ctrlStru04);
	DDX_Control(pDX, IDC_STRU05, m_ctrlStru05);
	DDX_Control(pDX, IDC_STRU06, m_ctrlStru06);
	DDX_Control(pDX, IDC_STRU07, m_ctrlStru07);
	DDX_Control(pDX, IDC_STRU08, m_ctrlStru08);
	DDX_Control(pDX, IDC_STRU09, m_ctrlStru09);
	DDX_Control(pDX, IDC_STRU10, m_ctrlStru10);
	DDX_Control(pDX, IDC_STRU11, m_ctrlStru11);
	DDX_Control(pDX, IDC_STRU12, m_ctrlStru12);
	DDX_Control(pDX, IDC_STRU13, m_ctrlStru13);
	DDX_Control(pDX, IDC_STRU14, m_ctrlStru14);
	DDX_Control(pDX, IDC_STRU15, m_ctrlStru15);
	DDX_Control(pDX, IDC_STRU16, m_ctrlStru16);
	DDX_Control(pDX, IDC_STRU17, m_ctrlStru17);
	DDX_Control(pDX, IDC_STRU18, m_ctrlStru18);
	DDX_Control(pDX, IDC_STRU19, m_ctrlStru19);
	DDX_Control(pDX, IDC_STRU20, m_ctrlStru20);
	DDX_Control(pDX, IDC_STRU21, m_ctrlStru21);
	DDX_Control(pDX, IDC_STRU22, m_ctrlStru22);
	DDX_Control(pDX, IDC_STRU23, m_ctrlStru23);
	DDX_Control(pDX, IDC_STRU24, m_ctrlStru24);
	DDX_Control(pDX, IDC_EDIT_STRU_YC_SPIN, m_ctrlStruYCSpin);
	DDX_Control(pDX, IDC_EDIT_STRU_XC_SPIN, m_ctrlStruXCSpin);
	DDX_Control(pDX, IDC_EDIT_STRU_W_SPIN, m_ctrlStruWSpin);
	DDX_Control(pDX, IDC_EDIT_STRU_H_SPIN, m_ctrlStruHSpin);
	DDX_Text(pDX, IDC_EDIT_STRU_H, m_nStruH);
	DDV_MinMaxInt(pDX, m_nStruH, 1, 5);
	DDX_Text(pDX, IDC_EDIT_STRU_W, m_nStruW);
	DDV_MinMaxInt(pDX, m_nStruW, 1, 5);
	DDX_Text(pDX, IDC_EDIT_STRU_XC, m_nStruXc);
	DDV_MinMaxInt(pDX, m_nStruXc, 0, 4);
	DDX_Text(pDX, IDC_EDIT_STRU_YC, m_nStruYc);
	DDV_MinMaxInt(pDX, m_nStruYc, 0, 4);
	DDX_Check(pDX, IDC_STRU00, m_bStru00);
	DDX_Check(pDX, IDC_STRU01, m_bStru01);
	DDX_Check(pDX, IDC_STRU02, m_bStru02);
	DDX_Check(pDX, IDC_STRU03, m_bStru03);
	DDX_Check(pDX, IDC_STRU04, m_bStru04);
	DDX_Check(pDX, IDC_STRU05, m_bStru05);
	DDX_Check(pDX, IDC_STRU06, m_bStru06);
	DDX_Check(pDX, IDC_STRU07, m_bStru07);
	DDX_Check(pDX, IDC_STRU08, m_bStru08);
	DDX_Check(pDX, IDC_STRU09, m_bStru09);
	DDX_Check(pDX, IDC_STRU10, m_bStru10);
	DDX_Check(pDX, IDC_STRU11, m_bStru11);
	DDX_Check(pDX, IDC_STRU12, m_bStru12);
	DDX_Check(pDX, IDC_STRU13, m_bStru13);
	DDX_Check(pDX, IDC_STRU14, m_bStru14);
	DDX_Check(pDX, IDC_STRU15, m_bStru15);
	DDX_Check(pDX, IDC_STRU16, m_bStru16);
	DDX_Check(pDX, IDC_STRU17, m_bStru17);
	DDX_Check(pDX, IDC_STRU18, m_bStru18);
	DDX_Check(pDX, IDC_STRU19, m_bStru19);
	DDX_Check(pDX, IDC_STRU20, m_bStru20);
	DDX_Check(pDX, IDC_STRU21, m_bStru21);
	DDX_Check(pDX, IDC_STRU22, m_bStru22);
	DDX_Check(pDX, IDC_STRU23, m_bStru23);
	DDX_Check(pDX, IDC_STRU24, m_bStru24);
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgHitMiss, CDialog)
	//{{AFX_MSG_MAP(CDlgHitMiss)
	ON_EN_KILLFOCUS(IDC_EDIT_STRU_H, OnKillfocusEditStruH)
	ON_EN_KILLFOCUS(IDC_EDIT_STRU_W, OnKillfocusEditStruW)
	ON_EN_KILLFOCUS(IDC_EDIT_STRU_XC, OnKillfocusEditStruXc)
	ON_EN_KILLFOCUS(IDC_EDIT_STRU_YC, OnKillfocusEditStruYc)
	ON_EN_CHANGE(IDC_EDIT_STRU_H, OnChangeEditStruH)
	ON_EN_CHANGE(IDC_EDIT_STRU_W, OnChangeEditStruW)
	ON_EN_CHANGE(IDC_EDIT_STRU_XC, OnChangeEditStruXc)
	ON_EN_CHANGE(IDC_EDIT_STRU_YC, OnChangeEditStruYc)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgHitMiss message handlers
void CDlgHitMiss::UpdateEdit()
{
	BOOL	bEnable = TRUE;
	
	//循环变量
	int		i;
	int		j;
	
	//设置文本框及其微调控件的状态
	(CEdit *) GetDlgItem(IDC_EDIT_STRU_H)->EnableWindow(bEnable);
	(CSpinButtonCtrl *) GetDlgItem(IDC_EDIT_STRU_H_SPIN)->EnableWindow(bEnable);
	(CEdit *) GetDlgItem(IDC_EDIT_STRU_W)->EnableWindow(bEnable);
	(CSpinButtonCtrl *) GetDlgItem(IDC_EDIT_STRU_W_SPIN)->EnableWindow(bEnable);
	(CEdit *) GetDlgItem(IDC_EDIT_STRU_XC)->EnableWindow(bEnable);
	(CSpinButtonCtrl *) GetDlgItem(IDC_EDIT_STRU_XC_SPIN)->EnableWindow(bEnable);
	(CEdit *) GetDlgItem(IDC_EDIT_STRU_YC)->EnableWindow(bEnable);
	(CSpinButtonCtrl *) GetDlgItem(IDC_EDIT_STRU_YC_SPIN)->EnableWindow(bEnable);
	
	//IDC_STRU00等ID其实是一个整数,它的数值定义在Resource.h中定义。
	
	int nMid = m_nStruYc * 5 + m_nStruXc;

	//设置模板元素文本框Enable状态
	for (i = IDC_STRU00; i <= IDC_STRU24; i++)
	{
		//设置检查框为可用状态
		(CButton *) GetDlgItem(i)->EnableWindow(bEnable);
	}
	
	//显示应该可用的结构元素检查框
	for (i = 0; i < m_nStruH; i++)
	{
		for (j = 0; j < m_nStruW; j++)
		{
			//设置检查框为可用状态
			(CButton *) GetDlgItem(IDC_STRU00 + i * 5 + j)->ShowWindow(SW_SHOW);
		}
	}

	//隐藏不可用状态的检查框(前m_nStruH行的后几列)
	for (i = 0; i < m_nStruH; i++)
	{
		for (j = m_nStruW; j < 5; j++)
		{
			//设置为不可用
			(CButton *) GetDlgItem(IDC_STRU00 + i * 5 + j)->ShowWindow(SW_HIDE);
		}
	}
	
	//隐藏应该不可见的模板元素文本框(后几行)
	for (i = m_nStruH; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
		{
			//设置为不可用
			(CButton *) GetDlgItem(IDC_STRU00 + i * 5 + j)->ShowWindow(SW_HIDE);
		}
	}

}

BOOL CDlgHitMiss::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	//设置微调控件的范围和伙伴编辑框

	m_ctrlStruWSpin.SetRange(1, 5);
	m_ctrlStruWSpin.SetBuddy( (CWnd* )GetDlgItem(IDC_EDIT_STRU_W));
	
	m_ctrlStruHSpin.SetRange(1, 5);
	m_ctrlStruHSpin.SetBuddy( (CWnd* )GetDlgItem(IDC_EDIT_STRU_H));
	
	m_ctrlStruXCSpin.SetRange(0, 4);
	m_ctrlStruXCSpin.SetBuddy( (CWnd* )GetDlgItem(IDC_EDIT_STRU_XC));

	m_ctrlStruYCSpin.SetRange(0, 4);
	m_ctrlStruYCSpin.SetBuddy( (CWnd* )GetDlgItem(IDC_EDIT_STRU_YC));
	
	UpdateEdit();
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDlgHitMiss::OnOK() 
{
	// 获取用户设置(更新)
	UpdateData(TRUE);
	
	// 判断设置是否有效
	if ((m_nStruW < 0) || (m_nStruXc > m_nStruW - 1) ||
		(m_nStruH < 0) || (m_nStruYc > m_nStruH - 1))
	{
		// 提示用户参数设置错误
		MessageBox("中心元素参数设置错误!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		
		// 返回
		return;
	}
	
	int Mask[200];

	m_nHmaskLen = 0;

	int i, j, k = 0;

	//根据对检查框的选择状态给结构元素赋值(记录的相应点的X,Y坐标)
	for(i = 0; i < m_nStruH; i++)
	{
		for(j = 0; j < m_nStruW; j++)
		{
			//IDC_STRU00等ID其实是一个整数,它的数值定义在Resource.h中定义。
			
			//获取相应检查框控件的指针
			CButton *pCheckBox = (CButton *) GetDlgItem(IDC_STRU00 + i * 5 + j);
			//检查框的状态
			if(pCheckBox->GetCheck() == 1)
			{
				//结构元素计数(以点数为计数单位)
				m_nHmaskLen++;
				Mask[k] = j - m_nStruXc;
				k++;
				Mask[k] = m_nStruYc - i;
				k++;
			}
		}
	}

	//创建记录结构元素的数组
	m_npHmask = new int [2 * m_nHmaskLen];

	//将统计出的结构元素拷贝到m_npMask指向的数组中
	memcpy(m_npHmask, Mask, 2 * m_nHmaskLen * sizeof(int));
	
	m_nMmaskLen = 0;

	k = 0;

	//根据对检查框的选择状态给结构元素赋值(记录的相应点的X,Y坐标)
	for(i = 0; i < m_nStruH; i++)
	{
		for(j = 0; j < m_nStruW; j++)
		{
			//IDC_STRU00等ID其实是一个整数,它的数值定义在Resource.h中定义。
			
			//获取相应检查框控件的指针
			CButton *pCheckBox = (CButton *) GetDlgItem(IDC_STRU00 + i * 5 + j);
			//检查框的状态
			if(pCheckBox->GetCheck() == 0)
			{
				//结构元素计数(以点数为计数单位)
				m_nMmaskLen++;
				Mask[k] = j - m_nStruXc;
				k++;
				Mask[k] = m_nStruYc - i;
				k++;
			}
		}
	}

	//创建记录结构元素的数组
	m_npMmask = new int [2 * m_nMmaskLen];

	//将统计出的结构元素拷贝到m_npMask指向的数组中
	memcpy(m_npMmask, Mask, 2 * m_nMmaskLen * sizeof(int));

	CDialog::OnOK();
}

void CDlgHitMiss::OnKillfocusEditStruH() 
{
	// 更新
	UpdateData(TRUE);
	
	// 更新文本框状态
	UpdateEdit();
}

void CDlgHitMiss::OnKillfocusEditStruW() 
{
	// 更新
	UpdateData(TRUE);
	
	// 更新文本框状态
	UpdateEdit();
}

void CDlgHitMiss::OnKillfocusEditStruXc() 
{
	// 更新
	UpdateData(TRUE);
	
	// 更新文本框状态
	UpdateEdit();
}

void CDlgHitMiss::OnKillfocusEditStruYc() 
{
	// 更新
	UpdateData(TRUE);
	
	// 更新文本框状态
	UpdateEdit();
}

void CDlgHitMiss::OnChangeEditStruH() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// 更新
	UpdateData(TRUE);
	
	// 更新文本框状态
	UpdateEdit();

}

void CDlgHitMiss::OnChangeEditStruW() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// 更新
	UpdateData(TRUE);
	
	// 更新文本框状态
	UpdateEdit();
}

void CDlgHitMiss::OnChangeEditStruXc() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// 更新
	UpdateData(TRUE);
	
	// 更新文本框状态
	UpdateEdit();
}

void CDlgHitMiss::OnChangeEditStruYc() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
}

⌨️ 快捷键说明

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