EGE相关:控制台窗口的设置

EGE专栏:EGE专栏

相关问题快速浏览

1. 控制台窗口是什么?

  C/C++ 日常使用的可以接收用户按键输入以及可以显示字符的黑窗口。

在这里插入图片描述

2. 原本还能使用控制台,为什么配置了 EGE 后就不能用了?

  首先说明,配置了 EGE 后还是可以继续使用控制台的。如果控制台无法使用,很可能是被禁用了,需要先启用控制台。

  控制台设置需要分编译器讨论,主要分为两种:MSVC 编译器和 GCC 编译器。

编译器相关IDE控制台默认状态
MSVCVisual Studio禁用
GCCDev-C++、Code Blocks、小熊猫 C++启用
2.1 Visual Studio 中启用控制台

  包含 EGE 头文件后 默认关闭控制台,若要使用,可以在包含 EGE 头文件之前先设置宏定义 #define SHOW_CONSOLE。如

#define SHOW_CONSOLE
#include <graphics.h>
  • 其它使用 GCC 编译器的软件,如 Dev-C++, CodeBlocks等, 默认就是能够使用控制台 的,如果不能用,多半是配置错误,即配置时多加了链接参数 -mwindows 从而导致控制台无法使用,去掉这个参数即可。

3. 使用 printf() 为什么不能在 EGE 的窗口上输出文字

  EGE 窗口是图形窗口,使用标准输入输出(如printf, scanf)无法将文字输出到图形窗口上,标准输入输出是用于控制台的。要想在 EGE 图形窗口输出文字,需要使用替代的 xyprintf() 函数, 函数名构成为 xy + printf, xy 代表坐标的意思。
  使用方法如下:

printf("Hello world.\n");
对应
xyprintf(20, 30, "Hello world.");

其中 xyprintf() 中的前两个参数 (20, 30) 表示文字在窗口中的位置坐标 ( x , y ) (x, y) (x,y)

4. 可以把控制台关掉不显示吗

  可以,具体方法需要分工具进行讨论。

  ① Visual Studio 下默认禁用控制台,只有定义了宏 SHOW_CONSOLE 之后才会启用控制台。因此,想要不显示控制台,不主动添加宏定义 SHOW_CONSOLE 即可。如果还是显示,可以在 项目属性 里,将 配置属性->链接->系统 中的 子系统 改为 未配置

  ② 如果使用的是以 GCC 系列为编译器的开发工具,如 Dev-C++, CodeBlocks 等,那么可以在 项目属性中,将程序设置成 图形界面程序(GUI) 即可。也可以手动在 编译器配置 中添加 -mwindows 链接参数。



正文


一、前言

  控制台(Console) 是我们学习C/C++时较早就接触的东西,它以一个窗口的形式给我们提供了一个可以与用户进行交互的环境,让我们可以通过调用一些相关函数就能获取到用户输入并将运行结果显示到屏幕上。

  在C语言的 Hello world 程序中,通过标准库中的 printf() 即可往控制台输出字符,而通过 scanf(), getchar(), getch(), getche() 等则可以从控制台中得到用户的输入。

Hello World 示例代码

#include <stdio.h>
int main()
{
	printf("Hello world.\n");
	return 0;
}

在这里插入图片描述
  但是正是因为多数C语言课程主要教授的是C语言的语法知识和一些基础的算法,对于教学来说使用控制台是足够了的,但是会让人觉得编程就只能使用这个黑窗口。
  EGE作为学习编程的一个过渡工具,就是为了给初学者增加学习的乐趣以及传输一些图形编程方面的知识而给程序加入了图形窗口,让初学者能够使用C语言进行绘图,而不是单纯地对数据进行计算。那为什么使用较为简单的EGE图形库而不是那些商业图形库呢? 因为那些图形库需要不低的编程水平,如果让初学者接触那些现代的图形库,初学者会觉得难以掌握,学习时估计会学到崩溃。

  EGE通过额外创建一个图形窗口并增加可以在上面绘图的函数,实现了基础的绘图功能,这已经能够满足学习的需求了。当学生想进一步学习时,可以考虑将现代化的商业图形库作业进阶学习内容。


二、EGE中控制台的设置

  像我们日常使用的如 QQ、微信、Office、Edge 浏览器等软件,正常运行时都是不显示控制台窗口的。这些图形界面有自己的输入输出,各种个性化的输入框,完全不需要控制台。
  但是在图形窗口中实现输入输出肯定是没有直接使用控制台窗口那么方便的。控制台窗口是系统内置的,正确性可以得到保证。而如果是开发者自己在图形窗口中实现输出输出,就有很大的不确定性。并且在控制台中输入输出的文本信息都可以保留,滚动浏览,非常方便开发者进行调试。
  控制台窗口主要用来输出调试相关的信息,让开发者了解程序执行过程。给用户使用的图形界面程序不应该保留控制台窗口。

  可以在开发的时候启用控制台窗口,用来输出调试信息,开发完成后交付给用户使用时禁用控制台。

  EGE在部分编译器(如 MSVC 编译器)下,是 关闭控制台并且屏蔽控制台输入输出的。所以如果刚接触 EGE 时遇到无法使用 printf(), cout 进行输出时,不要慌,按照下面的方法设置一下即可。

  对于常用的三款IDE,下面介绍一下如何设置控制台的显示与关闭,并解决无法在控制台中输入输出的问题。VC编译器 是默认关闭控制台的,而使用 GCC编译器 的是默认不关闭控制台的,需要额外的设置。

1. Visual Studio

1.1 VS 控制台不显示 以及 无法进行输入输出的情况

  在Visual Studio中,默认是设置关闭控制台的,就算默认弹出控制台窗口,很可能也不能使用。

  如果想显示控制台窗口,或者希望能进行输入输出,可以在所有的 #include <graphics.h> 之前定义一个宏
  #define SHOW_CONSOLE (show console, 即显示控制台)

  需要注意的是,是 所有的 #include <graphics.h> 之前,多个源文件都有这句的时候,在每个前面都要加上,漏了一个也是不行的。

#define SHOW_CONSOLE	//在#include <graphics.h>或 <ege.h>之前加上
#include <graphics.h>

  现在,源文件中输入下面的程序,如果弹出了控制台窗口, 并显示了 Hello ege. 的话,那就可以了,后面输入输出都和平常一样(conio.h头文件中的 getch()会有些冲突)

#define SHOW_CONSOLE
#include <stdio.h>
#include <graphics.h>

int main()
{
	printf("Hello ege.");		//控制台输出

	initgraph(640, 480, 0);		//创建EGE图形窗口

	setbkcolor(WHITE);

	getch();
	closegraph();
	return 0;
}

在这里插入图片描述

1.2 VS控制台的关闭问题

  Visual Stuio默认应该是关闭控制台的,但是有些版本会自动弹出,并且控制台也无法输入输出。

  如果想使用,参照上面的说明,定义一下 #define SHOW_CONSOLE 就可以了。现在说明一下自动弹出的控制台如何关闭的问题。主要操作是在项目属性里面设置一下 子系统。控制台自动弹出是因为将子系统设置成控制台了,改掉就好了。

  先进入项目属性设置,如下图。

在这里插入图片描述

所有配置和所有平台子系统 改成 未设置,点击确定,这样就好了。

在这里插入图片描述
  再运行一下下面的程序,看看控制台是不是默认关闭的。想弹出的话定义 SHOW_CONSOLE 就好了。

#include <stdio.h>
#include <graphics.h>

int main()
{
	printf("Hello ege.");		//控制台输出

	initgraph(640, 480, 0);		//创建EGE图形窗口

	setbkcolor(WHITE);

	getch();
	closegraph();
	return 0;
}

2. CodeBlocks

  CodeBlocks 默认是有控制台弹出的,这时候直接使用 printf(), cout 就可以输入输出了。如果没有任何显示,那就说明配置的时候出了问题。

