龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

控制台窗口界面的编程控制(四)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
七、滚动和移动 ScrollConsoleScreenBuffer是实现文本区滚动和移动的API函数。它可以将指定的一块文本区域移动到另一个区域,被移空的那块区域由指定字符填充。函数的原型如下: BOOL S

  七、滚动和移动

  

  ScrollConsoleScreenBuffer是实现文本区滚动和移动的API函数。它可以将指定的一块文本区域移动到另一个区域,被移空的那块区域由指定字符填充。函数的原型如下:

  

  

BOOL ScrollConsoleScreenBuffer(

  HANDLE hConsoleOutput, // 句柄

  CONST SMALL_RECT* lpScrollRectangle, // 要滚动或移动的区域

  CONST SMALL_RECT* lpClipRectangle, // 裁剪区域

  COORD dwDestinationOrigin, // 新的位置

  CONST CHAR_INFO* lpFill // 填充字符

  );

  利用这个API函数还可以实现删除指定行的操作。下面来举一个例子,程序如下:

  

  

#include

  #include

  #include

  HANDLE hOut;

  void DeleteLine(int row); // 删除一行

  void MoveText(int x, int y, SMALL_RECT rc); // 移动文本块区域

  void ClearScreen(void); // 清屏

  void main()

  {

   hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄

   Word att = FOREGROUND_RED FOREGROUND_GREEN FOREGROUND_INTENSITY   

   BACKGROUND_BLUE ;

   // 背景是蓝色,文本颜色是黄色

   SetConsoleTextAttribute(hOut, att);

   ClearScreen();

   printf("

The soul selects her own society,

");

   printf("Then shuts the door;

");

   printf("On her devine majority;

");

   printf("OBTrude no more.

");

   CONSOLE_SCREEN_BUFFER_INFO bInfo;

   GetConsoleScreenBufferInfo( hOut, &bInfo );

   COORD endPos = {0, bInfo.dwSize.Y - 1};

   SetConsoleCursorPosition(hOut, endPos); // 设置光标位置

   SMALL_RECT rc = {0, 2, 40, 5};

   _getch();

   MoveText(10, 5, rc);

   _getch();

   DeleteLine(5);

   CloseHandle(hOut); // 关闭标准输出设备句柄

  }

  

  void DeleteLine(int row)

  {

   SMALL_RECT rcScroll, rcClip;

   COORD crDest = {0, row - 1};

   CHAR_INFO chFill;

   CONSOLE_SCREEN_BUFFER_INFO bInfo;

   GetConsoleScreenBufferInfo( hOut, &bInfo );

   rcScroll.Left = 0;

   rcScroll.Top = row;

   rcScroll.Right = bInfo.dwSize.X - 1;

   rcScroll.Bottom = bInfo.dwSize.Y - 1;

   rcClip = rcScroll;

   chFill.Attributes = bInfo.wAttributes;

   chFill.Char.AsciiChar = ;

   ScrollConsoleScreenBuffer(hOut, &rcScroll, &rcClip, crDest, &chFill);

  }

  

  void MoveText(int x, int y, SMALL_RECT rc)

  {

   COORD crDest = {x, y};

   CHAR_INFO chFill;

   CONSOLE_SCREEN_BUFFER_INFO bInfo;

   GetConsoleScreenBufferInfo( hOut, &bInfo );

   chFill.Attributes = bInfo.wAttributes;

   chFill.Char.AsciiChar = ;

   ScrollConsoleScreenBuffer(hOut, &rc, NULL, crDest, &chFill);

  }

  

  void ClearScreen(void)

  {

   CONSOLE_SCREEN_BUFFER_INFO bInfo;

   GetConsoleScreenBufferInfo( hOut, &bInfo );

   COORD home = {0, 0};

   WORD att = bInfo.wAttributes;

   unsigned long size = bInfo.dwSize.X * bInfo.dwSize.Y;

   FillConsoleOutputAttribute(hOut, att, size, home, NULL);

   FillConsoleOutputCharacter(hOut, , size, home, NULL);

  }

  

  程序中,实现删除行的操作DeleteLine的基本原理是:首先将裁剪区域和移动区域都设置成指定行row(包括该行)以下的控制台窗口区域,然后将移动的位置指定为(0, row-1)。

  

这样,超出裁剪区域的内容被裁剪掉,从而达到删除行的目的。

  

  需要说明的是,若裁剪区域参数为NULL,则裁剪区域为整个控制台窗口。

  

精彩图集

赞助商链接