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