首页  编辑  

控制台程序文本颜色和Win98的BUG

Tags: /超级猛料/Console.控制台程序/   Date Created:
在WinXP里面,窗口的滚动对文本的颜色不会有任何问题,但是在Win98里面,一旦控制台文本需要向上滚动,就会导致你的颜色文本显示错误,应该是Win98的控制台对屏幕缓冲区控制有BUG,所以必须受冻滚动文本显示,否则颜色显示不正常!
procedure WriteEx(const S: string; Color: Word);
{
 写入控制台屏幕文本,可以指定颜色,颜色参考控制台API的定义
}
var
 Written: DWord;
 TmpAtt: TConsoleScreenBufferInfo;
 OldAtt: Word;
 Console: THandle;
begin
 Console := OutputHandle;
 GetConsoleScreenBufferInfo(Console, TmpAtt);
 OldAtt := TmpAtt.wAttributes; /// 保存原来的文本属性
 SetConsoleTextAttribute(Console, Color); /// 设定颜色
 WriteConsole(Console, PChar(S), Length(S), Written, nil);
 /// 恢复原来的颜色
 SetConsoleTextAttribute(Console, OldAtt);
end;

procedure WriteLnEx(const S: string; Color: Word);
{
 写入控制台屏幕文本,可以指定颜色,颜色参考控制台API的定义
}
var
 c: TCoord;
 ci: TCharInfo;
 sr: TSmallRect;
 TmpAtt: TConsoleScreenBufferInfo;
 Written: DWord;
 OldAtt: Word;
 Console: THandle;
begin
 Console := OutputHandle;
 GetConsoleScreenBufferInfo(Console, TmpAtt);
 OldAtt := TmpAtt.wAttributes; /// 保存原来的文本属性
 SetConsoleTextAttribute(Console, Color); /// 设定颜色
 WriteConsole(Console, PChar(S), Length(S), Written, nil);
 /// 处理换行
 GetConsoleScreenBufferInfo(Console, TmpAtt);
 if TmpAtt.dwCursorPosition.Y >= Pred(TmpAtt.dwSize.Y) then
 begin /// Win98,窗口滚动有问题,必须修正
   // 滚动范围
   sr.Left := 0;
   sr.Top := 1;
   sr.Right := TmpAtt.dwSize.X;
   sr.Bottom := TmpAtt.dwSize.Y;
   // 滚动的新坐标,本处为向上滚动一行
   c.X := 0;
   c.Y := 0;
   // 以空格,前文字属性填充滚动出来的空白
   ci.UniCodeChar := #32;
   ci.Attributes := OldAtt;
   ScrollConsoleScreenBuffer(Console, sr, nil, c, ci);
   c.X := 0;
   c.Y := TmpAtt.srWindow.Bottom;
   SetConsoleCursorPosition(Console, c);
 end
 else
 begin /// 未到最后一行,不需要做任何处理
   c.X := 0;
   c.Y := TmpAtt.dwCursorPosition.Y + 1;
   SetConsoleCursorPosition(Console, c);
 end;
 /// 恢复原来的颜色
 SetConsoleTextAttribute(Console, OldAtt);
end;