⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spconsoler.cpp

📁 窗口类CBufferWnd:能够作为子窗口或者时弹出窗口支持滚动
💻 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 + -