圆圆网络 手游攻略 新游动态 控制台文字颜色,字体阴影代码

控制台文字颜色,字体阴影代码

时间:2024-04-06 22:02:24 来源:头条 浏览:0

正如我之前所写的,这两天我在网上看一个视频回顾日本计算机发展史,当看到UCDOS 6.0、WPS 1.0等经典软件界面时,我突然想起了学生时代的我。

UCDOS6.0

WPS1.0

控制台文字颜色,字体阴影代码

我是1996年发现计算机,1997年学习计算机,1998年进入计算机专业,但当时学的数据库是Foxbase,后来我想我之所以学Foxbase是因为一本课本,我严重怀疑过。 by 我们的老师.当时最好学的语言是汇编语言和C语言。我后悔没有更认真学习的是数据结构和freeBSD。现在想来,当年教我FreeBSD的老师真是个专家。可惜我年少无知,没有留意。上课.前几天,我正好在写:010 -30000系列教程,今天我们就来探讨一下DOS界面中的“图形界面”是什么样子的。首先贴一张程序运行效果的照片。

在命令行时代,为了让界面具有三维效果,是通过图形重叠和颜色匹配来完成的。我的画功很差,中学美术考试时画的苹果说是“方形”也不为过。其实我本来想保留这个效果,模拟更多的效果,但想了想,还是决定不这么做。渲染原理分为几个部分,首先绘制一个灰色矩形,然后在偏移位置绘制一个红色矩形,并根据该文本调整字体大小来输出文本。我将首先分节解释程序的代码特征,最后揭示完整的程序源代码。

准备无需任何准备即可使其看起来不错。例如,您可以设置屏幕缓冲区中的行数和列数,以获得控制台窗体的适当显示大小。当然,正如我们在上一篇文章中提到的,屏幕缓冲区的大小不等于窗口的显示大小,因此我们需要将窗口大小设置为与屏幕缓冲区相同,以避免出现滚动条。首先,我们需要获取当前控制台程序的句柄。这是代码:

HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE); 设置屏幕缓冲区的代码如下。

COORD scr_size={80,30};SetConsoleScreenBufferSize(hConsole,scr_size);设置控制台窗口大小的代码如下:

SMALL_RECT wnd_size={0,0,79,29};SetConsoleWindowInfo(hConsole,TRUE,wnd_size);注意屏幕缓冲区COORD结构的坐标x和y分别表示行数和列数。窗口大小SMALL_RECT结构表示窗口相对于屏幕缓冲区的位置坐标,具有多种含义。

矩形背景矩形背景实际上是由FillConsoleOutputAttribute 函数绘制的。函数原型为:

BOOL FillConsoleOutputAttribute(HANDLE hConsoleOutput,WORD wAttribute,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfAttrsWritten); 第一个参数传入窗口句柄,第二个参数为文本的前景色和背景色,第三个参数以字符为单位设置Number,即连续字符的个数(重要!如果超过一行,会自动换行到下一行) 第四个参数是COORD结构体,传递指定的坐标。最后一个参数是输出Type参数,如果要向外发送数据,理论上可以设置为NULL(空指针),但在实际开发中不建议这样做。分配DWORD 类型的指针,不需要初始值。我了解如何使用FillConsoleOutputAttribute 函数。现在让我们看看如何在我们的程序中使用它。继续执行下一个代码。

//区域背景色和文字颜色WORD bgColor_shadow,bgColor;//1.阴影区域填充灰色bgColor_shadow=Behind_INTENSITY;//2.文字背景色填充红色,文字填充Yellow bgColor=Behind_RED |FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;此代码定义了两个背景区域的颜色。 bgColor_shadow 定义灰色背景。 bgColor 定义的红色背景使用黄色显示文本并增加其亮度。 FOREGROUND_INTENSITY和BACKGROUND_INTENSITY,一种为前景色,一种为背景色。单独使用时,表示灰色。当与相似的颜色混合时,意味着添加更多的颜色,使颜色更鲜艳。

CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(hConsole, csbi); 这两行代码的主要作用是检索屏幕缓冲区中当前字符的属性,即csbi.wAttributes成员的值。如果您稍后更改角色属性并希望恢复当前的角色属性,您可以随时通过csbi.wAttributes 恢复默认属性。

SMALL_RECT 显示矩形,阴影矩形;显示矩形。左=25;显示矩形。顶部=7;显示矩形。右=55;显示矩形。底部=22;阴影矩形。左=显示矩形。左+ 1;阴影矩形。顶部=显示矩形。顶部+ 1;阴影矩形.Right=display_rect.Right + 1;shadow_rect.Bottom=display_rect.Bottom + 1; 这段代码中,display_rect代表字符的背景区域,shadow_rect代表阴影区域。是被display_rect遮挡的区域的面积。

要实现背部遮挡,您只需相对于第一个区域移动第二个区域,但效果的保真度会根据艺术家、移动程度以及调整阴影区域颜色的方式而有所不同。然后在您的代码中实现它。

DWORD col_num=display_rect.Right - display_rect.Left + 1;SHORT line_num=display_rect.Bottom - display_rect.Top + 1;DWORD dword1;for(SHORT i=shadow_rect.Top; i=line_num;i++){FillConsoleOutputAttribute(hConsole, bgColor_shadow ) , col_num, {shadow_rect.Left, i}, dword1);}DWORD dword2;for(SHORT i=display_rect.Top; i line_num;i++){FillConsoleOutputAttribute(hConsole, bgColor,col_num, {display_rect.Left, i}, dword2 );}col_num表示该区域每行要填充的字符数(列数),line_num表示要填充的行数。请注意,虽然我们定义了一个SMALL_RECT 结构来表示矩形区域,但控制台实际上不支持一次填充屏幕缓冲区中的局部矩形区域,只能逐行填充。请注意。因此,必须使用for循环来实现。另外,FillConsoleOutputAttribute的最后一个参数是输出参数,用于记录函数操作影响的字符单元数。本程序中未使用。理论上你可以将其设置为NULL,但在实际经验中你绝对不应该将其设置为NULL。这段代码实现的效果是:

字体大小CONSOLE_FONT_INFOEX cfi;cfi.cbSize=sizeof(cfi);cfi.nFont=0;cfi.dwFontSize.X=10;cfi.dwFontSize.Y=20;cfi.FontFamily=FF_DONTCARE;cfi.FontWeight=FW_BOLD;SetCurrentConsoleFontEx( hConsole, FALSE, cfi); 这段代码的目的是设置稍后输出的文本的字体大小。使用CONSOLE_FONT_INFOEX 结构。不要将其与CONSOLE_FONT_INFO 结构混淆。 CONSOLE_FONT_INFO结构的定义是:

typedef struct _CONSOLE_FONT_INFO {DWORD nFont; COORD dwFontSize;} CONSOLE_FONT_INFO; CONSOLE_FONT_INFOEX 结构体的定义为:

typedef struct _CONSOLE_FONT_INFOEX {ULONG cbSize;DWORD nFont;COORD dwFontSize;UINT FontFamily;UINT FontWeight;WCHAR FaceName[LF_FACESIZE];} CONSOLE_FONT_INFOEX;这两个结构体实际上允许你通过dwFontSize 成员获取当前字体大小;Font 必须设置为尺寸。为此,我们需要调用SetCurrentConsoleFontEx 函数。此函数中使用的结构体类型为CONSOLE_FONT_INFOEX,而不是CONSOLE_FONT_INFO。我们来看看这个函数的原型。

