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

📄 zhdlg.cpp

📁 简单的手写识别程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}
	ReleaseDC(pDC );
	DeleteObject(pOldBrush);
	DeleteObject(Rgn);
	DeleteObject(Brush);
	CDialog::OnMouseMove(nFlags, point);
}


/*void CZhDlg::getzd(CPoint p[300],int i)
{
//	CPoint zz,zy,zs,zx;
	int ds;
	zz=zy=zs=zx=p[0];
	ds=i;
	for(i=0;i<ds;i++)
		if(p[i].x<zz.x) zz=p[i];
		if(p[i].x>zy.x) zy=p[i];
		if(p[i].y<zx.y) zx=p[i];
		if(p[i].y>zs.y) zs=p[i];


}*/

void CZhDlg::OnChangeEdit1() 
{
	// 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.
	
	// TODO: Add your control notification handler code here
	
}

void CZhDlg::OnButton1() //清除按纽
{
	// TODO: Add your control notification handler code here
    CBrush Brush (RGB (255, 255 , 255) );
	CDC *pDC=GetDC();
	CBrush* pOldBrush = pDC->SelectObject (&Brush);
	pDC->Rectangle(Startx,Starty,Startx+wid-1,Starty+lon-1);
	arch=arcs=arcp=arcn=arcz=0;
	m_counting.SetPos(0);
	m_showa.DeleteAllItems();
	m_showb.DeleteAllItems();
	m_hzs.SetWindowText("");
	for(i=0;i<m;i++)
		zi[i]="";
	m=0;

	fat=0;
	for(i=0;i<allnum;i++)
	{
		alldata[i].x=0;
		alldata[i].y=0;
	}
	mouseDown=0;
	
}

void CZhDlg::OnChangeEdit2() 
{
	// 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.
	
	// TODO: Add your control notification handler code here
	
}

void CZhDlg::OnOutofmemorySpin1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	
	*pResult = 0;
}

void CZhDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	m_hzs.SetWindowText("");
	int   nLength= m_hzs.SendMessage(WM_GETTEXTLENGTH);
	int iItem; 
	iItem=m_showa.GetNextItem(-1,LVNI_SELECTED); 
	CString hz   =   m_showa.GetItemText(  iItem, 0);
	hz=hz.Right(2);
	m_hzs.SetSel(nLength,nLength);
	m_hzs.ReplaceSel(hz);

	CBrush Brush (RGB (255, 255 , 255) );
	CDC *pDC=GetDC();
	CBrush* pOldBrush = pDC->SelectObject (&Brush);
	pDC->Rectangle(Startx,Starty,Startx+wid-1,Starty+lon-1);
	arch=arcs=arcp=arcn=arcz=0;
	m_counting.SetPos(0);

	for(i=0;i<m;i++)
		zi[i]="";
	m=0;

	fat=0;
	for(i=0;i<allnum;i++)
	{
		alldata[i].x=0;
		alldata[i].y=0;
	}
	mouseDown=0;
	
	*pResult = 0;
}

void CZhDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	getzi(bihua,arch,arcs,arcp,arcn,arcz);
	int dim=0;//循环的是第几个字
	if(m>=2)
	{
		m_showa.DeleteAllItems();
		CBrush brushWhite(RGB(255, 255, 255));
		CBrush brushBlue(RGB(0, 0, 255));
		CBrush brushRed(RGB(255, 0, 0));
		CBrush brushGreen(RGB(0, 255, 0)); //画刷的定义	
		CDC *pDC=GetDC();
		CBrush* pOldBrush = pDC->SelectObject (&brushWhite);
		pDC->Rectangle(Startx,Starty,Startx+wid-1,Starty+lon-1);
		CRgn Rgn;
		Rgn.CreateRectRgn(Startx,Starty,Startx+wid-1,Starty+lon-1);  //创建一个矩形区域
		pDC->SelectClipRgn(&Rgn);   //为指定设备场景选择新的剪裁区
		int distan,kuan;
		float ratio;
		min.x=allzz.x;min.y=allzx.y;max.x=allzy.x;max.y=allzs.y;
		if((max.x-min.x)>(max.y-min.y))
		{
			kuan=max.x-min.x;
			distan=((max.x-min.x)-(max.y-min.y))/2;
			min.y=min.y-distan;
			max.y=max.y+distan;
		}
		else
		{
			kuan=max.y-min.y;
			distan=((max.y-min.y)-(max.x-min.x))/2;
			min.x=min.x-distan;
			max.x=max.x+distan;
		}                                    //求出外接矩形
		for(i=0;i<allnum;i++)
		{
			ratio=(float)((float)173/(float)kuan);
			alldata[i]=alldata[i]-(min-zero);
			alldata[i].x=(int)((alldata[i].x-40) * ratio)+40;
			alldata[i].y=(int)((alldata[i].y -39)* ratio)+39;
			CBrush* pOldBrush = pDC->SelectObject (&brushBlue);
			pDC->Ellipse(alldata[i].x-4,alldata[i].y-4,alldata[i].x+4,alldata[i].y+4);
		}    //字体放大

		int rgb[36],can[24][24];
		int k;
		int wm[24][24];
		int zm[24][24];

		for (i=0;i<24;i++) for (j=0;j<24;j++)
		{
			can[i][j]=0;
			for (k=0;k<64;k++)
			{
				rgb[k]=GetRValue(pDC->GetPixel(Startx+i*8+k/8,Starty+j*8+k%8)); //获取每个点块(6*6)的36个点的红分量
				if (rgb[k]>200) can[i][j]++;
			}//在指定的设备场景中取得一个像素的RGB值
			if (can[i][j]>32) wm[i][j]=0; else wm[i][j]=1;
		}//用户绘图转换为点位型字模

		CString str;
		int qh,wh,offset;
		BYTE bytes[72];
		for(dim=0;dim<m;dim++)
		{
			str=zi[dim];
			char   a[3];
			strcpy(a,str.GetBuffer(str.GetLength()));
			qh=a[0]+0x60;
			wh=a[1]+0x60; 
			offset=(94*(qh-16)+(wh-1))*72L; //计算字库偏移
			cf.Seek( offset, CFile::begin ); 
			cf.Read(bytes,72); //读取该汉字字模,一次读72字节,刚好是一个24*24汉字字模点阵的大小 
			int zmc=0;
			for (k=0;k<72;k++) 
			{
				i=k/3;
				j=(k%3)*8;
				if (bytes[k]&128) zm[i][j+0]=1;else zm[i][j+0]=0;
				if  (bytes[k]&64) zm[i][j+1]=1;else zm[i][j+1]=0;
				if  (bytes[k]&32) zm[i][j+2]=1;else zm[i][j+2]=0;
				if  (bytes[k]&16) zm[i][j+3]=1;else zm[i][j+3]=0;
				if   (bytes[k]&8) zm[i][j+4]=1;else zm[i][j+4]=0;
				if   (bytes[k]&4) zm[i][j+5]=1;else zm[i][j+5]=0;
				if   (bytes[k]&2) zm[i][j+6]=1;else zm[i][j+6]=0;
				if   (bytes[k]&1) zm[i][j+7]=1;else zm[i][j+7]=0;  //字节型字模转换为点位型字模
			}


			int wzmc=0;
			int bwzmc=0;
			for (i=0;i<24;i++) 
				for (j=0;j<24;j++)
				{
					if (zm[i][j]==1) zmc++;
					if ((wm[i][j]==1) && (zm[i][j]==1)) wzmc++;	
					if ((wm[i][j]==1) && (zm[i][j]==0)) bwzmc++;
				}
			CString msg;
			float xsl=float(wzmc)/(float)zmc;
			if (((xsl>0.1) || (bwzmc==0)) && (wzmc!=0))//如果相似概率达到一个阕值,则在list中添加该汉字
			{
				msg.Format("%f:",xsl);
				char   a[3]="  ";//开辟内存空间
				a[0]=qh+0xA0;
				a[1]=wh+0xA0; 
				m_showa.InsertItem(dim,msg+a);
			}
		}



	}
	
}

void CZhDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	getzi(bihua,arch,arcs,arcp,arcn,arcz);
	m_showa.DeleteAllItems();
	m_showb.DeleteAllItems();

	for (i=0;i<16 && i<m;i++) 
		m_showa.InsertItem(i,zi[i]); //显示前面的字符


	int dim=0;//循环的是第几个字
