900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 【C语言】控制台窗口图形界面编程(五):文本移动

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

时间:2018-12-08 12:05:46

相关推荐

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

00. 目录

文章目录

00. 目录01. CHAR_INFO结构02. ScrollConsoleScreenBuffer函数03. 程序示例04. 官方参考程序

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

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

02. ScrollConsoleScreenBuffer函数

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

函数声明:

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

官方参考手册: /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;}

执行结果

参考网址: /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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。