📄 ctelnetview.cpp
字号:
m_strLine += ch;
break;
}
ndx ++;
if (ndx == nBytes)
{
bLine = TRUE;
}
}
return bLine;
}
//数据处理
void CTelnetView::MessageReceived(LPCSTR pText)
{
BOOL bSkip = FALSE;
int loop=0;
CString tempStr="0123456789;";
CString tempStr2;
int ColorVal;
int tempY=0;
CDC * pDC = GetDC();
OnPrepareDC(pDC);
DrawCursor(pDC,FALSE);
CRect clip;
pDC->GetClipBox(clip);
CMainFrame * frm = (CMainFrame*)GetTopLevelFrame();
//设置颜色
pDC->SetTextColor(cTextColor);
pDC->SetBkColor(cBackgroundColor);
pDC->SelectObject(GetStockObject(ANSI_FIXED_FONT));
int length = strlen(pText);
char text[2] = {0x00, 0x00};
while(loop < length)
{
switch(pText[loop])
{
case 8: //删除
CurrentXX--;
if(CurrentXX < 0) CurrentXX = 0;
loop++;
break;
case 9: //TAB键
CurrentXX++; //TBD make this smarter
loop++;
break;
case 13: //换行CR
m_strline.Empty();
CurrentXX = 0;
loop++;
break;
case 27:
loop++;
//分析紧接着27的字符是否是91,如果不是91,则这两个字符都不作处理了,直接跳出
if (pText[loop]!=91)
{
loop++;
break;
}
//如果是91,则接下来的数据则是系统相关数据
else
{
loop++;
while (tempStr.Find(pText[loop])!=-1)
{
tempStr2+=pText[loop];
loop++;
}
if (pText[loop]=='m')//如果接下来的数据是m,则分析前面获得的字符串
{
//循环获得字符串中的值,其中字符串中的值都是以分号隔开的
while (tempStr2!="")
{
if (tempStr2.Find(";")!=-1)
{
ColorVal=atoi(tempStr2.Mid(0,tempStr2.Find(";")));
tempStr2=tempStr2.Mid(tempStr2.Find(";")+1);
}
else
{
ColorVal=atoi(tempStr2);
tempStr2.Empty();
}
//获得一个值
//改变前景颜色,这个颜色可以按照一定的规则来自定义
if (ColorVal>29 && ColorVal<38)
//cTextColor=RGB(0,0,255);
//设置背景颜色
if (ColorVal>39 && ColorVal<48)
//cBackgroundColor=RGB(0,255,ColorVal);
//恢复基本设置
if (ColorVal==0)
{
//cBackgroundColor=RGB(0,0,0);
//cTextColor=RGB(255,255,255);
}
//如果为1,则设置前景色
//if ColorVal==1
//表示要反色
//if ColorVal==7
}
}
//如果为字符K,表示要画一条以背景色的矩形区域
if (pText[loop]=='K')
{
int x,y;
CString myStr;
//保持原来的坐标
//画出矩形区域,因为以背景色画,所以相当于移动光标
//将坐标变量改变到目前的位置
x=CurrentXX;
y=CurrentYY;
for (int l=CurrentXX;l<80;l++)
{
cText[l][CurrentYY]=' ';
myStr+=' ';
}
pDC->TextOut(x*dtX, y * dtY, myStr);
CurrentXX=x;
CurrentYY=y;
}
//如果字符为C,表示要改变当前的横坐标
if (pText[loop]=='C')
{
//获得横坐标的改变量
if (tempStr2.Find(";")!=-1)
{
ColorVal=atoi(tempStr2.Mid(0,tempStr2.Find(";")));
tempStr2=tempStr2.Mid(tempStr2.Find(";")+1);
}
else
{
ColorVal=atoi(tempStr2);
tempStr2.Empty();
}
//然后增建坐标值,注意这里要加上字符宽度
CurrentXX=CurrentXX+ColorVal;
}
//如果字符为H,表示重新设置横坐标和纵坐标
if (pText[loop]=='H')
{
//获得纵坐标值,在服务器发送的过程中,先发送纵坐标值
TRACE0("H");
int tX=0,tY=0;
//char buffer3[20];
tY=atoi(tempStr2.Mid(0,tempStr2.Find(";")));
tempStr2=tempStr2.Mid(tempStr2.Find(";")+1);
//获得横坐标值,注意这里获得值是没有加字符宽度的
tX=atoi(tempStr2);
if (tX>0 && tY>0)
{
CurrentYY=tY-1;
CurrentXX=tX-1;
}
}
//如果为字符J,表示要清除整个屏幕
if (pText[loop]=='J')
{
ClearWindows(pDC);
}
}
loop++;
IfOutput=false;
break;
case 0:
loop++;
case 10: //换行
{
CurrentYY=CurrentYY+1;
if (CurrentYY>=bufferLines)
{
for(int row = 0; row < bufferLines; row++)
{
for(int col = 0; col < 80; col++)
{
cText[col][row] = cText[col][row+1];
}
}
for(int col = 0; col < 80; col++)
{
cText[col][bufferLines-1] = ' ';
}
CurrentYY=CurrentYY-1;
DoDraw(pDC);
}
}
loop++;
break;
default://输出数据
{
cText[CurrentXX][CurrentYY] = pText[loop];
m_strline.Empty();
for (int i=0;i<80;i++)
{
if (cText[i][CurrentYY]!=27)
m_strline += cText[i][CurrentYY];
else
break;
}
pDC->TextOut(0, CurrentYY * dtY, m_strline);
CurrentXX++;
}
tempStr2.Empty();
loop++;
break;
}
}
DrawCursor(pDC,TRUE);
ReleaseDC(pDC);
}
//按键处理
void CTelnetView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//发出回车键
if (nChar == VK_RETURN)
{
DispatchMessage("\r\n");
}
else
{
DispatchMessage(nChar);
}
}
//画光标
void CTelnetView::DrawCursor(CDC * pDC, BOOL pDraw)
{
COLORREF color;
CMainFrame * frm = (CMainFrame*)GetTopLevelFrame();
if(pDraw) //draw
{
color = cTextColor;
}
else //erase
{
color = cBackgroundColor;
}
CRect rect(CurrentXX * dtX + 2, CurrentYY * dtY + 1,
CurrentXX * dtX + dtX - 2, CurrentYY * dtY + dtY -1);
pDC->FillSolidRect(rect, color);
}
void CTelnetView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
if(IsWindow(m_hWnd))
{
if(IsWindowVisible())
{
//ScrollToPosition(CPoint(0, bufferLines * 1000)); //go way past the end
}
}
}
BOOL CTelnetView::OnEraseBkgnd(CDC* pDC)
{
CRect clip;
pDC->GetClipBox(clip);
CMainFrame * frm = (CMainFrame*)GetTopLevelFrame();
pDC->FillSolidRect(clip,cBackgroundColor);
return TRUE;
}
//查找字符
int CTelnetView::Find(CString str, char ch)
{
char* data = str.GetBuffer(0);
int len = str.GetLength();
int i = 0;
for(i = 0; i < len; i++){
if(data[i] == ch)
break;
}
str.ReleaseBuffer();
return i;
}
//方向键处理
void CTelnetView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
unsigned char myChar[3];
// TODO: Add your message handler code here and/or call default
//左方向键
if (nChar==37)
{
myChar[0]=27;
myChar[1]=91;
myChar[2]=68;
DispatchMessage(myChar);
}
//右方向键
else if (nChar==39)
{
myChar[0]=27;
myChar[1]=91;
myChar[2]=67;
DispatchMessage(myChar);
}
//上方向键
else if (nChar==38)
{
myChar[0]=27;
myChar[1]=91;
myChar[2]=65;
DispatchMessage(myChar);
}
//下方向键
else if (nChar==40)
{
myChar[0]=27;
myChar[1]=91;
myChar[2]=66;
DispatchMessage(myChar);
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
//MessageBox((char*)nChar);
}
//清除屏幕
void CTelnetView::ClearWindows(CDC *pDc)
{
for(int x = 0; x < 80; x++)
{
for(int y = 0; y < bufferLines; y++)
{
cText[x][y] = ' ';
}
}
DoDraw(pDc);
CurrentYY=0;
CurrentXX=0;
}
void CTelnetView::OnFileNew()
{
BOOL bOK;
// TODO: Add your command handler code here
//弹出设定服务器对话框
CHostDialog host;
host.DoModal();
cHostName = host.m_HostName;
//创建socke
cSock = new CClientSocket(this);
if(cSock != NULL)
{
bOK = cSock->Create();
if(bOK == TRUE)
{
cSock->AsyncSelect(FD_READ | FD_WRITE | FD_CLOSE | FD_CONNECT | FD_OOB);
//连接服务器
cSock->Connect(cHostName, 23);
//设定标题
GetDocument()->SetTitle(cHostName);
Sleep(90);
}
else
{
ASSERT(FALSE);
delete cSock;
cSock = NULL;
}
}
else
{
AfxMessageBox("不能创建socket",MB_OK);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -