控制台程序设计

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1.控制台颜色设置

通常控制台都是白字黑底的,千篇一律不免单调。适当的在控制台中加入一些彩色可以让人耳目一新,本文介绍如何使用系统API接口去修改控制台的文字和背景颜色。

 

主要用到如下二个函数:

得到standard input, standard output, or standard error的设备句柄:

HANDLE GetStdHandle(DWORD nStdHandle);

参数有:STD_INPUT_HANDLE,STD_OUTPUT_HANDLE及STD_ERROR_HANDLE。传入STD_OUTPUT_HANDLE就可以得到控制台输出设备的句柄。

 

设置控制台设备的属性

BOOL SetConsoleTextAttribute( HANDLE hConsoleOutput,WORD wAttributes);

第一个参数为控制台standard input, standard output, or standard error的设备句柄

第二个参数用来设备设备的属性,这里详细介绍下表示颜色的参数。

 

先看下颜色的种类:

在XP系统 控制台一共有16种文字颜色,16种背景颜色,可以通过

文字颜色 + 背景颜色 * 0x10 来设置控制台的颜色。

 

已经定义好的颜色常量如下:

文字颜色使用如下组合:

 FOREGROUND_BLUE      0x0001 // text color contains blue.

 FOREGROUND_GREEN     0x0002 // text color contains green.

 FOREGROUND_RED       0x0004 // text color contains red.

 FOREGROUND_INTENSITY 0x0008 // text color is intensified.高亮颜色

背景颜色使用如下组合(其实就是上面值*0x10):

BACKGROUND_BLUE      0x0010 // background color contains blue.

 BACKGROUND_GREEN    0x0020 // background color contains green.

 BACKGROUND_RED       0x0040 // background color contains red.

 BACKGROUND_INTENSITY 0x0080 // background color is intensified.

上面的颜色可以任意组合,如知道黄色可以由红色和绿色组成,所以可以用FOREGROUND_GREEN | FOREGROUND_RED来表示黄色的文字。

 

默认情况下控制台的文字颜色是白色即用FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE也可以直接用7表示,背景颜色为黑色即用0表示。

 

下面是已经封装好的函数

景颜色,组合有256种。传入的值应当小于256
BOOL SetConsoleColor(WORD wAttributes)
{
	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	if (hConsole == INVALID_HANDLE_VALUE)
		return FALSE;

	return SetConsoleTextAttribute(hConsole, wAttributes);
}

使用范例:

int main()
{
	printf("控制台下默认文字背景颜色:\n");
	printf("MoreWindows\n");
	printf("-----------------------------------\n\n");

	SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_BLUE);
	printf("控制台下红字蓝底:\n");
	printf("MoreWindows\n");
	printf("-----------------------------------\n\n");

	SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); 
	printf("还原为控制台下默认文字背景颜色:\n");
	printf("MoreWindows\n");
	printf("-----------------------------------\n\n");
	return 0;
}

输出结果如下:

 

2.在控制台下显示进度   

可以将本篇内容与VC 在控制台下显示进度 结合成来,完成一个随着任务完成百分比的增加,文字颜色不断变化的彩色进度显示。相信比单一的白色文字要美观的多。

当程序在进行大量的运算或IO操作时,常常需要耗很长时间,为了不让用户有一个乏味的等待或是错误的认为系统已经死机,有必要给程序添加进度提示功能。在窗口界面中要显示进度条和显示完成百分比是非常容易的,但如何在控制台下去完成这个任务了?一行一行的输出当前完成百分比肯定是不够美观的,最好能“原地踏步”一样的显示即旧的数字会被新的数字完全覆盖。其实这个是很容易的,下面先给出的示例代码,稍后再进行讲解。

  1. #include <stdio.h>   
  2. #include <windows.h>   
  3. int main()  
  4. {  
  5.     const int NUM  = 50;//任务完成总量  
  6.       
  7.     for (int i = 0; i < NUM; i++)  
  8.     {  
  9.         //用Sleep()来代替一些费时的操作,如读写文件,大量的运算。   
  10.         Sleep(200); //some work to do  
  11.         //输出百分比   
  12.         printf("%.2lf%%\r", i * 100.0/ NUM);  
  13.     }  
  14.     return 0;  
  15. }  
#include <stdio.h>
#include <windows.h>
int main()
{
	const int NUM  = 50;//任务完成总量
	
	for (int i = 0; i < NUM; i++)
	{
		//用Sleep()来代替一些费时的操作,如读写文件,大量的运算。
		Sleep(200); //some work to do
		//输出百分比
		printf("%.2lf%%\r", i * 100.0/ NUM);
	}
	return 0;
}

可以看出,关键是在于\r书上说它是转义字符中的回车符——描述的不是很到位。准确的讲应该是回到本行开始处。

如:printf("123\r100\n");会输出100。printf("12345\r100\n");会输出10045。

来个复杂点的例子:

#include <stdio.h>   
  1. int main()  
  2. {  
  3.     printf("MoreWindows");  
  4.     printf("12345\r00\n");  
  5.     return 0;  
  6. }  
#include <stdio.h>
int main()
{
	printf("MoreWindows");
	printf("12345\r00\n");
	return 0;
}

会输出什么了?

第一条语句输出MoreWindows,第二条语句输出12345后回到本行的开始处再输出00并换行。这样最开始的二个字符将会被覆盖从而输出00reWindows12345。

再来看一个例子,如下程序运行后将不会输出任何内容。

  1. #include <stdio.h>
    int main()
    {
    	printf("12345\r");
    	return 0;
    }

这是因为上面程序输出和清除之间间隔时间太小,人眼无法察觉。下面这个程序将会让你看清printf()函数执行\r的过程。

#include <stdio.h>
#include <windows.h>
int main()
{
	char szText[] = "MoreWindows";
	printf("12345679\r");
	Sleep(2000);
	for (int i = 0; i < strlen(szText); i++)
	{
		putchar(szText[i]);
		Sleep(200);
	}
	putchar('\n');
}

运行后将会看到输出123456789后,光标移到了本行行首并会在1下面闪烁,闪烁时123456789仍在显示屏幕上,2秒后,屏幕将输出依次输出MoreWindows并将原来的123456789覆盖。

 

结语:在控制台显示进度无疑是非常方便的,在很多场合完全可以代替窗口进度条的来美化程序和减小用户等待时的乏味感。

C#控制台应用程序设计 命名空间 命名空间是一组包含相关方法的相似类,专门用于避免类与类之间的名称冲突。 命名空间可以嵌套,从而分成层次,类似于目录结构,多个源代码文件可以使用同一个命名空间。 namespace关键字 关键字namespace将其后面大括号中的所有类添加到一个命名空间中: namespace MyNamespace { public class Hello { 阅读详情

相关推荐

C++入门之创建第一个控制台程序

对于大部分的C++学习者来说,第一个“hello word”程序控制台应用程序。笔者当年也是,本例用于介绍如何用visualstudio 2017来创建一个简单的控制台应用程序。 首先,打开visual studio 2017,就像这样。 点击左上角的开始按钮,选择新建->新建项目。 然后在弹出的窗口中选择visual C++,控制台应用程序。 输入你的文...

majalis_C的博客 5808

创建一个控制台应用程序

和任何高级语言一样,C#源程序也是文本文件。其扩展名为.cs,文件名没有对象的规定。我们可以使用Windows的“记事本”编写程序代码,不过这样很不方便。建议使用EditPlus或者其他功能强大的文本编辑器,我们还可以使用第三方编辑器 SharpDevelop 和 Antechi

bujanbusan的专栏 1777

MFC Windows 程序设计[126]之控制台适配器(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。.........

hnjzfwy的博客 182

VC++实现的炫彩控制台时钟程序设计

argc表示命令行参数的数量。argv是一个指针数组,指向各个命令行参数的字符串。TCHAR是微软定义的类型宏,根据是否启用Unicode编译为char或wchar_t。TCHAR的使用使得程序可以在ANSI和Unicode环境下自动适配。虽然strftime提供了丰富的格式化选项,但在某些场景下,我们可能需要更灵活的格式解析能力,例如动态拼接格式字符串、支持自定义时区等。为此,可以设计一个简单的解析函数,支持用户输入格式字符串并提取时间字段。} else {

weixin_42168902的博客 722

win32 api应用如何输出日志log Windows程序设计 visualstudio vs无控制台如何输出

共两个代码,借鉴了《Windows程序设计(第五版)》P34页代码 第一步在项目中添加两个代码,LogUtil.cpp 和 LogUtil.h LogUtil.cpp 如下 #include &lt;windows.h&gt; #include &lt;tchar.h&gt; #include "LogUtil.h" #ifndef _DEBUG void CDECL logd(cons...

lala的博客 3884

控制台计算器程序设计C#

实验1:控制台计算器程序设计C# 今天是2020.03.01!首先许个愿望,希望三月善待我,一定要开心啊!咳咳好了好了~快点敲代码吧嘤! 要求回顾 【实验要求】 对于用户从键盘输入的两个数,进行用户指定的运算并输出运算结果。 【实验目的】 了解.NET Framework的特点。 熟悉Visual Studio 2015开发环境。 学会用C#编写控制台应用程序。 掌握控制台程序...

zhaoyananzyn的博客 2060

C++程序设计_简易计时器(Timer)的控制台实现

求打赏求收藏求转发! 提供PDF资源 https://download.csdn.net/download/weixin_43781565/12429047 (审核后可供下载) Peace and love 信控学院专业课实验报告 专业 软件工程 简易计时器(Timer)的控制台实现 目录 一、实验名称 1 二、实验目的 1 三、实验平台 1 四、问题分析 1 ①问题描述与需求分析 1 ②程序功能抽象 1 五、 设计/开发解决方案 1 六、实验结果 5 图1-1初始..

Jason~~ 1110

Java程序设计————从控制台输入

控制台输入信息可以借助扫描器类来实现向控制台输入信息可以借助扫描器类来实现提示(1)在使用Scanner类型之前,需要首先指明Scanner类所在的位置,既通过代码(2)input称为扫描器Scanner类型的对象,从控制台输入信息就使用input对象。

m4576的博客 1461

程序设计-控制台对战版五子棋

编程的乐趣,很多刚刚接触编程的人都不知道怎么下手编写程序,特别是学习了新的知识点,不知道有什么用,那么本文将以简单的存储结构及简单的运算,条件语句,分支语句,循环语句结合,带来一个双人对战版五子棋,这是一个简单的模型,实现了五子棋最最基本的功能,还有好多地方需要补全,如边界问题,设计问题,游戏逻辑问题,希望读者阅读后能够注意,通过自己的努力来完善它,还能扩展各种功能,如悔棋,网络对战等,有时候写程序和小生命一样,慢慢会成长,而我们作为“父母”的看到自己的小宝宝成为有用之才,过程之欣喜特别棒!下面正题!

蜡笔小黑 937

基于 Python 控制台 的学生管理系统程序设计

的学生管理系统程序设计,功能包括学生信息的增删改查、成绩管理、数据保存与加载等,适合作为计算机专业课程设计作业。

laoman456的博客 404

Java程序设计——控制台的输入和输出

程序的数据不能仅仅是给定的一个值,通常程序中的数据还应该为用户输入的值。 Java中Scanner类可以帮助我们获取用户在控制台输入的数据。 一、控制台的输入 实现步骤: 导入Scanner对象 import java.util.Scanner; 或 import java.util.*; 接收用户输入的值 Scanner input=newScanner(System.in); int score=input.nextInt();//读取输入的整数 String name=i

小魁的C世界的博客 8155

《Python语言程序设计》——2.3 从控制台读取输入

本节书摘来自华章计算机《Python语言程序设计》一书中的第2章,第2.3节,作者:[美]梁勇(Y. Daniel Liang) 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.3 从控制台读取输入 关键点:从控制台读取输入可以让程序从用户处接受输入。在程序清单2-1中,一个半径值被设置在源代码中。为了使用另一个半径值,你不得不修改源代码。可...

weixin_34362875的博客 481

基于Python控制台 的图书馆借阅管理系统程序设计

的图书馆借阅管理系统程序设计,功能包括图书管理、借阅与归还、查询功能等,适合作为课程设计作业。

laoman456的博客 526

C#基础计算器控制台程序设计与实现

控制台程序的输入主要通过类提供的静态方法实现。最常见的方式是使用,但也有其他方式如,它们适用于不同的输入场景。本节将介绍这些输入方法的基本用法和使用场景。本章围绕C#控制台应用程序中算术运算的实现与优化展开,从基本运算符的使用入手,逐步深入到变量存储、性能优化与模块化封装策略。通过示例代码与逻辑分析,帮助开发者构建清晰的运算逻辑体系,并掌握提升程序性能与可维护性的实用技巧。这些内容将为后续章节中构建完整计算器程序打下坚实基础。

weixin_36212459的博客 1139

基于 Python 控制台 的库存管理系统程序设计

的库存管理系统程序设计,功能包括库存商品的添加、删除、修改、查看、查询、统计以及数据持久化,适合作为课程设计作业。

laoman456的博客 484

第二章,控制台程序设计

知识点: java程序分类, java开发环境与程序的运行 类的定义 类得四个基本特性 接口 java程序有三种:基于控制台应用程序,基于窗口的应用程序,小应用程序    ...

闲云逍遥 152

C语言优雅的写一个控制台菜单程序

优雅的写一个控制台菜单程序

假如技术娶了生活... 4373
上一篇: STL系列之 deque双向队列
下一篇: 多核与并行
wwl33695
博客等级 码龄18年 136粉丝 46原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值