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

📄 dnwdlg.cpp

📁 该软件的主要功能是用鼠标就能“写”出常用的汉字
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
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 + -