00. 目录

01. CHAR_INFO结构

指定Unicode或ANSI字符及其属性。控制台功能使用此结构来读取和写入控制台屏幕缓冲区。

类型声明

typedef struct _CHAR_INFO {
union {
WCHAR UnicodeChar;
CHAR AsciiChar;
} Char;
WORD Attributes;
} CHAR_INFO, *PCHAR_INFO;

UnicodeChar

屏幕缓冲区字符单元格的Unicode字符。

AsciiChar

屏幕缓冲区字符单元格的ANSI字符。

Attributes

字符属性。该成员可以是零或以下值的任意组合。

含义
FOREGROUND_BLUE 0x0001 文字颜色包含蓝色。
FOREGROUND_GREEN 0x0002 文字颜色包含绿色。
FOREGROUND_RED 0x0004 文字颜色包含红色。
FOREGROUND_INTENSITY 0x0008 文字颜色加强。
BACKGROUND_BLUE 0x0010 背景颜色包含蓝色。
BACKGROUND_GREEN 0x0020 背景颜色包含绿色。
BACKGROUND_RED 0x0040 背景颜色包含红色。
BACKGROUND_INTENSITY 0x0080 背景颜色加剧。
COMMON_LVB_LEADING_BYTE 0x0100 前导字节。
COMMON_LVB_TRAILING_BYTE 0x0200 尾随字节。
COMMON_LVB_GRID_HORIZONTAL 0x0400 顶部水平
COMMON_LVB_GRID_LVERTICAL 0x0800 左垂直。
COMMON_LVB_GRID_RVERTICAL 0x1000 正确的垂直。
COMMON_LVB_REVERSE_VIDEO 0x4000 反转前景和背景属性。
COMMON_LVB_UNDERSCORE 0x8000 下划线。

02. ScrollConsoleScreenBuffer函数

在屏幕缓冲区中移动数据块。通过指定剪切矩形可以限制移动的效果,因此剪切矩形外部的控制台屏幕缓冲区的内容不会改变。

函数声明:

BOOL WINAPI ScrollConsoleScreenBuffer(
_In_ HANDLE hConsoleOutput,
_In_ const SMALL_RECT *lpScrollRectangle,
_In_opt_ const SMALL_RECT *lpClipRectangle,
_In_ COORD dwDestinationOrigin,
_In_ const CHAR_INFO *lpFill
); 功能:
在屏幕缓冲区中移动数据块 参数:
hConsoleOutput 控制台屏幕缓冲区的句柄。句柄必须具有GENERIC_READ访问权限。
lpScrollRectangle 指定要移动的控制台屏幕缓冲区矩形的左上角和右下角坐标。
lpClipRectangle 指定受滚动影响的控制台屏幕缓冲区矩形的左上角和右下角坐标。该指针可以为NULL。
dwDestinationOrigin 它以字符为单位指定lpScrollRectangle内容新位置的左上角。
lpFill 指向CHAR_INFO结构的指针,该结构指定在填充lpScrollRectangle和lpClipRectangle交集中的单元格时使用的字符和颜色属性,这些属性由于移动而保留为空。 返回值:
如果函数成功,则返回值为非零值。
如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。

官方参考手册: https://docs.microsoft.com/en-us/windows/console/char-info-str

03. 程序示例

参考代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h> #include <Windows.h>
#include <conio.h> int main()
{
//定义句柄变量
HANDLE hOut = NULL; //定义窗口信息变量
CONSOLE_SCREEN_BUFFER_INFO screenInfo; //定义移动区域
SMALL_RECT scroll; //移动位置
COORD pos = {8, 8}; //定义填充字符
CHAR_INFO chFill; //获取标准输出句柄
hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获取窗口信息
GetConsoleScreenBufferInfo(hOut, &screenInfo); chFill.Char.AsciiChar = ' ';
chFill.Attributes = screenInfo.wAttributes; //输出字符串
printf("AAAAAAAAAAAAAAAAAAAAAAAAA\n");
printf("BBBBBBBBBBBBBBBBBBBBBBBBB\n");
printf("CCCCCCCCCCCCCCCCCCCCCCCCC\n");
printf("DDDDDDDDDDDDDDDDDDDDDDDDD\n"); //设置移动的区域
scroll.Left = 2;
scroll.Top = 2;
scroll.Right = 20;
scroll.Bottom = 4; //设置文本移动
ScrollConsoleScreenBuffer(hOut, &scroll, NULL, pos, &chFill); getchar(); //关闭句柄
CloseHandle(hOut); system("pause");
return 0;
}

执行结果

参考网址: https://blog.csdn.net/JZQT_T/article/details/30602349

04. 官方参考程序

#include <windows.h>
#include <stdio.h> int main(void)
{
HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
SMALL_RECT srctScrollRect, srctClipRect;
CHAR_INFO chiFill;
COORD coordDest;
int i; printf("\nPrinting 20 lines for reference. ");
printf("Notice that line 6 is discarded during scrolling.\n");
for (i = 0; i <= 20; i++)
printf("%d\n", i); hStdout = GetStdHandle(STD_OUTPUT_HANDLE); if (hStdout == INVALID_HANDLE_VALUE)
{
printf("GetStdHandle failed with %d\n", GetLastError());
return 1;
} // Get the screen buffer size. if (!GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
printf("GetConsoleScreenBufferInfo failed %d\n", GetLastError());
return 1;
} // The scrolling rectangle is the bottom 15 rows of the
// screen buffer. srctScrollRect.Top = csbiInfo.dwSize.Y - 16;
srctScrollRect.Bottom = csbiInfo.dwSize.Y - 1;
srctScrollRect.Left = 0;
srctScrollRect.Right = csbiInfo.dwSize.X - 1; // The destination for the scroll rectangle is one row up. coordDest.X = 0;
coordDest.Y = csbiInfo.dwSize.Y - 17; // The clipping rectangle is the same as the scrolling rectangle.
// The destination row is left unchanged. srctClipRect = srctScrollRect; // Fill the bottom row with green blanks. chiFill.Attributes = BACKGROUND_GREEN | FOREGROUND_RED;
chiFill.Char.AsciiChar = (char)' '; // Scroll up one line. if (!ScrollConsoleScreenBuffer(
hStdout, // screen buffer handle
&srctScrollRect, // scrolling rectangle
&srctClipRect, // clipping rectangle
coordDest, // top left destination cell
&chiFill)) // fill character and color
{
printf("ScrollConsoleScreenBuffer failed %d\n", GetLastError());
return 1;
} getchar(); system("pause");
return 0;
}

【C语言】控制台窗口图形界面编程(五):文本移动的更多相关文章

  1. C语言控制台窗体图形界面编程(总结)

    本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...

  2. 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区

    目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ...

  3. 【C语言】控制台窗口图形界面编程(一)句柄和文本属性

    目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制颜色对照表 06. ...

  4. 【C语言】控制台窗口图形界面编程(八):键盘事件

    目录 00. 目录 01. INPUT_RECORD结构 02. KEY_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INPUT ...

  5. 【C语言】控制台窗口图形界面编程(七):鼠标事件

    目录 00. 目录 01. INPUT_RECORD结构 02. MOUSE_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INP ...

  6. 【C语言】控制台窗口图形界面编程(四):文本输出

    目录 00. 目录 01. FillConsoleOutputAttribute函数 02. FillConsoleOutputCharacter函数 03. WriteConsoleOutputCh ...

  7. 【C语言】控制台窗口图形界面编程(六):光标设置

    目录 00. 目录 01. CONSOLE_CURSOR_INFO结构 02. GetConsoleCursorInfo函数 03. SetConsoleCursorInfo函数 04. SetCon ...

  8. C语言控制台窗体图形界面编程(八):鼠标事件

           上次讲的是键盘事件,这次我们介绍鼠标事件. 以下先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体 { CO ...

  9. Linux C 程序 GTK+图形界面编程(22)

    GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...

随机推荐

  1. AutoIT: 捕捉路由器登陆的小例子

    $url2 = "AX.XXX.XXX.COM" $oIE = _IECreate ($url2, , , , ) Sleep() ControlSetText('[REGEXPT ...

  2. 关于bitset

    https://www.zybuluo.com/ysner/note/1327705 原理 \(bitset\)的原理是将一大堆值为\(0/1\)的数压成一个数. 操作 通过\(i>>x\ ...

  3. linux WEB服务器***

    Apache sudo apt-get install apache2 PHP sudo apt-get install php5 sudo apt-get install php5-gd     / ...

  4. Ruby模块与类

    Ruby是单一继承,一个类只能有一个直接的母类 Mix-in 模式来处理复合需求 多重包含: 由下往上回溯,重复的只看最上方的      换句话说,程序由上往下执行,由具体到抽象,第二次发现同一个模块 ...

  5. bzoj 2809: [Apio2012]dispatching【dfs序+主席树】

    可并堆就可以,但是想复健一下主席树. 考虑枚举管理者,然后选忍者的时候在子树中贪心的从小到大选.做成dfs序就是选区间内和小于等于k的最多点.可以用主席树,查询的时候在主席树上二分即可 这里注意,为了 ...

  6. Java实现Excel数据批量导入数据库

    Java实现Excel数据批量导入数据库 概述: 这个小工具类是工作中的一个小插曲哦,因为提数的时候需要跨数据库导数... 有的是需要从oracle导入mysql ,有的是从mysql导入oracle ...

  7. 如何快捷安装并配置MySQL 下载破解Navicat for mysql

    首先,要先下载MySQL,进官网下载相应的mysql版本,这个不收费,实在不知道的可以参考一下这篇:https://blog.csdn.net/qq_37172528/article/details/ ...

  8. JavaScript--DOM创建元素节点createElement

    创建元素节点createElement createElement()方法可创建元素节点.此方法可返回一个 Element 对象. 语法: document.createElement(tagName ...

  9. [hdu1695] GCD【莫比乌斯反演】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1695 先把题目转化为求一个数在区间[1, b / k],另一个数在区间[1, d / k]时,这两个数互 ...

  10. 数学 Codeforces Round #282 (Div. 2) B. Modular Equations

    题目传送门 题意:a % x == b,求符合条件的x有几个 数学:等式转换为:a == nx + b,那么设k = nx = a - b,易得k的约数(>b)的都符合条件,比如a=25 b=1 ...