控制台在指定位置画矩形,写字符串,画直线

来源:互联网 发布:守望先锋先锋大神数据 编辑:程序博客网 时间:2024/06/06 07:15

如何在控制台指定位指写字符串,画矩形,画直线?

一效果展示:

二代码

#include <stdio.h>#include <windows.h>#include<string>using namespace std;/**function: 将字符输出到缓冲区@paramch:        要输入的字符posLine :   字符所在行的位置posColumn:  字符所在列的位置charInfoAarray:缓冲区数组的内容**/void WriteCharToBuffer(CHAR_INFO ch, int posLine, int posColumn, CHAR_INFO * charInfoAarray){    charInfoAarray[posLine * 80 + posColumn] = ch;}/***function:将缓冲区的字符输出到控制台@paramstartPosRow:显示区域起始点的行号startPosColumn:显示区域起始点的列号height:显示区域高width:显示区域宽charInfoAarray:缓冲区数组的内容***/void OutPutToConsole(int startPosRow, int startPosColumn, int height, int width, CHAR_INFO * charInfoAarray){    HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);    COORD dwBufferSize = { 80, 25 };//固定值(控制台窗口固定的属性值)    COORD dwBufferCoord = { startPosColumn, startPosRow };//缓冲区左上角的起始位置    SMALL_RECT rect = { startPosColumn, startPosRow, startPosColumn + width-1, startPosRow + height-1 };//显示多大的缓冲区:    WriteConsoleOutput(hConsoleOutput, charInfoAarray, dwBufferSize, dwBufferCoord, &rect);}/**function :在控制台输出文本@param       text:要输出的文本      row:输出文本的行数      column:输出文本的列数      startPosRow: 第一个字符所在行数      startPosColumn: 第一个字符所在列数      bgColor: 背景色      fgColor;前景色**/void drawText(string text, int row, int column, int startPosRow, int startPosColumn, int bgColor, int fgColor){    int  i = 0;    CHAR_INFO CharInfo;    CharInfo.Attributes = bgColor | fgColor;    CHAR_INFO  charInfoArray[80 * 25];    for (i = 0; i < text.length(); i++)    {        CharInfo.Char.AsciiChar = text[i];        WriteCharToBuffer(CharInfo, startPosRow, startPosColumn + i, charInfoArray);    }    OutPutToConsole(startPosRow, startPosColumn, row, column, charInfoArray);}/**function 画矩形@param       height:矩形的高       width:矩形的宽       startPosRow:矩形左上角纵坐标的位置       startPosColumn:矩形左上角横坐标的位置       bgColor:背景色       fgColor:前景色**/void drawRect(int height , int width , int leftPosY , int leftPosX ,int bgColor , int fgColor){    int  i = 0 ,j = 0;    CHAR_INFO CharInfo;    CharInfo.Attributes = bgColor | fgColor;    CHAR_INFO  charInfoAarray[80 * 25];    for (i = leftPosY; i < leftPosY + height; i++)    {        for (j = leftPosX; j < leftPosX + width; j++)        {            CharInfo.Char.AsciiChar = ' ';            WriteCharToBuffer(CharInfo, i, j , charInfoAarray);        }            }        OutPutToConsole(leftPosY, leftPosX, height, width, charInfoAarray);}/**function:画一条线@param     leftTopPosY:直线起始点的纵坐标     leftTopPosX:直线起始点的横坐标     width:       直线的长度     LineNum       直线的条数     bgColor      直线的背景色     fgColor      直线的颜色**/void drawLine(int leftTopPosY, int leftTopPosX, int width, int LineNum, int bgColor, int fgColor){    CHAR_INFO charInfo;    CHAR_INFO charInfoArray[80 * 25];    int Row = 0;    int Column = 0;    charInfo.Attributes = bgColor | fgColor;    charInfo.Char.AsciiChar = '-';    for (Row = leftTopPosY; Row < leftTopPosY + LineNum; Row++)    {        for (Column = leftTopPosX; Column < leftTopPosX + width; Column++)        {            charInfoArray[80 * Row + Column] = charInfo;        }    }        OutPutToConsole(leftTopPosY, leftTopPosX, LineNum, width, charInfoArray);}void main(){    string str = "USERNAME";    drawText(str, 1, 8, 12, 35, FOREGROUND_RED, BACKGROUND_GREEN);//写一个字符串    drawRect(3, 8, 14, 35, FOREGROUND_RED, BACKGROUND_GREEN);//画一个矩形框    drawLine(18, 35, 10, 2, FOREGROUND_RED, BACKGROUND_GREEN);//画两条直线    getchar();}


三:常见问题:

1 代码里定义的     CHAR_INFO charInfoArray[80 * 25]     是什么?


可以理解成控制台在内存中的映射(即在内存中的一个画布)。在内存中画好一次性输出到控制台.


0 0
原创粉丝点击