日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/21 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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

字符屬性。該成員可以是零或以下值的任意組合。

值含義
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语言】控制台窗口图形界面编程(五):文本移动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。