vt100imp.cpp
来自「vt100终端仿真程序」· C++ 代码 · 共 1,764 行 · 第 1/3 页
CPP
1,764 行
if((struKeyMsp.iKeyLock!=1)&&(m_blOnline==TRUE)){
memset(szKeyBuf,0,sizeof(szKeyBuf));
if(struKeyMsp.iKeyCursor==1&&(wParam>=37&&wParam<=40)){
if(m_szKeyCode[iOffset[wParam-37]-1][0]!=0){
strcpy(szKeyBuf,&m_szKeyCode[iOffset[wParam-37]-1][0]);
csTermCom->SendData(szKeyBuf,strlen(szKeyBuf));
}
}
else{
if(m_szKeyCode[wParam-1][0]!=0){
strcpy(szKeyBuf,&m_szKeyCode[wParam-1][0]);
csTermCom->SendData(szKeyBuf,strlen(szKeyBuf));
}
}
}
*/
char szKeyBuf[6];
int iOffset[]={237,238,239,240};
HDC hDC;
//英文输入
// if (bIM==0)
// {
switch (wParam)
{
case VK_F9:
hDC=GetDC(hOutWnd);
SelectObject(hDC,testFont4);
SetBkColor(hDC,RGB(0,0,0));
SetTextColor(hDC,RGB(208,208,208));///设置字体颜色
SetBkMode(hDC,OPAQUE);
ExtTextOut(hDC,10,struScrMsp.iChrHigh*ENDLINE,ETO_CLIPPED,&TextRect,_T(" "),80,NULL);
ExtTextOut(hDC,10,struScrMsp.iChrHigh*ENDLINE,ETO_CLIPPED,&TextRect,_T("区位"),2,NULL);
ReleaseDC(hOutWnd,hDC);
memset(GbBuf,0x00,sizeof(GbBuf));
bIM=1;
break;
case VK_F10:
hDC=GetDC(hOutWnd);
SelectObject(hDC,testFont4);
SetBkColor(hDC,RGB(0,0,0));
SetTextColor(hDC,RGB(208,208,208));///设置字体颜色
SetBkMode(hDC,OPAQUE);
ExtTextOut(hDC,10,struScrMsp.iChrHigh*ENDLINE,ETO_CLIPPED,&TextRect,_T(" "),80,NULL);
ExtTextOut(hDC,10,struScrMsp.iChrHigh*ENDLINE,ETO_CLIPPED,&TextRect,_T("拼音"),2,NULL);
ReleaseDC(hOutWnd,hDC);
memset(PyBuf,0x00,sizeof(PyBuf));
CurrPage=0;
PageCount=0;
PyIndex=9999;
bIM=2;
break;
case VK_F11:
hDC=GetDC(hOutWnd);
SelectObject(hDC,testFont4);
SetBkColor(hDC,RGB(0,0,0));
SetTextColor(hDC,RGB(208,208,208));///设置字体颜色
SetBkMode(hDC,OPAQUE);
ExtTextOut(hDC,10,struScrMsp.iChrHigh*ENDLINE,ETO_CLIPPED,&TextRect,_T(" "),80,NULL);
ExtTextOut(hDC,10,struScrMsp.iChrHigh*ENDLINE,ETO_CLIPPED,&TextRect,_T("五笔"),2,NULL);
ReleaseDC(hOutWnd,hDC);
memset(PyBuf,0x00,sizeof(PyBuf));
csWbx.Init();
bIM=3;
break;
case VK_F12:
hDC=GetDC(hOutWnd);
SelectObject(hDC,testFont4);
SetBkColor(hDC,RGB(0,0,0));
SetTextColor(hDC,RGB(208,208,208));///设置字体颜色
SetBkMode(hDC,OPAQUE);
ExtTextOut(hDC,10,struScrMsp.iChrHigh*ENDLINE,ETO_CLIPPED,&TextRect,_T(" "),80,NULL);
ExtTextOut(hDC,10,struScrMsp.iChrHigh*ENDLINE,ETO_CLIPPED,&TextRect,_T("英文 美斯比科技有限公司 VT100 仿真系统"),33,NULL);
ReleaseDC(hOutWnd,hDC);
if(bIM==3){
csWbx.Release();
}
bIM=0;
break;
default:
if((struKeyMsp.iKeyLock!=1)&&(m_blOnline==TRUE)&&bIM==0)
{
memset(szKeyBuf,0,sizeof(szKeyBuf));
if(struKeyMsp.iKeyCursor==1&&(wParam>=37&&wParam<=40)){
if(m_szKeyCode[iOffset[wParam-37]-1][0]!=0){
strcpy(szKeyBuf,&m_szKeyCode[iOffset[wParam-37]-1][0]);
csTermCom->SendData(szKeyBuf,strlen(szKeyBuf));
}
}
else{
if(m_szKeyCode[wParam-1][0]!=0){
strcpy(szKeyBuf,&m_szKeyCode[wParam-1][0]);
csTermCom->SendData(szKeyBuf,strlen(szKeyBuf));
}
}
}
break;
}
// }
/*
//区位输入
else
{
if (wParam==VK_F6)
{
hDC=GetDC(hOutWnd);
SelectObject(hDC,testFont4);
SetBkColor(hDC,RGB(0,0,0));
SetTextColor(hDC,RGB(0,255,0));///设置字体颜色
SetBkMode(hDC,OPAQUE);
ExtTextOut(hDC,10,struScrMsp.iChrHigh*26,ETO_CLIPPED,&TextRect,_T(" "),80,NULL);
ExtTextOut(hDC,10,struScrMsp.iChrHigh*26,ETO_CLIPPED,&TextRect,_T("英文 美斯比科技有限公司 VT100 仿真系统"),33,NULL);
ReleaseDC(hOutWnd,hDC);
bIM=0;
}
}*/
}
void OnChar(WORD wParam,DWORD lParam)
{
WCHAR pwBuf[3];
char szKeyBuf[7];
WORD wGBCode;
if((struKeyMsp.iKeyLock!=1)&&(m_blOnline==TRUE))
{
if(m_blOnline)
{
switch (bIM)
{
case 0:
/////////////////////////////////////////////////////modified by wsl
memset (pwBuf,0x00,sizeof(pwBuf));
memset(szKeyBuf,0x00,sizeof(szKeyBuf));
pwBuf[0]=wParam;
// wcstombs(szKeyBuf,pwBuf,sizeof(szKeyBuf));
WideCharToMultiByte(CP_ACP,
WC_COMPOSITECHECK,
pwBuf,
wcslen(pwBuf),
szKeyBuf,
sizeof(szKeyBuf),
NULL,
NULL);
csTermCom->SendData (szKeyBuf,strlen(szKeyBuf));
break;
////////////////////////////////////////////////////////////////////////
case 1:
//得到区位码缓冲区
switch (wParam)
{
case 0x3d://=
if (strlen(GbBuf)==3)
{
if (GbBuf[2]<0x39)
GbBuf[2]++;
else
{
if (GbBuf[0]!='9' || GbBuf[1]!='4')
{
GbBuf[2]='0';
if (GbBuf[1]<'9')
GbBuf[1]++;
else
{
GbBuf[1]='0';
GbBuf[0]++;
}
QuMa=(GbBuf[0]-'0')*10+GbBuf[1]-'0';
}
}
}
break;
case 0x2d:
if (strlen(GbBuf)==3)
{
if (GbBuf[2]>'0')
GbBuf[2]--;
else
{
if (GbBuf[0]!='0' || GbBuf[1]!='1')
{
GbBuf[2]='9';
if (GbBuf[1]>'0')
GbBuf[1]--;
else
{
GbBuf[1]='9';
GbBuf[0]--;
}
QuMa=(GbBuf[0]-'0')*10+GbBuf[1]-'0';
}
}
}
break;
case 0x08:
if (strlen(GbBuf)>0)
GbBuf[strlen(GbBuf)-1]=0x00;
else
csTermCom->SendData("\x08",1);
break;
case 0x0d:
if (strlen(GbBuf)>0)
memset(GbBuf,0x00,sizeof(GbBuf));
else
csTermCom->SendData("\x0d",1);
break;
default:
if (wParam>=0x30&&wParam<=0x39)
{
GbBuf[strlen(GbBuf)]=(char)wParam;
if (strlen(GbBuf)==2)
{
if (atoi(GbBuf)>94)
GbBuf[1]=0x00;
else
QuMa=atoi(GbBuf);
}
if (strlen(GbBuf)==4)
{
if (atoi(GbBuf+2)>94 || atoi(GbBuf+2)==0)
GbBuf[3]=0x00;
else
{
WeiMa=atoi(GbBuf+2);
memset(szKeyBuf,0x00,sizeof(szKeyBuf));
szKeyBuf[0]=QuMa+0xa0;
szKeyBuf[1]=WeiMa+0xa0;
csTermCom->SendData (szKeyBuf,strlen(szKeyBuf));
}
}
}
break;
}
ShowSeleStr();
break;
/////////////////////////////////////////////////////////////////////////////////
case 2:
//拼音
switch (wParam)
{
case 0x3d: //=
//向下翻页
if (strlen(PyBuf)>0)
{
if (CurrPage<PageCount && PyIndex!=9999)
CurrPage++;
}
else
csTermCom->SendData("\x3d",1);
break;
case 0x2d: //-
//向上翻页
if (strlen(PyBuf)>0)
{
if (CurrPage>0 && PyIndex!=9999)
CurrPage--;
}
else
csTermCom->SendData("\x2d",1);
break;
case 0x20: //空格
//有符合条件的字符则选中,否则发送到主机,清拼音缓冲区
if (strlen(PyBuf)>0)
if (PyIndex!=9999) SendSele(0);
else
csTermCom->SendData("\x20",1);
break;
case 0x0d: //回车
//有符合条件的字符则选中,否则发送到主机,清拼音缓冲区
if (strlen(PyBuf)>0)
{
if (PyIndex!=9999)
SendSele(0);
else
csTermCom->SendData("\x0d",1);
}
else
{
csTermCom->SendData("\x0d",1);
}
break;
case 0x08: //退格
//有拼音字符则删除拼音字符,否则发送到主机
if (strlen(PyBuf)>0)
{
PyBuf[strlen(PyBuf)-1]=0;
if (strlen(PyBuf)>0)
PyIndex=SearchPy();
else
{
PyIndex=9999;
PageCount=0;
CurrPage=0;
}
}
else
csTermCom->SendData ("\x08",1);
break;
default:
if (wParam>=0x30 && wParam<=0x39)//0-9选字,清拼音缓冲区;非选字状态则发送
{
if (PyIndex!=9999)
{
int iSele;
iSele=wParam-0x30;
if (strlen(Hzb[PyIndex])>CurrPage*20+iSele*2)
SendSele(iSele);
}
else
{
char char1;
char1=LOBYTE(wParam);
csTermCom->SendData(&char1,1);
}
}
else
{
if (wParam>=0x61 && wParam<=0x7a)//a-z拼音输入
{
PyBuf[strlen(PyBuf)]=(char)wParam;
PyIndex=SearchPy();
}
else//其他字符,直接发送
{
memset (pwBuf,0x00,sizeof(pwBuf));
memset(szKeyBuf,0x00,sizeof(szKeyBuf));
pwBuf[0]=wParam;
// wcstombs(szKeyBuf,pwBuf,sizeof(szKeyBuf));
WideCharToMultiByte(CP_ACP,
WC_COMPOSITECHECK,
pwBuf,
wcslen(pwBuf),
szKeyBuf,
sizeof(szKeyBuf),
NULL,
NULL);
csTermCom->SendData (szKeyBuf,strlen(szKeyBuf));
}
}
break;
}
ShowPyStr();
break;
case 3:
//五笔
switch (wParam)
{
case 0x3d: //=
//向下翻页
if (strlen(PyBuf)>0){
csWbx.PageDown();
}
else
csTermCom->SendData("\x3d",1);
break;
case 0x2d: //-
//向上翻页
if (strlen(PyBuf)>0){
csWbx.PageUp();
}
else
csTermCom->SendData("\x2d",1);
break;
case 0x20: //空格
//有符合条件的字符则选中,否则发送到主机,清拼音缓冲区
if (strlen(PyBuf)>0){
csWbx.Select(0,&wGBCode);
if(wGBCode!=0){
csTermCom->SendData((char *)(&wGBCode),2);
memset(PyBuf,0x00,sizeof(PyBuf));
csWbx.SearchCode(PyBuf);
}
}
else
csTermCom->SendData("\x20",1);
break;
case 0x0d: //回车
//有符合条件的字符则选中,否则发送到主机,清拼音缓冲区
if (strlen(PyBuf)>0){
csWbx.Select(0,&wGBCode);
if(wGBCode!=0){
csTermCom->SendData((char *)(&wGBCode),2);
memset(PyBuf,0x00,sizeof(PyBuf));
csWbx.SearchCode(PyBuf);
}
}
else
csTermCom->SendData("\x0d",1);
break;
case 0x08: //退格
//有拼音字符则删除拼音字符,否则发送到主机
if (strlen(PyBuf)>0){
PyBuf[strlen(PyBuf)-1]=0;
csWbx.SearchCode(PyBuf);
}
else
csTermCom->SendData ("\x08",1);
break;
default:
if (wParam>=0x30 && wParam<=0x39)//0-9选字,清拼音缓冲区;非选字状态则发送
{
int iSele;
iSele=wParam-0x30;
csWbx.Select(iSele,&wGBCode);
if(wGBCode!=0){
csTermCom->SendData((char *)&wGBCode,2);
memset(PyBuf,0x00,sizeof(PyBuf));
csWbx.SearchCode(PyBuf);
}
else
{
char char1;
char1=LOBYTE(wParam);
csTermCom->SendData(&char1,1);
}
}
else
{
if (wParam>=0x61 && wParam<0x7a)//a-z拼音输入
{
PyBuf[strlen(PyBuf)]=(char)wParam;
csWbx.SearchCode(PyBuf);
}
else//其他字符,直接发送
{
memset (pwBuf,0x00,sizeof(pwBuf));
memset(szKeyBuf,0x00,sizeof(szKeyBuf));
pwBuf[0]=wParam;
// wcstombs(szKeyBuf,pwBuf,sizeof(szKeyBuf));
WideCharToMultiByte(CP_ACP,
WC_COMPOSITECHECK,
pwBuf,
wcslen(pwBuf),
szKeyBuf,
sizeof(szKeyBuf),
NULL,
NULL);
csTermCom->SendData (szKeyBuf,strlen(szKeyBuf));
}
}
break;
}
ShowWbBuf();
break;
}
}
}
}
void OnDataArrival(WORD wParam,DWORD lParam)
{
char szDataBuf[BUFLEN+1],szData[BUFLEN+1];
DWORD dwLen,dwNum;
int iMsgFrom;
// int PR2CommLen;
int j;
int retVal;
int CommLen;
int CurrCommLen;
char TestBuf[2000];
//get msg type
//iMsgFrom: 0 msg from host
// 1 msg from auxport
iMsgFrom=wParam ;
SetCursorHide();
//read data
memset(szDataBuf,0,sizeof(szDataBuf));
if(iMsgFrom==0)
{ //from host
memset(szData,0x00,sizeof(szData));
csTermCom->GetData(szDataBuf,&dwLen);
memcpy(TestBuf,szDataBuf,2000);
for(dwNum=0;dwNum</*strlen(szDataBuf)*/dwLen;dwNum++){
switch (iDirect){
/////////////////////////////////////////////////////////////////////
case 0://显示
//analyse command r
//Display(szDataBuf);
//szData[1]=0;
CommLen=0;
//szData[0]=szDataBuf[dwNum];
if (szDataBuf[dwNum]!='\x1b' && pCurrNode==pRoot){
//pDC->TextOut(m_iColPos*m_iChrWidth,m_iRowPos*m_iChrHigh,szData);
CommLen=0;
szData[strlen(szData)]=szDataBuf[dwNum];
//Display(szData);
}
else{
if (szDataBuf[dwNum]=='\x1b') //开始命令分析
{
Display(szData);
memset(szData,0x00,sizeof(szData));
fTree=0;
CommLen=0;
memset(szCurrCommand,0x00,sizeof(szCurrCommand));
pCurrNode=pRoot;
for (j=0;j<50;j++)
g_iArrPara[j]=0;
}
if (fTree==0)//无参数命令树分析
{
retVal=SearchComm(pCurrNode,szDataBuf+dwNum,&CommLen);//无参数命令分析
if (retVal==0)
dwNum=dwNum+CommLen-1;
else
{
for (j=0;j<50;j++)
g_iArrPara[j]=0;
ParaNum=1; //参数起始下标
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?