cout和printf的问题
我希望向stdout输出的时候,固定住命令行下面三行来显示版权信息和程序运行的状态信息,日志信息从第四行开始滚动,不会冲掉上面三行,应该怎么写cout和printf语句?
[解决办法]
那就wx做界面,跨平台的gui库。
[解决办法]
控制台底下三行显示版权信息,上面不停卷动
#include <windows.h>
#include <stdio.h>
void PrintLastError()
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR) &lpMsgBuf,
0, NULL );
fprintf(stderr, "%s\n ",(LPSTR)&lpMsgBuf);
LocalFree(lpMsgBuf);
}
class COutputConsoleFixedInfo
{
public:
COutputConsoleFixedInfo(const char **pFixedInfo, int size )
{
CONSOLE_SCREEN_BUFFER_INFO conInfo;
m_hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if( !GetConsoleScreenBufferInfo(m_hStdout,&conInfo) )
{
PrintLastError();
}
int i;
for( i=0; i <240; i++ )
{
m_chiBuffer[i].Attributes=conInfo.wAttributes;
m_chiBuffer[i].Char.AsciiChar= ' ';
m_blankBuffer[i].Attributes=conInfo.wAttributes;
m_blankBuffer[i].Char.AsciiChar= ' ';
}
size_t base = 0;
for( i=0; i <size; i++ )
{
size_t strLen = strlen(pFixedInfo[i]);
for( int j=0; j <80; j++ )
{
if( j> =strLen ){break;}
m_chiBuffer[j+base].Char.AsciiChar=pFixedInfo[i][j];
}
base+=80;
if( i==2 )
{
break;
}
}
}
bool PrintFixedInfo()
{
SMALL_RECT srctWriteRect;
COORD coordBufSize;
COORD coordBufCoord;
CONSOLE_SCREEN_BUFFER_INFO conInfo;
SHORT topOfFixedInfo;
if( !GetConsoleScreenBufferInfo(m_hStdout,&conInfo) )
{
return false;
}
topOfFixedInfo = conInfo.srWindow.Bottom-2;
if( conInfo.dwCursorPosition.Y> =topOfFixedInfo )
{
if( !ScrollUpLines(conInfo.dwCursorPosition.Y-topOfFixedInfo) )
{
return false;
}
COORD mCur = conInfo.dwCursorPosition;
mCur.Y-=conInfo.dwCursorPosition.Y-topOfFixedInfo;
if( !SetConsoleCursorPosition(m_hStdout,mCur ) )
{
return false;
}
}
coordBufSize.Y = 3;
coordBufSize.X = 80;
coordBufCoord.X = 0;
coordBufCoord.Y = 0;
srctWriteRect.Top = topOfFixedInfo;
srctWriteRect.Left = conInfo.srWindow.Left;
srctWriteRect.Bottom = conInfo.srWindow.Bottom;
srctWriteRect.Right = conInfo.srWindow.Right;
if( !WriteConsoleOutput(
m_hStdout, // screen buffer to write to
m_chiBuffer, // buffer to copy from
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left src cell in chiBuffer
&srctWriteRect) ) // dest. screen buffer rectangle
{
return false;
}
return true;
}
bool ClearFixedInfo()
{
SMALL_RECT srctWriteRect;
COORD coordBufSize;
COORD coordBufCoord;
CONSOLE_SCREEN_BUFFER_INFO conInfo;
SHORT topOfFixedInfo;
if( !GetConsoleScreenBufferInfo(m_hStdout,&conInfo) )
{
return false;
}
topOfFixedInfo = conInfo.srWindow.Bottom-2;
coordBufSize.Y = 3;
coordBufSize.X = 80;
coordBufCoord.X = 0;
coordBufCoord.Y = 0;
srctWriteRect.Top = topOfFixedInfo;
srctWriteRect.Left = conInfo.srWindow.Left;
srctWriteRect.Bottom = conInfo.srWindow.Bottom;
srctWriteRect.Right = conInfo.srWindow.Right;
if( !WriteConsoleOutput(
m_hStdout, // screen buffer to write to
m_blankBuffer, // buffer to copy from
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left src cell in chiBuffer
&srctWriteRect)) // dest. screen buffer rectangle
{
return false;
}
return true;
}
bool ScrollUpLines(int lines)
{
SMALL_RECT srctScrollRect, srctClipRect;
CHAR_INFO chiFill;
COORD coordDest;
CONSOLE_SCREEN_BUFFER_INFO conInfo;
if( !GetConsoleScreenBufferInfo(m_hStdout,&conInfo) )
{
return false;
}
srctScrollRect.Left = conInfo.srWindow.Left;
srctScrollRect.Top = conInfo.srWindow.Top;
srctScrollRect.Bottom = conInfo.srWindow.Bottom;
srctScrollRect.Right = conInfo.srWindow.Right ;
coordDest.X = srctScrollRect.Left;
coordDest.Y = srctScrollRect.Top-lines;
srctClipRect = srctScrollRect;
chiFill.Attributes = conInfo.wAttributes;
chiFill.Char.AsciiChar = (char) ' ';
if(!ScrollConsoleScreenBuffer(m_hStdout,
&srctScrollRect, // scrolling rectangle
&srctClipRect, // clipping rectangle
coordDest, // top left destination cell
&chiFill)) // fill character and color
{
return false;
}
return true;
}
CHAR_INFO m_blankBuffer[240];
CHAR_INFO m_chiBuffer[240]; // [3][80];
HANDLE m_hStdout;
};
void main()
{
char *info[] = { "copyright by XXX ", "ZZZ@2005 ", "dddd "};
COutputConsoleFixedInfo cr((const char**)info,3);
if( !cr.PrintFixedInfo() ){PrintLastError();return;}
if( !cr.ClearFixedInfo() ){PrintLastError();return;}
for(int i=0; i <25;i++)
fprintf(stdout, "%d\n ",i+1);
if( !cr.PrintFixedInfo() ){PrintLastError();return;}
Sleep(1000);
if( !cr.ClearFixedInfo() ){PrintLastError();return;}
for( i=0; i <2;i++)
fprintf(stdout, "%d\n ",i+1);
if( !cr.PrintFixedInfo() ){PrintLastError();return;}
Sleep(1000);
}