?? 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 + -