国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

控制臺窗口界面的編程控制(四)

2019-11-17 05:12:25
字體:
來源:轉載
供稿:網友

  七、滾動和移動

  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("Then shuts the door;/n");
 printf("On her devine majority;/n");
 printf("OBTrude no more./n/n");
 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,則裁剪區域為整個控制臺窗口。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沽源县| 延庆县| 霸州市| 三都| 毕节市| 宜宾县| 称多县| 醴陵市| 安新县| 道真| 盈江县| 微博| 赤峰市| 微山县| 陕西省| 会泽县| 伊吾县| 大足县| 景德镇市| 兰西县| 青冈县| 临洮县| 怀集县| 连云港市| 本溪| 龙海市| 正安县| 睢宁县| 麟游县| 荔波县| 黎平县| 湖北省| 西华县| 高州市| 城口县| 陆丰市| 精河县| 六安市| 措美县| 阿拉善盟| 高要市|