EGE专栏:EGE专栏
文章目录
相关问题快速浏览
1. 控制台窗口是什么?
C/C++ 日常使用的可以接收用户按键输入以及可以显示字符的黑窗口。
2. 原本还能使用控制台,为什么配置 EGE 后就不能用了?
首先说明,配置了 EGE 后还是可以继续使用控制台的。如果控制台无法使用,很可能是被禁用了,需要先启用控制台。
控制台设置需要分编译器讨论,主要分为两种:MSVC 编译器和 GCC 编译器。
编译器 | 相关IDE | 控制台默认状态 |
---|---|---|
MSVC | Visual Studio | 无法使用 |
GCC | Dev-C++、Code Blocks、小熊猫 C++ | 可以正常使用 |
2.1 Visual Studio 中启用控制台
包含 EGE 头文件后 默认关闭控制台,若要使用,可以在包含 EGE 头文件之前先设置宏定义 #define SHOW_CONSOLE
。如
#define SHOW_CONSOLE
#include <graphics.h>
2.2 使用 GCC 编译器的软件(Dev-C++, CodeBlocks, 小熊猫C++)
其它使用 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;
}
二、EGE中控制台的设置
像我们日常使用的如 QQ、微信、Office、Edge 浏览器等软件,正常运行时都是不显示控制台窗口的。这些图形界面有自己的输入输出,各种个性化的输入框,完全不需要控制台。
但是在图形窗口中实现输入输出肯定是没有直接使用控制台窗口那么方便的。控制台窗口是系统内置的,正确性可以得到保证。而如果是开发者自己在图形窗口中实现输出输出,就有很大的不确定性。并且在控制台中输入输出的文本信息都可以保留,滚动浏览,非常方便开发者进行调试。
控制台窗口主要用来输出调试相关的信息,让开发者了解程序执行过程。给用户使用的图形界面程序不应该保留控制台窗口。
可以在开发的时候启用控制台窗口,用来输出调试信息,开发完成后交付给用户使用时禁用控制台。
EGE在部分编译器(如 MSVC 编译器)下,是 关闭控制台并且屏蔽控制台输入输出的。所以如果刚接触 EGE 时遇到无法使用 printf(), cout 进行输出时,不要慌,按照下面的方法设置一下即可。
对于常用的三款IDE,下面介绍一下如何设置控制台的显示与关闭,并解决无法在控制台中输入输出的问题。VC编译器 是默认关闭控制台的,而使用 GCC编译器 的是默认不关闭控制台的,需要额外的设置。
1. Visual Studio
1.1 VS 控制台不显示 以及 无法进行输入输出的情况
在 Visual Studio 中,默认是禁用控制台的,也就是说控制台是无法使用的,就算是能弹出控制台窗口,很可能也无法进行输入输出。
如果希望在 ege 程序中使用控制台,可以在 #include <graphics.h> 之前定义一个宏 SHOW_CONSOLE
,如下所示 (show console 即显示控制台的意思):
#define SHOW_CONSOLE //在#include <graphics.h>或 <ege.h>之前加上
#include <graphics.h>
需要注意的是,是 所有的 #include <graphics.h> 之前,当多个源文件都包含了 <graphics.h>
或 ege.h
头文件时,在包含之前都要加上这个宏定义,漏掉一个也是不行的。
多文件编译时,为防止冲突,也可以完整地写成如下形式:
#ifndef SHOW_CONSOLE
#define SHOW_CONSOLE //在#include <graphics.h>或 <ege.h>之前加上
#endif
#include <graphics.h>
现在,源文件中输入下面的程序,如果弹出了控制台窗口, 并显示了 Hello, Easy Graphics Engine!
的话,那就可以了,后面输入输出都和平常的 C++ 程序一样
getch() 比较特殊,虽然这是 <conio.h> 中的函数,但 ege 中有同名函数,名字会冲突,控制台中使用需要改为 getch_console()。
#define SHOW_CONSOLE
#include <stdio.h>
#include <graphics.h>
int main()
{
printf("Hello, Easy Graphics Engine!"); //控制台输出
initgraph(640, 480, 0); //创建EGE图形窗口
setbkcolor(WHITE);
getch();
closegraph();
return 0;
}
1.2 Visual Studio 控制台的关闭问题
Visual Stuio 默认是关闭控制台的,但从某个版本(VS2019)开始控制台会自动弹出,并且控制台也无法正常输入输出。
如果想使用控制台,参照上面的说明,定义一下 #define SHOW_CONSOLE 就可以了。现在说明一下自动弹出的控制台如何关闭的问题。
方法是在 项目属性 中将 子系统 设置成 未设置。
子系统设置为控制台时会自动弹出无法正常输入输出的控制台窗口,设置成未设置就好了。
操作步骤如下:点击菜单栏 项目–>项目属性,进入到 项目属性 的设置中,如下图所示。
因为全部配置都要统一改动,所以要选择 所有配置 和 所有平台。然后在左侧栏中点击 链接器–>系统,将 子系统 改成 未设置,点击确定进行保存,这样控制台就不会自动弹出了。后续如果想要显示控制台,可以参照上面的方法定义 SHOW_CONSOLE
宏。
再重新编译运行一下测试例程,检查问题是否已解决。
#include <stdio.h>
#include <graphics.h>
int main()
{
printf("Hello, Easy Graphics Engine!"); //控制台输出
initgraph(640, 480, 0); //创建EGE图形窗口
setbkcolor(WHITE);
getch();
closegraph();
return 0;
}
2. CodeBlocks
2.1 CodeBlocks 开启控制台
CodeBlocks 默认是开启控制台的,可以正常使用 scanf()
, printf()
进行输入输出。如果程序在运行时没有控制台窗口弹出或者控制台窗口无法输出内容,那问题可能是出在配置上。
在 CodeBlocks 中禁用控制台一般就两个方式:
- 将项目类型设置为图形用户界面(GUI)程序
- 在链接参数中添加
-mwindows
参数。
只要设置了其中一个,控制台都会被禁用。
实际上将项目类型设置为图形界面程序就是在链接时会自动加上
-mwindows
参数。
首选点击菜单栏 构建(Build) --> 重新构建(Rebuild),然后点击下方的 构建日志(Build log),在输出的编译命令中检查是否有 -mwindows
参数。
- 如果没有
-mwindows
,控制台没有输入输出是代码问题,原因可能是函数没有调用导致代码并没有执行等等,应回去检查代码。 - 如果有
-mwindows
,则是配置问题,之前配置 ege 时,可能参照了其它教程误将控制台禁用了,需要改正相关配置。
下面则是检查相关配置的具体步骤。
点击菜单栏 设置(Settings) --> 编译器(Compiler),然后点击 链接器选项(Linker option) ,查看是否有 -mwindows
参数。如果有则需要将其删除并保存设置,回到主界面先点击 重新构建(Rebuild) 再点击运行查看控制台窗口是否正常。
菜单栏选择 项目(Project) --> 构建选项(Build options),进入构建选项界面。
如下图所示,点击 链接设置(Linker option) 选项卡,检查是否有 -mwindows
参数,有的话需要删除掉。左边栏可以看到有 项目名和 Debug, Release 共三个配置,三个配置都点击检查一遍。如果发现有 -mwindows
参数则需要将其删除并保存设置,回到主界面先点击 重新构建(Rebuild) 再点击运行查看控制台窗口是否正常。
最后,菜单栏选择 项目(Project) --> 属性(Properties),进入到项目属性界面,点击 构建目标(Build targets),在 **类型(Type)**中选择 控制台应用(Console application)。(GUI application 会禁用控制台,希望关闭控制台时才会选择这个选项)
可以看到左侧栏有 Debug 和 Release 两个目标,如果都希望显示控制台,则需要两个都进行设置。
检查完上面三个位置后,相信就可以找到之前误设置的地方了。回到主界面先点击 重新构建(Rebuild) 再点击运行查看控制台窗口是否已启用。
2.2 CodeBlocks 关闭控制台的方法
如果想关闭控制台,有两种方式:一是在项目属性中将项目类型设置为 GUI application(图形用户界面应用),二是在全局设置中加入 -mwindows
链接参数。第二个不推荐,因为这会影响到所有的程序,会导致写 C/C++ 控制台程序时会弹不出控制台。因此如果想要关闭控制台,最好新建项目,只针对 ege 项目进行配置,这样就不会影响到一般的 C/C++ 控制台程序。
新建项目后,选择 项目(Project) -> 属性(Properties)。
在 构建目标(Build targets) 中,将 类型(Type) 改为 图形界面应用(GUI application) 即可关闭控制台。可以看到左侧栏有 Debug 和 Release 两个目标,如果都不希望出现控制台,则两个都需要进行设置。
配置完成后,我们需要重新编译运行,检查一下是否配置成功。选择 Build -> Rebuild(重新构建), 构建完成后选择 Build -> Run 运行(也可以直接点击工具栏中的按钮)。
3. Dev-C++
Dev-C++ 默认是显示控制台窗口的,直接就可以使用 scanf()
, printf()
进行输入输出。
3.1 Dev-C++ 控制台不显示或不可用的原因
如果创建了空项目,程序运行时控制台却不可用,那可能是你配置 EGE 时出了差错。 -mwindows
链接参数会导致控制台被禁用,因此如果想要使用控制台,那就应该去掉这个链接参数。
Dev-C++ 配置时参数如下图所示,不需要加 -mwindows
参数。
3.2 Dev-C++ 中关闭控制台的方法
这里对 Dev-C++ 的 单文件 和 项目 这两种开发模式分别进行讨论。
3.2.1 项目中关闭控制台的方法
如果是在项目中关闭控制台,只需要在项目属性中简单设置即可。但是
点击菜单栏 项目(Project) -->项目属性(Prject Options…)
在 项目类型(Type) 中选择 图形用户界面程序(Win32 GUI), 而不是控制台程序(Win32 Console),点击 确定(OK) 应用即可
先点击 运行(Execute) ->全部重新编译(Rebuild All), 项目设置改变后,最好先执行一下这个步骤。
最后点击 运行 测试一下,之后按照平常的步骤编译运行即可。
3.2.2 单文件中关闭控制台的方法
项目属性的设置方法并不适用于单文件的开发方式,因为单文件是不建项目的,所以无法在项目属性中设置。
单文件是在全局设置中进行设置,这里的设置不仅影响单文件,同时也会影响项目。
由于会影响到一般的 C/C++ 控制台程序,导致控制台无法使用,所以更建议建立项目,在项目中进行设置。
在菜单栏 工具->编译选项中进入。
进入到编译选项后,可以在 编译器 选项卡的 在链接器命令行中加入以下命令 中添加 -mwindows
参数即可禁用控制台(记得给选项打上勾)
。不过这会影响所有的单文件开发,会导致普通的 C/C++ 程序无法弹出控制台,所以在编写普通 C/C++ 程序时需要再次进入这里将 -mwindows
参数删除。
如果不想频繁设置,还可以另外新建一个专门的编译器配置,进行不同的程序开发时只需要切换编译器配置即可,但是 Dev-C++ 中没有复制编译器配置的功能,如果想设置 64/32 bit, debug/release 等不同的配置,步骤会比较繁琐,初学者不建议,所以这里不再另外说明。
4. Visual Studio Code
Visual Studio Code 内部并没有集成默认编译器,需要配合外部编译器使用。所以这里的配置仅针对GCC 编译器,其它编译器可以翻阅相关资料。
4.1 GCC 开启关闭控制台的参数 (-mwindows)
GCC 只需要在链接时加入 -mwindows
参数即可 关闭控制台。
编译指令参考如下:
g++ main.cpp -o ege.exe -lgraphics -lgdi32 -lgdiplus -mwindows
g++
- main.cpp //文件名
- -o ege.exe //生成执行文件名
- -lgraphics -lgdi32 -lgdiplus //链接库
- -mwindows //项目类型为图形界面程序
编译指令是在tasks.json
中设置,在参数中加入 -mwindows
即可。
4.2 Visual Studio Code 控制台显示模式
Visual Studio Code有集成终端界面,不同的终端都会默认集成到终端窗口界面中。程序运行时,控制台交互会在终端窗口中进行。
如下图:cppdbg:ege.exe
选项即为程序运行时的控制台。
如果想要设置控制台单独打开一个窗口,而不是集成到终端界面,可以在 launch.json
的配置项 externConsole
中设置 是否生成外部控制台。
externConsole 选项值 | 含义 |
---|---|
true | 使用外部控制台 |
false | 使用 VS Code 集成终端 |
三、EGE 中控制台的使用
如果参照上面配置完成后,并且控制台已经可以使用后,就可以在程序利用控制台进行输入输出了。
需要注意的是,我们应该 以我们的程序为主,窗口只是程序和我们进行交互的界面,程序可以决定往哪个窗口输出,由哪个窗口输入。
程序并不等于控制台窗口,这个不要搞混了。因为有人问过:控制台输入的变量,怎么在EGE窗口中使用呢?
窗口只是用来交互的,主体还是程序,程序可以调用相关函数从各种窗口中获取输入,计算完成之后再通过调用相关接口来决定将数据往哪个窗口进行输出。
控制台我们是用 printf() , std::cout 等进行输出。在EGE窗口中,输出可以是绘制图形和输出文字。输出文字使用xyprintf(), 这个和 printf() 类似,只是多了输出的坐标,因为图形窗口的输出排版是由坐标指定的,而控制台只是输出连续的文符,由控制符控制排版。绘制图形则是使用ege中的绘图函数。
1. 控制台输入
控制台的输入输出和原来的操作是一样。下面的一个示例代码通过从控制台中输入参数来控制绘图。
代码如下:
即通过控制台输入圆的半径,绘图时根据这个参数绘制圆。
(输入数字,回车后就可以显示出圆,输入的数字不同,圆的大小也不同。)
#define SHOW_CONSOLE
#include <graphics.h>
#include <stdio.h>
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.h> 和 <conio.h> 这两个头文件是不能在同一个源文件里包含的。主要是 getch()
的冲突问题。
EGE 中定义了和 <conio.h> 中同名的 getch()
,从而导致了冲突。EGE 中的 getch()
只能在 EGE 图形窗口中使用。所以正常使用 getch()
时,控制台是不能暂停的。
如果想使用 <conio.h> 中的 getch()
,可以使用 EGE 中的 getch_console()
来代替。
专栏:EGE专栏