网上某些关于Edit自动滚动底部方法有字数限制缺陷. 以下方法可以解决
>Step1.首先定义全局变量 CEdit* g_showEdit ,然后在OnInitDialog 赋值 ,IDC_XXX为显示的控件ID,而且控件需要设置使能多行显示
g_showEdit=(CEdit*)GetDlgItem(IDC_XXX);
g_showEdit->SetLimitText(-1);
>Step2.在需要显示的函数中使用如下函数代码
void AddText(CString strDat)
{
int nLen=g_showEdit->GetWindowTextLength();//获取控件中内容的大小
g_showEdit->SetSel (nLen, nLen);//将光标位置跳到最后一个字符
g_showEdit->ReplaceSel(strDat);//继续写入内容
}
//=============RichEdit 作为日志输出控件===============
//1.绑定RichEditCtrl控件变量m_EditData
//2.定义全局变量
CDlgXXX *g_thisDlg = NULL; //在Dlg初始化中赋值g_thisDlg=this;
CHARFORMAT2 g_cf;
COLORREF g_txtColor_save =-1;
COLORREF g_gndColor_save =-1;
//与linux的printf颜色方案兼容
//0 黑色 1 红色 2 绿色 3 黄色 4 蓝色 5 品红 6 青色 7 白色
COLORREF MakeLogColorConfig(int i){
if ( i == 0 ) return RGB(0,0,0);
if ( i == 1 ) return RGB(255,0,0);
if ( i == 2 ) return RGB(0,255,0);
if ( i == 3 ) return RGB(255,255,0);
if ( i == 4 ) return RGB(0,0,255);
if ( i == 5 ) return RGB(230,30,70);
if ( i == 6 ) return RGB(0,255,255);
if ( i == 7 ) return RGB(255,255,255);
return 0;
}
//初始化RichEdit,在OnInitDiaglog中调用
void CDlgXXX::Initial_richEdit_log(){
g_txtColor_save= RGB(229, 255, 229);
g_gndColor_save= RGB(0, 51, 0);
m_EditData.SetBackgroundColor(FALSE,g_gndColor_save);
ZeroMemory(&g_cf, sizeof(g_cf));
g_cf.cbSize = sizeof(CHARFORMAT2);
g_cf.dwMask = CFM_COLOR | CFM_FACE | CFM_SIZE | CFM_BACKCOLOR ;
g_cf.crBackColor = g_gndColor_save; // 背景色
g_cf.crTextColor = g_txtColor_save; //文字颜色
g_cf.yHeight = 200; //字体高度
_tcscpy(g_cf.szFaceName, _T("MS Shell Dlg(9)"));//字体选择
m_EditData.SetSelectionCharFormat(g_cf);
m_EditData.SetSel(-1, -1);
}
void AddText_Color(CString str , int txtColor , int gndColor){
long nStart = 0;
long nEnd= 0;
long nBeginPos = 0;
long nFinishPos = 0;
g_thisDlg->m_EditData.SetSel(-1, -1);
g_thisDlg->m_EditData.GetSel(nStart,nEnd);
nBeginPos = nStart;
g_thisDlg->m_EditData.SetSel(-1, -1);
g_thisDlg->m_EditData.ReplaceSel( (LPCTSTR)str );
g_thisDlg->m_EditData.GetSel(nStart,nEnd);
nFinishPos = nEnd;
if(txtColor>=0)
g_cf.crTextColor = MakeLogColorConfig(txtColor);
else
g_cf.crTextColor = g_txtColor_save;
if(gndColor>=0)
g_cf.crBackColor = MakeLogColorConfig(gndColor);
else
g_cf.crBackColor = g_gndColor_save;
g_thisDlg->m_EditData.SetSel(nBeginPos,nFinishPos);
g_cf.dwMask |= CFM_COLOR | CFM_BACKCOLOR ;
g_thisDlg->m_EditData.SetSelectionCharFormat(g_cf);
//g_thisDlg->m_EditData.LineScroll (g_thisDlg->m_EditData.GetLineCount(), 0);//滚动到最后一行显示
g_thisDlg->SendDlgItemMessage(IDC_RICHEDIT21,WM_VSCROLL, SB_BOTTOM,0);//IDC-richedit
}
void AddLogger(CString str){
CString allStr;
SYSTEMTIME sysTm;
GetSystemTime( &sysTm );
allStr.Format("[%02d:%02d:%02d.%d] ",sysTm.wHour+8%24,sysTm.wMinute,sysTm.wSecond,sysTm.wMilliseconds/100);
allStr+=str+"\n";
AddText_Color(allStr,-1,-1);
}
//格式化打印日志
void PrintMsg(char* fmt, ...)
{
#define MAX_LOG_LENGTH (1024*2)
char* buf = new char[MAX_LOG_LENGTH];//注意输出最大长度限制
va_list args;
va_start(args, fmt);
vsprintf_s(buf,MAX_LOG_LENGTH, fmt, args);
va_end(args);
//添加系统时间前缀
SYSTEMTIME sysTm;
CString tmStr;
GetSystemTime( &sysTm);
tmStr.Format("[%02d:%02d:%02d]",(sysTm.wHour+8)%24,sysTm.wMinute,sysTm.wSecond);
OutputDebugString(tmStr);
OutputDebugString(buf);//日志本体
OutputDebugString("\r\n");
free(buf);
return;
}
//include<time.h>
#define Println(fmt,args...) do{\
time_t timep;struct tm *pt;char timeStr[28];\
time (&timep);pt=gmtime(&timep);\
sprintf(timeStr,"[%02d:%02d:%02d]",(pt->tm_hour+8)%24,pt->tm_min,pt->tm_sec);\
OutputDebugString("%s "fmt"\n",timeStr,##args);\
}while(0)
//打印文件名,函数名,行号+日志内容
#define PRINT(format, args...) \
{ \
char temp[128] = "%s(%s:%d): "; \
strcat(temp, format); \
printf(temp, __FILE__, __FUNCTION__, __LINE__, ##args); \
}
#define PRINT_FORMAT(buf, len, format) do{unsigned int i;printf("[");for(i=0;i<len;i++){if(0==(i%16)&&0!=i)printf("\n");char *p=(char*)buf;printf(format, (p[i]&0xff));}printf("]\n");}while(0)
#define PRINT_BUF(buf, len) PRINT_FORMAT(buf, len, "%02x ")
//该宏定义只能用在C中,c++兼容
#define PRINT(title,fmt,args...) printf("{"#title":"fmt"}\n",##args)