2.1 CodeBlocks 控制台显示但无法输入输出的情况

  在有些人的配置教程,会有一个 -mwindows 的链接参数,这个链接参数会屏蔽控制台,造成控制台无法输入输出。我们要把这个去掉。
  注意一下左边栏的那三个,分别是

  • ege (项目选项)
  • Debug (目标配置选项)
  • Release(目标配置选项)。

检查一下,三个选项的配置,-mwindows 都要去掉。

在这里插入图片描述

2.2 CodeBlocks 关闭控制台的方法

  这里主要是设置项目类型为GUI应用(图形用户界面应用),这样就能关闭控制台了。

选择Project -> Properties
在这里插入图片描述

  • 点击 Build targets,把上面的 Type 改为 GUI application ,而不是 Console application, 点击OK

在这里插入图片描述

  • 选择 Build -> Rebuild, 然后选择Build -> Run 运行(工具栏也有,直接点就行)
    在这里插入图片描述
  • 可以看到控制台窗口已经没了
  • 直接双击运行生成的exe文件也是没有控制台窗口的
    在这里插入图片描述

3. Dev-C++

Dev-C++默认是显示控制台窗口的,直接就可以使用 printf(), std::cout 进行输出输出。

3.1 Dev-C++ 控制台不显示或不可用的原因

  如果创建空项目时,控制台却不可用,那可能是你配置EGE时出了差错。是不是错把 -mwindows 加上了?如果加上了,要删掉。我的安装教程里没出现过这个,但你可能参照了其它教程进行安装。
  参数如下面所示,都是链接的库,是 没有 -mwindows( 当然,如果你知道 GCC 的编译参数,是可以额外添加其它的参数的。 )
在这里插入图片描述

3.2 Dev-C++ 中关闭控制台的方法

点击工具栏 项目(Project) -->项目属性(Prject Option…)
在这里插入图片描述
项目类型(Type) 选择Win32 GUI (图形用户界面程序), 而不是控制台程序(Win32 Console), 点击OK即可
在这里插入图片描述
  先点击 运行(Execute) ->全部重新编译(Rebuild All), 项目设置改变后,最好先进行一下这个。
  然后按照平常的编译运行即可。
在这里插入图片描述
在这里插入图片描述

4. Visual Studio Code

  Visual Studio Code 内部并没有集成默认编译器,需要配合外部编译器使用。所以这里的配置仅针对GCC 编译器,其它编译器可以翻阅相关资料。

4.1 GCC 开启关闭控制台的参数 (-mwindows)

  GCC 只需要在链接时加入 -mwindows 参数即可 关闭控制台。加入编译后,控制台输入输出函数将失效。
  编译指令参考如下:

g++  main.cpp  -o ege.exe  -lgraphics64 -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lwinmm -lgdiplus  -mwindows

g++

  • main.cpp //文件名
  • -o ege.exe //生成执行文件名
  • -lgraphics64 -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lwinmm -lgdiplus //链接库
  • -mwindows //编译成图形界面程序而不是控制台程序

  编译指令是在tasks.json 中设置
在这里插入图片描述

4.2 Visual Studio Code 控制台显示模式

  Visual Studio Code有集成终端界面,不同的终端都会默认集成到终端窗口界面中。程序运行时,控制台交互会在终端窗口中进行
  如下图:cppdbg:ege.exe 选项即为程序运行时的控制台。
在这里插入图片描述
  如果想要设置控制台单独打开一个窗口,而不是集成到终端界面,可以在 launch.json 的配置项 externConsole中设置 是否生成外部控制台

true: 生成外部控制台(黑框框)
false: 集成到终端界面,交互都在这里进行。

在这里插入图片描述

在这里插入图片描述

三、EGE中控制台的使用

  如果参照上面配置完成后,并且控制台已经可以使用后,就可以在程序利用控制台进行输入输出了。

  需要注意的是,我们应该 以我们的程序为主,窗口只是程序和我们进行交互的界面,程序可以决定往哪个窗口输出,由哪个窗口输入。

  程序并不等于控制台窗口,这个不要搞混了。因为有人问过:控制台输入的变量,怎么在EGE窗口中使用呢?窗口只是用来交互的,主体还是程序,输入的数据会进入到程序里面,程序可以对这些数据随意进行处理,之后通过调用相关接口来决定将数据往哪个窗口进行输出。

  控制台我们是用 printf() , std::cout 等进行输出。在EGE窗口中,输出可以是绘制图形和输出文字。输出文字使用xyprintf(), 这个和 printf() 类似,只是多了输出的坐标,因为图形窗口的输出排版是由坐标指定的,而控制台只是输出连续的文符,由控制符控制排版。绘制图形则是使用ege中的绘图函数。

1. 控制台输入

  控制台的输入输出和原来的操作是一样。下面的一个示例代码通过从控制台中输入参数来控制绘图。
在这里插入图片描述
代码如下:
  即通过控制台输入圆的半径,绘图时根据这个参数绘制圆。
  (输入数字,回车后就可以显示出圆,输入的数字不同,圆的大小也不同。)

#define SHOW_CONSOLE
#include <graphics.h>
#include <cstdio>

int main()
{
	initgraph(640, 480, 0);

	setcolor(EGERGB(0xFF, 0x0, 0x0));
	setbkcolor(WHITE);
	
	//控制台交互,通过输入半径值控制圆的大小
	printf("请输入圆的半径(1~200)之间):");
	int radius = 100;
	scanf("%d", &radius);

	//半径范围限制
	if (radius < 1)
		radius = 1;
	else if (radius > 200)
		radius = 200;
	
	//绘制半径为radius的圆
	circle(320, 240, radius);

	getch();

	closegraph();
	return 0;
}

2. getch()的冲突问题

  ege.hconio.h 这两个头文件是不能在同一个源文件里包含的。主要是 getch() 的冲突问题。

  EGE中定义了和 conio.h 中同名的 getch(),从而导致了冲突。EGE中的 getch() 只能在EGE图形窗口中使用。所以正常使用 getch() 时,控制台是不能暂停的。

  但是我们在使用控制台时,还是有暂停并且输入不回显的需求,为此,我们可以另外新建一个源文件,只包含 conio.h ,然后定义一个新函数,来调用 conio.h 中的 getch()。我们在使用到的地方声明一下这个函数即可。
  (注意,VS中使用 getch() 可能会报错,这时候就要换成 _getch())

示例:

  如下图,在项目中额外新建一个源文件 console.cpp,这里需要多文件编译 (将代码写在多个文件上,分别编译后,链接生成执行程序),并非只写一个文件。

在这里插入图片描述
  下面是 源文件:console.cpp 的内容,这里包含<conio.h>,然后自定义一个函数来调用<conio.h>中的getch()函数。

在Visual Studio中,getch() 会报错,因为 getch() 已被弃用,可以将 getch() 改成 _getch()

#include <conio.h>

int getch_console()
{
	return getch();	//控制台暂停 -->VS中,报错则可以改成 _getch()
}

  下面是 源文件:main.cpp 的内容:
  (注意了,这里需要用到上面 console.cpp 中定义的 getch_console() 函数 ,单单 main.cpp 是无法编译成功的)

#define SHOW_CONSOLE
#include <graphics.h>
#include <cstdio>

int getch_console();	//声明一下这个函数,放在头文件也行

int main()
{
	initgraph(640, 480, 0);

	setcolor(EGERGB(0xFF, 0x0, 0x0));
	setbkcolor(WHITE);
	xyprintf(20, 20, "控制台暂停,请查看控制台");
	
	//控制台交互,通过输入半径值控制圆的大小
	printf("暂停,按任意键继续\n");
	
	//控制台暂停
	getch_console();
	
	cleardevice();
	
	circle(320, 240, 100);
	
	printf("\n圆已经输出到EGE图形窗口了,请查看EGE窗口\n");

	//EGE窗口暂停
	xyprintf(20, 20, "暂停,按任意键继续 ");
	
	getch();

	closegraph();
	return 0;
}

专栏:EGE专栏

  • 12
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依稀_yixy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值