//	if(m>=1)
//	{
		m_showb.DeleteAllItems();
		CBrush brushWhite(RGB(255, 255, 255));
		CBrush brushBlue(RGB(0, 0, 255));
		CBrush brushRed(RGB(255, 0, 0));
		CBrush brushGreen(RGB(0, 255, 0)); //画刷的定义	
		CDC *pDC=GetDC();
		CBrush* pOldBrush = pDC->SelectObject (&brushWhite);
		pDC->Rectangle(Startx,Starty,Startx+wid-1,Starty+lon-1);
		CRgn Rgn;
		Rgn.CreateRectRgn(Startx,Starty,Startx+wid-1,Starty+lon-1);  //创建一个矩形区域
		pDC->SelectClipRgn(&Rgn);   //为指定设备场景选择新的剪裁区
		int distan,kuan;
		float ratio;
		min.x=allzz.x;min.y=allzx.y;max.x=allzy.x;max.y=allzs.y;
		if((max.x-min.x)>(max.y-min.y))
		{
			kuan=max.x-min.x;
			distan=((max.x-min.x)-(max.y-min.y))/2;
			min.y=min.y-distan;
			max.y=max.y+distan;
		}
		else
		{
			kuan=max.y-min.y;
			distan=((max.y-min.y)-(max.x-min.x))/2;
			min.x=min.x-distan;
			max.x=max.x+distan;
		}                                    //求出外接矩形
		for(i=0;i<allnum;i++)
		{
			ratio=(float)((float)173/(float)kuan);
			alldata[i]=alldata[i]-(min-zero);
			alldata[i].x=(int)((alldata[i].x-40) * ratio)+40;
			alldata[i].y=(int)((alldata[i].y -39)* ratio)+39;
			CBrush* pOldBrush = pDC->SelectObject (&brushBlue);
			pDC->Ellipse(alldata[i].x-4,alldata[i].y-4,alldata[i].x+4,alldata[i].y+4);
		}    //字体放大

		int rgb[64],can[24][24];
		int k;
		int wm[24][24];
		int zm[24][24];

		for (i=0;i<24;i++) for (j=0;j<24;j++)
		{
			can[i][j]=0;
			for (k=0;k<64;k++)
			{
				rgb[k]=GetRValue(pDC->GetPixel(Startx+i*8+k/8,Starty+j*8+k%8)); //获取每个点块(8*8)的64个点的红分量
				if (rgb[k]>200) can[i][j]++;
			}//在指定的设备场景中取得一个像素的RGB值
			if (can[i][j]>32) wm[i][j]=0; else wm[i][j]=1;
		}//用户绘图转换为点位型字模

		CString str;
		int qh,wh,offset;
		BYTE bytes[72];
		for(dim=0;dim<m;dim++)
		{
			str=zi[dim];
			char   a[3];
			strcpy(a,str.GetBuffer(str.GetLength()));
			qh=a[0]+0x60;
			wh=a[1]+0x60; 
			offset=(94*(qh-16)+(wh-1))*72L; //计算字库偏移
			cf.Seek( offset, CFile::begin ); 
			cf.Read(bytes,72); //读取该汉字字模,一次读72字节,刚好是一个24*24汉字字模点阵的大小 
			int zmc=0;
			for (k=0;k<72;k++) 
			{
				i=k/3;
				j=(k%3)*8;
				if (bytes[k]&128) zm[i][j+0]=1;else zm[i][j+0]=0;
				if  (bytes[k]&64) zm[i][j+1]=1;else zm[i][j+1]=0;
				if  (bytes[k]&32) zm[i][j+2]=1;else zm[i][j+2]=0;
				if  (bytes[k]&16) zm[i][j+3]=1;else zm[i][j+3]=0;
				if   (bytes[k]&8) zm[i][j+4]=1;else zm[i][j+4]=0;
				if   (bytes[k]&4) zm[i][j+5]=1;else zm[i][j+5]=0;
				if   (bytes[k]&2) zm[i][j+6]=1;else zm[i][j+6]=0;
				if   (bytes[k]&1) zm[i][j+7]=1;else zm[i][j+7]=0;  //字节型字模转换为点位型字模
			}


			int wzmc=0;
			int bwzmc=0;
			for (i=0;i<24;i++) 
				for (j=0;j<24;j++)
				{
					if (zm[i][j]==1) zmc++;
					if ((wm[i][j]==1) && (zm[i][j]==1)) wzmc++;	
					if ((wm[i][j]==1) && (zm[i][j]==0)) bwzmc++;
				}
			CString msg;
			float xsl=float(wzmc)/(float)zmc;
			if (((xsl>0.05) || (bwzmc==0)) && (wzmc!=0))//如果相似概率达到一个阕值,则在list中添加该汉字
			{
				msg.Format("%f:",xsl);
				char   a[3]="  ";//开辟内存空间
				a[0]=qh+0xA0;
				a[1]=wh+0xA0; 
				m_showb.InsertItem(dim,msg+a);
			}
		}

//	}
//	else
//	{
//		for (i=0;i<16 && i<m;i++) 
//		m_show.InsertItem(i,zi[i]); //显示前面的字符
//	}
	KillTimer(1);

	for(i=0;i<m;i++)
		zi[i]="";
	m=0;	
	mouseDown=0;	
	CDialog::OnTimer(nIDEvent);
}

void CZhDlg::OnClickList4(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	m_hzs.SetWindowText("");
	int   nLength= m_hzs.SendMessage(WM_GETTEXTLENGTH);
	int iItem; 
	iItem=m_showb.GetNextItem(-1,LVNI_SELECTED); 
	CString hz   =   m_showb.GetItemText(  iItem, 0);
	hz=hz.Right(2);
	m_hzs.SetSel(nLength,nLength);
	m_hzs.ReplaceSel(hz);

	CBrush Brush (RGB (255, 255 , 255) );
	CDC *pDC=GetDC();
	CBrush* pOldBrush = pDC->SelectObject (&Brush);
	pDC->Rectangle(Startx,Starty,Startx+wid-1,Starty+lon-1);
	arch=arcs=arcp=arcn=arcz=0;
	m_counting.SetPos(0);

	for(i=0;i<m;i++)
		zi[i]="";
	m=0;

	fat=0;
	for(i=0;i<allnum;i++)
	{
		alldata[i].x=0;
		alldata[i].y=0;
	}
	mouseDown=0;
	
	*pResult = 0;
}

⌨️ 快捷键说明

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