BOOL SetCurrentConsoleFontEx(HANDLE hConsoleOutput,BOOL bMinimumWindow,PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); 第一个参数没说什么,就是控制台窗体句柄,如果第二个参数为TRUE,则在当前窗口最大化后设置最大窗口的字体信息。如果为FALSE,则设置当前窗口的字体信息。最后一个参数是指向通用输入参数CONSOLE_FONT_INFOEX的指针。 (有关输入和输出参数,请参阅我的文章链接)如何使用CONSOLE_FONT_INFOEX 类型变量?第一个参数应如下使用: cfi.cbSize=sizeof(cfi); 第二个参数nFont 通常默认为0,并且第三个参数dwFontSize是一个COORD结构。请注意,该结构并不代表坐标。稍后输出的文本的字符宽度和高度。 X 成员包含宽度,Y 成员包含高度。第四个参数FontFamily表示字体的间距和系列。请参阅TEXTMETRIC 结构的tmPitchAndFamily 成员的描述,了解该成员的可能值。参数FontWeight代表字体的粗细。厚度范围为100 至1000,以100 的倍数表示。例如,正常粗细是400,但700是粗体。 FaceName 表示要使用的字体名称(例如Courier 或Arial)。为了降低学习复杂度,我们在这里不再展开;我们将在后面的文章中更详细地讨论这些参数的使用,但它们并不影响该程序的功能实现。

文本输出有许多用于输出文本内容的方法,包括FillConsoleOutputCharacter 和WriteConsoleOutputCharacter 函数。前者允许您一次将所有字符输出到屏幕缓冲区,而后者允许您输出单个字符串。本示例程序时钟使用后者。 WriteConsoleOutputCharacter 函数的原型是:

BOOL WriteConsoleOutputCharacter(HANDLE hConsoleOutput,LPCTSTR lpCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten); 显然,第一个参数必须是窗口句柄,第二个参数是要写入屏幕缓冲区的字符或字符串。第三个参数是写入的字符数(不是字节)。第四个参数是COORD结构,表示坐标,指定屏幕缓冲区中第一个字符的起始坐标。最后一个参数与FillConsoleOutputAttribute函数的最后一个参数类似;当执行第二个参数字符串时,该参数指向的区域存储实际输出到屏幕缓冲区的字符数。这实际上是一个指向DWORD 的指针。经验表明,不建议将其设置为NULL,即使它对您的程序没有影响。本例的程序代码为:

const char* str='致敬经典';//const char * 可以用LPCTSTR替换//LPCTSTR str='.';//LPCTSTR是Windows编程风格//const char * 是C语言风格DWORD request;if (!WriteConsoleOutputCharacter(hConsole, str, strlen(str),{35,11},Written)){printf('%d\n', GetLastError());return 1;} Text 机器自动使用您设置的角色属性。只有调用下面这行代码才会恢复之前默认的字符属性。

SetConsoleTextAttribute(hConsole, csbi.wAttributes); 以下代码行使对屏幕缓冲区的更改立即生效。

fflush(stdout); 这是C语言的用法。在C++ 中可以使用: std:cout std:flush; 在前面的代码中,const char* 是C 语言编程风格,可以替换为LPCTSTR 类型。 Windows 编程风格。对于Windows 编程风格的自定义数据类型,本文详细介绍了使用Windows 控制台的简单方法(1)。窗口标题下有完整的程序源代码,可以直接编译执行。使用的环境是默认的Clang编译器CLion2023,64位win10上的最新版本。事实上,你甚至可以用devC++和vs2022编译并通过它。如果您有任何疑问,请随时与我们联系。

