wbx.cpp
来自「vt100终端仿真程序」· C++ 代码 · 共 498 行
CPP
498 行
// Wbx.cpp: implementation of the CWbx class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <malloc.h>
#include "vt100.h"
#include "codeconvert.h"
#include "Wbx.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern CCodeConvert csCodeConv;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWbx::CWbx()
{
}
CWbx::~CWbx()
{
}
int CWbx::Init()
{
int iNum,iLen;
FILE *hFile;
char szTemp[600];
iIndex=0;
memset(szGbBuf1,0,sizeof(szGbBuf1));
memset(szGbBuf2,0,sizeof(szGbBuf2));
memset(szGbBuf3,0,sizeof(szGbBuf3));
hFile=fopen("\\disk\\wbx.txt","r");
if(hFile==NULL)
return 1;
fgets(szGbBuf1,60,hFile);
szGbBuf1[50]=0;
for(iNum=0;iNum<25;iNum++){
if(!feof(hFile)){
fgets(&szGbBuf2[iNum][0],60,hFile);
szGbBuf2[iNum][50]=0;
}
}
if(iNum<25){
fclose(hFile);
return 2;
}
for(iNum=0;iNum<625;iNum++){
if(!feof(hFile)){
memset(szTemp,0,sizeof(szTemp));
fgets(szTemp,600,hFile);
iLen=strlen(szTemp);
szTemp[iLen-1]=0;
if((szGbBuf3[iNum]=(char *)malloc(iLen))==NULL){
break;
}
else{
strcpy(szGbBuf3[iNum],szTemp);
}
}
}
if(iNum<625){
fclose(hFile);
return 2;
}
fclose(hFile);
return 0;
}
int CWbx::Release()
{
int iNum;
for(iNum=0;iNum<625;iNum++){
free(szGbBuf3[iNum]);
}
return 0;
}
int CWbx::PageUp()
{
int iLen,iLoop,iNum,iRow,iCol;
iLen=strlen(szCurCode);
switch(iLen){
case 1:
iRow=szCurCode[0]-'a';
iCol=szEndCode[0]-'a'-strlen(szGbBuf)/2+1;
if(iCol<0)
return 0;
szEndCode[0]=szEndCode[0]-strlen(szGbBuf)/2;
if((iCol-8)==-1){
szGbBuf[0]=szGbBuf1[iRow*2];
szGbBuf[1]=szGbBuf1[iRow*2+1];
}
else{
szGbBuf[0]=szGbBuf2[iRow][iCol*2-16];
szGbBuf[1]=szGbBuf2[iRow][iCol*2-15];
}
for(iNum=2;iNum<16;iNum++){
szGbBuf[iNum]=szGbBuf2[iRow][(iCol+1)*2-16];
szGbBuf[iNum+1]=szGbBuf2[iRow][(iCol+1)*2-15];
szGbBuf[iNum+2]=0;
iNum++;
iCol++;
}
break;
case 2:
iNum=0;
while(strncmp(szCurWbBuf3+iNum*2,szEndCode,2)!=0){
iNum++;
}
iCol=(iNum+1)*2-strlen(szGbBuf);
if(iCol<0)
return 0;
if((iCol-16)<0){
iRow=szCurCode[0]-'a';
iNum=szCurCode[1]-'a';
szGbBuf[0]=szGbBuf2[iRow][iNum*2];
szGbBuf[1]=szGbBuf2[iRow][iNum*2+1];
}
else{
szGbBuf[0]=szCurGbBuf3[iCol-14];
szGbBuf[1]=szCurGbBuf3[iCol-13];
}
iLoop=2;
while(iLoop<16){
szGbBuf[iLoop]=szCurGbBuf3[iCol-14];
szGbBuf[iLoop+1]=szCurGbBuf3[iCol-13];
szGbBuf[iLoop+2]=0;
iLoop+=2;iCol+=2;
}
strncpy(szEndCode,szCurWbBuf3+iCol-16,2);
break;
default:
return 1;
}
return 0;
}
int CWbx::Select(int iIndex,WORD *pwGbCode)
{
if(strlen(szGbBuf)!=0){
*pwGbCode=MAKEWORD((unsigned char)szGbBuf[iIndex*2],(unsigned char)szGbBuf[iIndex*2+1]);
}
return 0;
}
int CWbx::SearchCode(char *pszInBuf)
{
int iLen,iBufLen,iLoop;
int iRow,iCol;
strcpy(szCurCode,pszInBuf);
iLen=strlen(szCurCode);
switch(iLen){
case 1:
memset(szGbBuf,0,sizeof(szGbBuf));
memset(szEndCode,0,sizeof(szEndCode));
//get 1
iCol=szCurCode[0]-'a';
szGbBuf[0]=szGbBuf1[iCol*2];
szGbBuf[1]=szGbBuf1[iCol*2+1];
//get 2,max to 7
iRow=iCol;
strncpy(szGbBuf+2,szGbBuf2[iRow],14);
szEndCode[0]='a'+6;
break;
case 2:
memset(szGbBuf,0,sizeof(szGbBuf));
memset(szEndCode,0,sizeof(szEndCode));
iRow=szCurCode[0]-'a';
iCol=szCurCode[1]-'a';
//get 2
szGbBuf[0]=szGbBuf2[iRow][iCol*2];
szGbBuf[1]=szGbBuf2[iRow][iCol*2+1];
//get 3 , max to 7
GetGbBuf3();
iBufLen=strlen(szCurGbBuf3);
if(iBufLen==0)
break;;
if(iBufLen>14){
strncpy(szGbBuf+2,szCurGbBuf3,14);
szEndCode[0]=szCurWbBuf3[12];
szEndCode[1]=szCurWbBuf3[13];
}
else{
strcpy(szGbBuf+2,szCurGbBuf3);
szEndCode[0]=szCurWbBuf3[iBufLen-2];
szEndCode[1]=szCurWbBuf3[iBufLen-1];
}
break;
case 3:
iLen=0;
while(szCurWbBuf3[iLen]!=szCurCode[2]&&iLen<strlen(szCurWbBuf3)){
iLen+=2;
}
if(iLen<strlen(szCurWbBuf3)){
memset(szGbBuf,0,sizeof(szGbBuf));
memset(szEndCode,0,sizeof(szEndCode));
iLoop=0;
while(szCurWbBuf3[iLen]==szCurCode[2]){
szGbBuf[iLoop]=szCurGbBuf3[iLen];
szGbBuf[iLoop+1]=szCurGbBuf3[iLen+1];
iLen+=2;iLoop+=2;
}
}
else{
szCurCode[2]=0;
}
break;
case 4:
iLen=0;
while((szCurWbBuf3[iLen]!=szCurCode[2]||szCurWbBuf3[iLen+1]!=szCurCode[3])&&iLen<strlen(szCurWbBuf3)){
iLen+=2;
}
if(iLen<strlen(szCurWbBuf3)){
memset(szGbBuf,0,sizeof(szGbBuf));
memset(szEndCode,0,sizeof(szEndCode));
iLoop=0;
while(szCurWbBuf3[iLen+1]==szCurCode[3]){
szGbBuf[iLoop]=szCurGbBuf3[iLen];
szGbBuf[iLoop+1]=szCurGbBuf3[iLen+1];
iLen+=2;iLoop+=2;
}
}
else
szCurCode[3]=0;
break;
default:
memset(szGbBuf,0,sizeof(szGbBuf));
memset(szEndCode,0,sizeof(szEndCode));
break;
}
return 0;
}
int CWbx::GetDispBuf(wchar_t *pszDispBuf)
{
int iLen,iLoop,iCol,iRow;
wchar_t wszTemp[80];
WORD wGB;
wcscpy(pszDispBuf,TEXT("五笔:"));
memset(wszTemp,0,sizeof(wszTemp));
mbstowcs(wszTemp,szCurCode,sizeof(szCurCode));
wcscat(pszDispBuf,wszTemp);
wcscat(pszDispBuf,TEXT(" "));
iLen=strlen(szCurCode);
switch(iLen){
case 1:
if((szEndCode[0]-'a')==6){
wcscat(pszDispBuf,TEXT("0:"));
wGB=MAKEWORD((unsigned char)szGbBuf[0],(unsigned char)szGbBuf[1]);
csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
pszDispBuf[wcslen(pszDispBuf)]=' ';
for(iLoop=0;iLoop<7;iLoop++){
pszDispBuf[wcslen(pszDispBuf)]='1'+iLoop;
pszDispBuf[wcslen(pszDispBuf)]=':';
wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2+2],(unsigned char)szGbBuf[iLoop*2+3]);
csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
pszDispBuf[wcslen(pszDispBuf)]='a'+iLoop;
pszDispBuf[wcslen(pszDispBuf)]=' ';
}
}
else{
iCol=szEndCode[0]-'a'-strlen(szGbBuf)/2+1;
for(iLoop=0;iLoop<strlen(szGbBuf)/2;iLoop++){
pszDispBuf[wcslen(pszDispBuf)]='0'+iLoop;
pszDispBuf[wcslen(pszDispBuf)]=':';
wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2],(unsigned char)szGbBuf[iLoop*2+1]);
csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
pszDispBuf[wcslen(pszDispBuf)]='a'+iCol;
pszDispBuf[wcslen(pszDispBuf)]=' ';
iCol++;
}
}
break;
case 2:
iCol=0;
while(strncmp(szCurWbBuf3+iCol*2,szEndCode,2)!=0){
iCol++;
}
if(iCol==6){
wcscat(pszDispBuf,TEXT("0:"));
wGB=MAKEWORD((unsigned char)szGbBuf[0],(unsigned char)szGbBuf[1]);
csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
pszDispBuf[wcslen(pszDispBuf)]=' ';
for(iLoop=0;iLoop<7;iLoop++){
pszDispBuf[wcslen(pszDispBuf)]='1'+iLoop;
pszDispBuf[wcslen(pszDispBuf)]=':';
wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2+2],(unsigned char)szGbBuf[iLoop*2+3]);
csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
pszDispBuf[wcslen(pszDispBuf)]=szCurWbBuf3[iLoop*2];
pszDispBuf[wcslen(pszDispBuf)]=szCurWbBuf3[iLoop*2+1];
pszDispBuf[wcslen(pszDispBuf)]=' ';
}
}
else{
iCol=iCol-strlen(szGbBuf)/2+1;
for(iLoop=0;iLoop<strlen(szGbBuf)/2;iLoop++){
pszDispBuf[wcslen(pszDispBuf)]='0'+iLoop;
pszDispBuf[wcslen(pszDispBuf)]=':';
wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2],(unsigned char)szGbBuf[iLoop*2+1]);
csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
pszDispBuf[wcslen(pszDispBuf)]=szCurWbBuf3[iCol*2];
pszDispBuf[wcslen(pszDispBuf)]=szCurWbBuf3[iCol*2+1];
pszDispBuf[wcslen(pszDispBuf)]=' ';
iCol++;
}
}
break;
case 3:
iCol=0;
while(szCurWbBuf3[iCol]!=szCurCode[2]&&iCol<strlen(szCurWbBuf3)){
iCol+=2;
}
for(iLoop=0;iLoop<strlen(szGbBuf)/2;iLoop++){
pszDispBuf[wcslen(pszDispBuf)]='0'+iLoop;
pszDispBuf[wcslen(pszDispBuf)]=':';
wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2],(unsigned char)szGbBuf[iLoop*2+1]);
csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
pszDispBuf[wcslen(pszDispBuf)]=szCurWbBuf3[iCol+1];
pszDispBuf[wcslen(pszDispBuf)]=' ';
iCol+=2;
}
break;
case 4:
iCol=0;
while((szCurWbBuf3[iCol]!=szCurCode[2]||szCurWbBuf3[iCol+1]!=szCurCode[3])&&iLen<strlen(szCurWbBuf3)){
iCol+=2;
}
for(iLoop=0;iLoop<strlen(szGbBuf)/2;iLoop++){
pszDispBuf[wcslen(pszDispBuf)]='0'+iLoop;
pszDispBuf[wcslen(pszDispBuf)]=':';
wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2],(unsigned char)szGbBuf[iLoop*2+1]);
csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
pszDispBuf[wcslen(pszDispBuf)]=' ';
iCol+=2;
}
break;
}
return 0;
}
int CWbx::GetGbBuf3()
{
int iLen,iNum;
int iRow,iCol;
iLen=strlen(szCurCode);
iRow=szCurCode[0]-'a';
iCol=szCurCode[1]-'a';
iRow=iRow*25+iCol;
memset(szCurWbBuf3,0,sizeof(szCurWbBuf3));
memset(szCurGbBuf3,0,sizeof(szCurGbBuf3));
if(iLen==2){
iNum=0;iLen=0;
while(szGbBuf3[iRow][iNum]!=0){
while((unsigned char)szGbBuf3[iRow][iNum]>=0xa1){
szCurWbBuf3[iLen]=szCurWbBuf3[iLen-2];
szCurWbBuf3[iLen+1]=szCurWbBuf3[iLen-1];
szCurGbBuf3[iLen]=szGbBuf3[iRow][iNum];
szCurGbBuf3[iLen+1]=szGbBuf3[iRow][iNum+1];
iNum+=2;iLen+=2;
}
szCurWbBuf3[iLen]=szGbBuf3[iRow][iNum];
szCurWbBuf3[iLen+1]=szGbBuf3[iRow][iNum+1];
szCurGbBuf3[iLen]=szGbBuf3[iRow][iNum+2];
szCurGbBuf3[iLen+1]=szGbBuf3[iRow][iNum+3];
iNum+=4;iLen+=2;
}
}
return 0;
}
int CWbx::PageDown()
{
int iLen,iLoop,iNum,iRow;
iLen=strlen(szCurCode);
switch(iLen){
case 1:
iNum=0;
iRow=szCurCode[0]-'a';
iLoop=(szEndCode[0]-'a'+1)*2;
while(szGbBuf2[iRow][iLoop]!=0&&iNum<16){
szGbBuf[iNum]=szGbBuf2[iRow][iLoop];
szGbBuf[iNum+1]=szGbBuf2[iRow][iLoop+1];
szGbBuf[iNum+2]=0;
iLoop+=2;iNum+=2;
}
szEndCode[0]=szEndCode[0]+iNum/2;
break;
case 2:
iNum=0;
while(strncmp(szCurWbBuf3+iNum*2,szEndCode,2)!=0){
iNum++;
}
iLoop=0;
iNum=(iNum+1)*2;
while(iNum<strlen(szCurGbBuf3)&&iLoop<16){
szGbBuf[iLoop]=szCurGbBuf3[iNum];
szGbBuf[iLoop+1]=szCurGbBuf3[iNum+1];
szGbBuf[iLoop+2]=0;
iLoop+=2;iNum+=2;
}
strncpy(szEndCode,szCurWbBuf3+iNum-2,2);
break;
default:
return 1;
}
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?