📄 dnwdlg.cpp
字号:
{
CBrush* pOldBrush = pDC->SelectObject (&brushBlue);
pDC->Ellipse(point.x-4,point.y-4,point.x+4,point.y+4);
ex=point.x;ey=point.y;
if (ex==sx) arc=100;
else arc=(float)(ey-sy)/(ex-sx); //计算水平夹角
if (arc<minarc) minarc=arc;
if (arc>maxarc) maxarc=arc;
}
ReleaseDC(pDC );
DeleteObject(Rgn);
DeleteObject(brushBlue);
CDialog::OnMouseMove(nFlags, point);
}
void CDNWDlg::OnClose()
{ if (bOpenOK=true) cf.Close();
// TODO: Add your message handler code here and/or call default
//hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
::Shell_NotifyIcon(NIM_DELETE,&tnd);
if(hIcon)::DestroyIcon(hIcon);
CDialog::OnClose();
}
void CDNWDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{if((point.x>=Startx)&&(point.x<Startx+wid)&&(point.y>=Starty)&&(point.y<Starty+lon))
{
HCURSOR m_HCross;
m_HCross=AfxGetApp()->LoadCursor(IDC_CURSOR1);
SetCursor(m_HCross);
}
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonDblClk(nFlags, point);
}
void CDNWDlg::OnRButtonDblClk(UINT nFlags, CPoint point)
{if((point.x>=Startx)&&(point.x<Startx+wid)&&(point.y>=Starty)&&(point.y<Starty+lon))
{
HCURSOR m_HCross;
m_HCross=AfxGetApp()->LoadCursor(IDC_CURSOR1);
SetCursor(m_HCross);
}
// TODO: Add your message handler code here and/or call default
CDialog::OnRButtonDblClk(nFlags, point);
}
void CDNWDlg::OnRButtonDown(UINT nFlags, CPoint point)
{if((point.x>=Startx)&&(point.x<Startx+wid)&&(point.y>=Starty)&&(point.y<Starty+lon))
{
HCURSOR m_HCross;
m_HCross=AfxGetApp()->LoadCursor(IDC_CURSOR1);
SetCursor(m_HCross);
}
// TODO: Add your message handler code here and/or call default
CDialog::OnRButtonDown(nFlags, point);
}
void CDNWDlg::OnRButtonUp(UINT nFlags, CPoint point)
{if((point.x>=Startx)&&(point.x<Startx+wid)&&(point.y>=Starty)&&(point.y<Starty+lon))
{
HCURSOR m_HCross;
m_HCross=AfxGetApp()->LoadCursor(IDC_CURSOR1);
SetCursor(m_HCross);
}
// TODO: Add your message handler code here and/or call default
CDialog::OnRButtonUp(nFlags, point);
}
void CDNWDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
}
void CDNWDlg::OnButton2() //清除按钮
{CBrush Brush (RGB (255, 255 , 255) );
CDC *pDC=GetDC();
CBrush* pOldBrush = pDC->SelectObject (&Brush);
pDC->Rectangle(Startx,Starty,Startx+wid-1,Starty+lon-1);
m_counting.SetPos(0);
m_hzcount.SetWindowText("0");
m_show.DeleteAllItems();
arch=0;arcs=0;arcp=0;arcl=0;arcz=0; //基本笔划计数器清0
}
void CDNWDlg::OnButton3() //显示用户绘图按钮
{ CDC *pDC=GetDC(); //获得屏幕DC
CBrush brushWhite(RGB(255, 255, 255));
CBrush brushBlue(RGB(0, 0, 255));
CBrush brushRed(RGB(255, 0, 0));
CBrush brushGreen(RGB(0, 255, 0)); //画刷的定义
CBrush *pOldBrush;
int rgb[36],can[24][24];
for (i=0;i<24;i++) for (j=0;j<24;j++){
can[i][j]=0;
for (k=0;k<36;k++)
{rgb[k]=GetRValue(pDC->GetPixel(rec1x+i*6+k/6,recy+j*6+k%6)); //获取每个点块(6*6)的36个点的红分量
if (rgb[k]>200) can[i][j]++;
}
if (can[i][j]>18) wm[i][j]=0; else wm[i][j]=1;
}//用户绘图转换为点位型字模
for (i=0;i<24;i++) for (j=0;j<24;j++){
can[i][j]=0;
for (k=0;k<36;k++)
{rgb[k]=GetRValue(pDC->GetPixel(rec1x+i*6+k/6,recy+j*6+k%6)); //获取每个点块(6*6)的36个点的红分量
if (rgb[k]>200) can[i][j]++;
}
if (can[i][j]>18) wm[i][j]=0; else wm[i][j]=1;
}//用户绘图转换为点位型字模
for (i=0;i<24;i++) for (j=0;j<24;j++)
{
pDC->SelectObject(&brushBlue);//蓝笔刷对象
if (wm[i][j]==1) {pDC->Rectangle(rec2x+i*6,recy+j*6,rec2x+6+i*6,recy+6+j*6);}
else {pOldBrush = pDC->SelectObject(&brushWhite);//白色笔刷对象
pDC->Rectangle(rec2x+i*6,recy+j*6,rec2x+6+i*6,recy+6+j*6); }
} //点位型字模在屏幕显示
}
void CDNWDlg::OnButton1() //识别按钮
{
m_hzcount.SetWindowText("0");
m_show.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();
m_hzcount.SetWindowText("0");
int rgb[36],can[24][24];
wmc=0;hzsfind=0;
for (i=0;i<24;i++) for (j=0;j<24;j++){
can[i][j]=0;
for (k=0;k<36;k++)
{rgb[k]=GetRValue(pDC->GetPixel(rec1x+i*6+k/6,recy+j*6+k%6)); //获取每个点块(6*6)的36个点的红分量
if (rgb[k]>200) can[i][j]++;
}
if (can[i][j]>18) {wm[i][j]=0;} else {wm[i][j]=1;wmc++;}
}//用户绘图转换为点位型字模
for (i=0;i<24;i++) for (j=0;j<24;j++)
{
pDC->SelectObject(&brushBlue);//蓝笔刷对象
if (wm[i][j]==1) {pDC->Rectangle(rec2x+i*6,recy+j*6,rec2x+6+i*6,recy+6+j*6);}
else {pOldBrush = pDC->SelectObject(&brushWhite);//白色笔刷对象
pDC->Rectangle(rec2x+i*6,recy+j*6,rec2x+6+i*6,recy+6+j*6); }
} //点位型字模在屏幕显示
CString str;
m_ftlist.GetWindowText(str); //看字库类型是否常用符号
int bihua=m_counting.GetPos();
if (str!="常用符号")
for (qh=16;qh<=88;qh++) for (wh=1;wh<=94;wh++) //对汉字字库字模进行循环判断
{if ((getbihua(qh,wh)==bihua)&& (bihua>0) ) //拣选笔划符合要求的汉字
getzm(qh,wh);}
else for (qh=16;qh<=24;qh++) for (wh=1;wh<=94;wh++) //对符号字库字模进行循环判断
getzm(qh,wh);
CString msg;
msg.Format("%d",m_show.GetItemCount());
m_hzcount.SetWindowText(msg);//统计字数
if (m_show.GetItemCount()==0) {
//AfxMessageBox("没有找到匹配的汉字!",MB_OK|MB_ICONINFORMATION);
return;}
for (i=0;i<16 && i<hzsfind;i++)
hzs[i]=m_show.GetItemText(i, 0); //列表保存为字符数组
m_show.DeleteAllItems(); //清空列表
for (i=0;i<16 && i<hzsfind;i++)
m_show.InsertItem(i,hzs[i]); //显示前面的字符
}
void CDNWDlg::getzm(int qh,int wh)//关键识别函数
{
CString str;
CDC *pDC=GetDC(); //获得屏幕DC
CBrush brushWhite(RGB(255, 255, 255));
CBrush brushBlue(RGB(0, 0, 255));
CBrush* pOldBrush = pDC->SelectObject(&brushBlue);//笔刷对象
//汉字在字库中的偏移量L=(区码*94+位码)*n ,n为每个汉字占用字节数
//我是用的24*24点阵字库,所以 n=72
offset=(94*(qh-16)+(wh-1))*72L; //计算字库偏移
cf.Seek( offset, CFile::begin );
cf.Read(bytes,72); //读取该汉字字模
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; //字节型字模转换为点位型字模
}
wzmc=0;bwzmc=0;
for (i=0;i<24;i++) for (j=0;j<24;j++){
pDC->SelectObject(&brushBlue);//蓝笔刷对象
if (zm[i][j]==1) {
pDC->Rectangle(rec3x+i*6,recy+j*6,rec3x+6+i*6,recy+6+j*6); }
else {pOldBrush = pDC->SelectObject(&brushWhite);//白色笔刷对象
pDC->Rectangle(rec3x+i*6,recy+j*6,rec3x+6+i*6,recy+6+j*6); }
//点位型字模在屏幕显示
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;
xsl=float(wzmc)/zmc;
if (((xsl>0.1) || (bwzmc==0)) && (wzmc!=0))//如果相似概率达到一个阕值,则在list中添加该汉字
{msg.Format("%f:",xsl);
char a[3]=" ";//开辟内存空间
CString str;
m_ftlist.GetWindowText(str) ; //看字库类型是否常用符号
if (str=="常用符号") qh=qh-15;
a[0]=qh+0xA0;
a[1]=wh+0xA0;
m_show.InsertItem(hzsfind,msg+a);
hzsfind++;//计数器
}
}
void CDNWDlg::OnButton4() //显示当前字模
{CDC *pDC=GetDC(); //获得屏幕DC
CBrush brushWhite(RGB(255, 255, 255));
CBrush brushBlue(RGB(0, 0, 255));
CBrush* pOldBrush = pDC->SelectObject(&brushBlue);//笔刷对象
offset=(94*(qh-16)+(wh-1))*72L; //计算字库偏移
cf.Seek( offset, CFile::begin );
cf.Read(bytes,72); //读取该汉字字模
CString msg;
msg.Format("%d,%d",qh,wh);
m_hzcount.SetWindowText(msg);
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; //字节型字模转换为点位型字模
}
for (i=0;i<24;i++) for (j=0;j<24;j++){
pDC->SelectObject(&brushBlue);//蓝笔刷对象
if (zm[i][j]==1) {pDC->Rectangle(rec3x+i*6,recy+j*6,rec3x+6+i*6,recy+6+j*6); }
else {pDC->SelectObject(&brushWhite);//白笔刷对象
pDC->Rectangle(rec3x+i*6,recy+j*6,rec3x+6+i*6,recy+6+j*6); }
}
}
void CDNWDlg::OnSelchangeList4() //单击listbox添加相应汉字
{
}
void CDNWDlg::OnDblclkList4() //双击listbox添加相应汉字
{
}
void CDNWDlg::OnButton5() //机器写字
{
CDC *pDC=GetDC(); //获得屏幕DC
CBrush brushWhite(RGB(255, 255, 255));
CBrush brushBlue(RGB(0, 0, 255));
CBrush* pOldBrush = pDC->SelectObject(&brushWhite);//笔刷对象
pDC->Rectangle(Startx,Starty,Startx+wid-1,Starty+lon-1);
CString msg;
m_zk.GetWindowText(msg);
if (msg!="") {
//
//开辟内存空间
//a=msg;
char a[3];
strcpy(a,msg.GetBuffer(msg.GetLength()));
qh=a[0]+0x60;
wh=a[1]+0x60;
CString str;
m_ftlist.GetWindowText(str);
if (str=="常用符号") {qh=qh+15;if (wh==96) {wh=qh-143;qh=18;}}
//msg.Format("%d,%d",qh,wh);
//AfxMessageBox(msg);
offset=(94*(qh-16)+(wh-1))*72L; //计算字库偏移
cf.Seek( offset, CFile::begin );
cf.Read(bytes,72); //读取该汉字字模
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; //字节型字模转换为点位型字模
}
for (i=0;i<24;i++) for (j=0;j<24;j++){
pDC->SelectObject(&brushBlue);//蓝笔刷对象
if (zm[i][j]==1) {pDC->Rectangle(rec1x+i*6,recy+j*6,rec1x+6+i*6,recy+6+j*6); }
//else {pDC->SelectObject(&brushWhite);//白笔刷对象
//pDC->Rectangle(rec1x+i*6,recy+j*6,rec1x+6+i*6,recy+6+j*6); }
}
m_counting.SetPos(getbihua(qh,wh));
if (str=="常用符号") m_counting.SetPos(-1);
}
}
void CDNWDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
int nLength= m_hzs.SendMessage(WM_GETTEXTLENGTH);
int iItem;
iItem=m_show.GetNextItem(-1,LVNI_SELECTED);
CString hz = m_show.GetItemText( iItem, 0);
hz=hz.Right(2);
m_hzs.SetSel(nLength,nLength);
m_hzs.ReplaceSel(hz);
*pResult = 0;
}
void CDNWDlg::OnSelchangeCombo1()
{CString str;
m_ftlist.GetWindowText(str);
if (str=="仿宋体") hzfile=FONTF;
if (str=="宋体") hzfile=FONTS;
if (str=="黑体") hzfile=FONTH;
if (str=="楷体") hzfile=FONTK;
if (str=="常用符号") hzfile=FONTT;
cf.Close();
bOpenOK = cf.Open(hzfile,CFile::modeRead );
if (bOpenOK==0)
{
CString Msg="字库文件:"+hzfile+"不能打开!";
AfxMessageBox(Msg,MB_OK|MB_ICONINFORMATION);
//OnCancel();
}
}
void CDNWDlg::OnButton6()
{
_ConnectionPtr m_pConnection;
CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(Connection));
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些想不到的错误。
try
{
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
cout<<"数据库连接失败,确认数据库data.mdb是否在当前路径下!"<<endl;
return ;
}
//-------------------------------------------------------------------------------------
//建立数据集
//-------------------------------------------------------------------------------------
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。
try
{
m_pRecordset->Open("SELECT * FROM bihua",
m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
//AfxMessageBox(e->ErrorMessage());
cout<<e->ErrorMessage()<<endl;
}
//--------------------------------------------------------------------------------------
//读取数据
//--------------------------------------------------------------------------------------
_variant_t var;
char *strquwei,*strhz,*strh,*strs,*strp,*strl,*strz;
float X,Y;
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
cout<<"表内数据为空"<<endl;
return;
}
// 读入库中各字段并加入列表框中
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("quwei");
if(var.vt != VT_NULL)
strquwei= _com_util::ConvertBSTRToString((_bstr_t)var); //_variant_t转字符串
var = m_pRecordset->GetCollect("hz");
if(var.vt != VT_NULL)
strhz=_com_util::ConvertBSTRToString((_bstr_t)var);
var = m_pRecordset->GetCollect("h");
if(var.vt != VT_NULL)
strh=_com_util::ConvertBSTRToString((_bstr_t)var);
var = m_pRecordset->GetCollect("s");
if(var.vt != VT_NULL)
strs=_com_util::ConvertBSTRToString((_bstr_t)var);
var = m_pRecordset->GetCollect("p");
if(var.vt != VT_NULL)
strp=_com_util::ConvertBSTRToString((_bstr_t)var);
var = m_pRecordset->GetCollect("l");
if(var.vt != VT_NULL)
strl=_com_util::ConvertBSTRToString((_bstr_t)var);
var = m_pRecordset->GetCollect("z");
if(var.vt != VT_NULL)
strz=_com_util::ConvertBSTRToString((_bstr_t)var);
if (atoi(strh)==arch) AfxMessageBox(strhz);
m_pRecordset->MoveNext();
}
}
catch(_com_error *e)
{
cout<<e->ErrorMessage()<<endl;
}
//--------------------------------------------------------------------------------------
//关闭数据集
m_pRecordset->Close();
m_pRecordset = NULL;
//--------------------------------------------------------------------------------------
//关闭数据库连接
//--------------------------------------------------------------------------------------
if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -