【C语言】控制台窗口图形界面编程(五):文本移动
生活随笔
收集整理的這篇文章主要介紹了
【C语言】控制台窗口图形界面编程(五):文本移动
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. CHAR_INFO結(jié)構(gòu)
- 02. ScrollConsoleScreenBuffer函數(shù)
- 03. 程序示例
- 04. 官方參考程序
01. CHAR_INFO結(jié)構(gòu)
指定Unicode或ANSI字符及其屬性??刂婆_功能使用此結(jié)構(gòu)來讀取和寫入控制臺屏幕緩沖區(qū)。
類型聲明
typedef struct _CHAR_INFO {union {WCHAR UnicodeChar;CHAR AsciiChar;} Char;WORD Attributes; } CHAR_INFO, *PCHAR_INFO;UnicodeChar
屏幕緩沖區(qū)字符單元格的Unicode字符。
AsciiChar
屏幕緩沖區(qū)字符單元格的ANSI字符。
Attributes
字符屬性。該成員可以是零或以下值的任意組合。
| FOREGROUND_BLUE 0x0001 | 文字顏色包含藍(lán)色。 |
| FOREGROUND_GREEN 0x0002 | 文字顏色包含綠色。 |
| FOREGROUND_RED 0x0004 | 文字顏色包含紅色。 |
| FOREGROUND_INTENSITY 0x0008 | 文字顏色加強。 |
| BACKGROUND_BLUE 0x0010 | 背景顏色包含藍(lán)色。 |
| BACKGROUND_GREEN 0x0020 | 背景顏色包含綠色。 |
| BACKGROUND_RED 0x0040 | 背景顏色包含紅色。 |
| BACKGROUND_INTENSITY 0x0080 | 背景顏色加劇。 |
| COMMON_LVB_LEADING_BYTE 0x0100 | 前導(dǎo)字節(jié)。 |
| COMMON_LVB_TRAILING_BYTE 0x0200 | 尾隨字節(jié)。 |
| COMMON_LVB_GRID_HORIZONTAL 0x0400 | 頂部水平 |
| COMMON_LVB_GRID_LVERTICAL 0x0800 | 左垂直。 |
| COMMON_LVB_GRID_RVERTICAL 0x1000 | 正確的垂直。 |
| COMMON_LVB_REVERSE_VIDEO 0x4000 | 反轉(zhuǎn)前景和背景屬性。 |
| COMMON_LVB_UNDERSCORE 0x8000 | 下劃線。 |
02. ScrollConsoleScreenBuffer函數(shù)
在屏幕緩沖區(qū)中移動數(shù)據(jù)塊。通過指定剪切矩形可以限制移動的效果,因此剪切矩形外部的控制臺屏幕緩沖區(qū)的內(nèi)容不會改變。
函數(shù)聲明:
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 );功能:在屏幕緩沖區(qū)中移動數(shù)據(jù)塊參數(shù):hConsoleOutput 控制臺屏幕緩沖區(qū)的句柄。句柄必須具有GENERIC_READ訪問權(quán)限。lpScrollRectangle 指定要移動的控制臺屏幕緩沖區(qū)矩形的左上角和右下角坐標(biāo)。lpClipRectangle 指定受滾動影響的控制臺屏幕緩沖區(qū)矩形的左上角和右下角坐標(biāo)。該指針可以為NULL。dwDestinationOrigin 它以字符為單位指定lpScrollRectangle內(nèi)容新位置的左上角。lpFill 指向CHAR_INFO結(jié)構(gòu)的指針,該結(jié)構(gòu)指定在填充lpScrollRectangle和lpClipRectangle交集中的單元格時使用的字符和顏色屬性,這些屬性由于移動而保留為空。返回值:如果函數(shù)成功,則返回值為非零值。如果函數(shù)失敗,則返回值為零。要獲取擴展錯誤信息,請調(diào)用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;//定義移動區(qū)域SMALL_RECT scroll;//移動位置COORD pos = {8, 8};//定義填充字符CHAR_INFO chFill;//獲取標(biāo)準(zhǔn)輸出句柄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");//設(shè)置移動的區(qū)域scroll.Left = 2;scroll.Top = 2;scroll.Right = 20;scroll.Bottom = 4;//設(shè)置文本移動ScrollConsoleScreenBuffer(hOut, &scroll, NULL, pos, &chFill);getchar();//關(guān)閉句柄CloseHandle(hOut);system("pause");return 0; }執(zhí)行結(jié)果
參考網(wǎng)址: 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; }總結(jié)
以上是生活随笔為你收集整理的【C语言】控制台窗口图形界面编程(五):文本移动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C语言】控制台窗口图形界面编程(四):
- 下一篇: 【C语言】控制台窗口图形界面编程(六):