#include #include #include int main() { HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE); //准备工作: //1.设置屏幕缓冲区大小COORD scr_size={80,30}; SetConsoleScreenBufferSize(hConsole,scr_size); //2 . 设置窗体大小SMALL_RECT wnd_size={0,0,79,29}; SetConsoleWindowInfo(hConsole,TRUE,wnd_size); //区域背景颜色和文字颜色WORD bgColor_shadow,bgColor; //1.用于.用灰色填充阴影区域bgColor_shadow=Behind_INTENSITY; //2.将文本背景色填充为红色,将文本填充为黄色bgColor=Behind_RED |FOREGROUND_RED | FOREGROUND_GREEN| FOREGROUND_INTENSITY; //获取默认字符属性用于恢复必要时屏幕缓冲区的默认属性。 CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(hConsole, csbi); //display_rect 代表文本背景区域的面积//shadow_rect 代表阴影区域SMALL_RECT display_rect,shadow_rect; display_rect.Left=25; display_rect.Top=7; display_rect.Right=55;display_rect.Bottom=22;shadow_rect.Left=display_rect.Left + 1;shadow_rect.Top=display_rect.Top + 1;shadow_rect.Right=display_rect.Right + 1;shadow_rect.Bottom=display_rect.Bottom + 1;//col_num 表示每行要填充的字符区域(列数) //line_num 表示要填充的行数//控制台一次填充屏幕缓冲区中的局部矩形区域//仅限DWORD可以依次填充col_num=display_rect.Right - display_rect.Left + 1; SHORT line_num=display_rect.Bottom - display_rect.Top + 1; //for循环实现区域填充//1.首先填充底部阴影区域//dword1本程序中没有使用是的,理论上可以设置为NULL,但是我的实践经验不要基于DWORD dword1设置为NULL; for(SHORT i=shadow_rect.Top; i=line_num;i++){ FillConsoleOutputAttribute( hConsole , bgColor_shadow,col_num, {shadow_rect.Left, i}, dword1); } //2. 回填文本背景区域DWORD dword2; for(SHORT i=display_rect.Top; i line_num;i++){ FillConsoleOutputAttribute (hConsole, bgColor, col_num, {display_rect.Left, i} , dword2); } //输出预先设置文本内容的字体大小CONSOLE_FONT_INFOEX cfi; cfi.cbSize=sizeof(cfi); cfi.nFont=0; cfi.dwFontSize.X=10; cfi.dwFontSize.Y=20; cfi.FontFamily=FF_DONTCARE; cfi.FontWeight=FW_BOLD; //wcscpy_s(cfi.FaceName, L'Courier New'); //wcscpy_s(cfi.FaceName, L'') ; SetCurrentConsoleFontEx(hConsole, FALSE, cfi ); //显示//如果你调整显示起始位置,字符单位会自动使用你设置的字符属性//const char* str='致敬经典'; LPCTSTR str='致敬经典' ' ; DWORD write; if (!WriteConsoleOutputCharacter(hConsole, str, strlen(str),{35,11 },Written)) { printf( '%d\n', GetLastError() ); return 1; } //默认恢复SetConsoleTextAttribute(hConsole, csbi.wAttributes)的字符属性; //strong制屏幕缓冲区更新,使更改立即生效fflush(stdout); getchar(); Return 0;}

标题:控制台文字颜色,字体阴影代码
链接:https://yyuanw.com/news/xydt/7596.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
阴阳师4月22日更新内容:帝释天上线技能调整,红莲华冕活动来袭

阴阳师4月22日更新内容:帝释天上线技能调整,红莲华冕活动来袭[多图],阴阳师4月22日更新的内容有哪些?版本更新

2024-04-06
四川电视台经济频道如何培养孩子的学习习惯与方法直播在哪看?直播视频回放地址

四川电视台经济频道如何培养孩子的学习习惯与方法直播在哪看?直播视频回放地址[多图],2021四川电视台经济频

2024-04-06
湖北电视台生活频道如何培养孩子的学习兴趣直播回放在哪看?直播视频回放地址入口

湖北电视台生活频道如何培养孩子的学习兴趣直播回放在哪看?直播视频回放地址入口[多图],湖北电视台生活频道

2024-04-06
小森生活金币不够用怎么办?金币没了不够用解决方法

小森生活金币不够用怎么办?金币没了不够用解决方法[多图],小森生活金币突然就不够用的情况很多人都有,金币没

2024-04-06