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 + -
显示快捷键?