?? spconsoler.cpp
字號:
// Consoler.cpp : 實現文件
//
#include "stdafx.h"
#include "spBufferWnd.h"
/*
2003/08/14 by wenyy create
修改了窗口創建函數,將創建子窗口和彈出窗口進行了區別 CreateChildWnd & CreateAppWnd
2003/08/16 by wenyy add function
完成了printfX
2003/08/19 修正了FormatCharsAndOutput中關于每行的最后一個字符是中文第一個字符時顯示錯誤的問題
2003/08/20 針對CBufferWnd的 WM_BW_NOTIFY 消息,修改了顯示函數 FormatCharsAndOutput
將直接調用CBufferWnd::AppendTxtAtCaret 修改為通過消息進行通知,避免同時多線程時同時修改緩沖區數據
*/
CConsoler::CConsoler()
{
m_pBufWnd=NULL;
}
CConsoler::~CConsoler()
{
}
void CConsoler::SetBufferWnd(CBufferWnd* pWnd)
{
m_pBufWnd=pWnd;
}
int CConsoler::FormatCharsAndOutput(LPCSTR pszSrc,int iLen)
{
//char *pszLine= new char[m_pBufWnd->m_iWidthBuf*2 + 12];//多分配空間,減少判斷次數
char szLine[1024*2];//一個大致的判斷,每行的最大寬度
memset(szLine, 0x20,1024);
int iStart=0,iUsed=0;// iStart 緩沖區szLine的開始位置,iUsed 已經處理pszSrc中的字符數量
struct CBufferWnd::strAppendTxt strAT={TRUE,FALSE,iStart,szLine};
if(IsCtrlChar(pszSrc[0]))
{
switch (pszSrc[0])
{
case '\t': //TAB
memset(szLine,0x20,m_pBufWnd->m_iTabSize);
iStart = m_pBufWnd->m_iTabSize;
strAT.iTxtLen = iStart;
strAT.pszTxt = szLine;
//m_pBufWnd->AppendTxtAtCaret(iStart,szLine,TRUE,FALSE); // by wenyy 2003/08/20
m_pBufWnd->SendMessage(WM_BW_NOTIFY,1,(LPARAM)&strAT);
break;
case '\n': //光標移動到下一行
if(m_pBufWnd->m_ptCaret.y == m_pBufWnd->m_iHeightBuf -1)
//m_pBufWnd->ScrollTxtUp(1); // by wenyy 2003/08/20
m_pBufWnd->SendMessage(WM_BW_NOTIFY,0,0x00010020); //MAKELONG( MAKEWORD(0x20,0), MAKEWORD(0x01,0) )
else
m_pBufWnd->SetCaretPoint(m_pBufWnd->m_ptCaret.x,m_pBufWnd->m_ptCaret.y+1);
m_pBufWnd->ScrollIfPointNotShown(m_pBufWnd->m_ptCaret.x,m_pBufWnd->m_ptCaret.y);
break;
case '\r': //光標移動到第零列
m_pBufWnd->SetCaretPoint(0,m_pBufWnd->m_ptCaret.y);
m_pBufWnd->ScrollIfPointNotShown(m_pBufWnd->m_ptCaret.x,m_pBufWnd->m_ptCaret.y);
break;
}
return 1;
}
else
{
// for(int i=0;i<iLen && i<m_pBufWnd->m_iWidthBuf && !IsCtrlChar(pszSrc[i]);i++)//修改了判斷漢字結尾的方式
for( iUsed = 0; iUsed<iLen && iUsed< m_pBufWnd->m_iWidthBuf && !IsCtrlChar(pszSrc[iUsed]) ; )
{//每次只處理一行 遇到第一個控制符號就結束
if( IsDBCSLeadByte(pszSrc[iUsed]) )
{// bug
if((iStart + m_pBufWnd->m_ptCaret.x)% m_pBufWnd->m_iWidthBuf == (m_pBufWnd->m_iWidthBuf-1) )
{//當前行沒有足夠空間存儲一個漢字
szLine[iStart]=0x20;
iStart++;
//i--;//向后退一個字符,等待下一次重新處理
}
else
{//添加中文字符
//第一個字符
szLine[iStart]=pszSrc[iUsed];
iStart++;
iUsed++;
if(iUsed < iLen-1)
{//不是最后一個字符,所以還有第二個字符可以添加
szLine[iStart]=pszSrc[iUsed];
//i++;
iStart++;
iUsed++;
}
}
}
else
{
szLine[iStart]=pszSrc[iUsed];
iStart++;
iUsed++;
}
}
//m_pBufWnd->AppendTxtAtCaret(iStart,szLine,TRUE,FALSE); //by wenyy 2003/08/20
strAT.iTxtLen = iStart;
strAT.pszTxt = szLine;
m_pBufWnd->SendMessage(WM_BW_NOTIFY,1,(LPARAM)&strAT);
return iUsed;
}
return 0;
}
void CConsoler::printfX(const char *pszFormat,...)
{
if(!m_pBufWnd) return; //ASSERT(m_pBufWnd);
//Step 1 格式化數據,形成真實的數據
char szMsg[1024*8];
va_list arg_ptr;
va_start(arg_ptr,pszFormat);
memset(szMsg,0,sizeof(szMsg));
vsprintf(szMsg,pszFormat,arg_ptr);
int iLen = (int)strlen(szMsg);
int iUsed = 0;
while(iUsed < iLen)
{
iUsed += FormatCharsAndOutput(szMsg + iUsed,iLen - iUsed);
}
m_pBufWnd->Invalidate();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -