当前位置 博文首页 > 依稀_yixy的博客:EGE 控制台窗口的设置
??控制台是我们学习C/C++首先要接触的。控制台给我们提供了输入输出的交互环境。我们可以通过调用简单的语句,就能往上面输出文字,获取输入的字符。
??在C语言的 Hello world 程序中,通过标准库中的 printf() 即可往控制台输出文字,而通过 scanf(), getchar(), getch(), getche() 等从控制台得到输入。
#include <stdio.h>
int main()
{
printf("Hello world.");
return 0;
}
??但是正是因为多数C语言课程,主要教授的是C语言的语法知识和一些基础的算法。这个使用控制台是足够了的,但是会让人觉得编程就只能使用这个黑窗口。
??EGE就是为了给初学者增加一点学习的乐趣,以及图形编程方面的东西,而不是单纯的对数据进行计算,是作为学习编程的一个过渡工具。因为如果接触到现在的图形编程库,那是初学者难以掌握,需要不低的编程水平,初学者来学习那些库,估计会学到崩溃。
??EGE通过额外创建一个窗口,作为EGE的图形窗口,并增加可以在里面绘图的函数,从而实现基础的绘图功能,已经能够满足学习的需求了。
??图形界面中,输入输出是没有控制台那么方便的。并且控制台可以一条一条地显示文本信息,可以很方便地进行调试,作用还是有的。但是像我们平常的软件,QQ, Office, 浏览器,也没见哪个软件是带有黑窗口的。因为这些图形界面有自己的输入输出,各种个性化的输入框,完全不需要控制台。
??所以在作图形界面程序的时候,不应该还保留控制台。但是控制台可以在开发的时候使用,用来输出调试信息,开发完成的时候,就关闭控制台。
??EGE在有些情况下,是关闭控制台并且屏蔽控制台输入输出的。所以刚接触EGE时,想要使用输入输出却发现之前的 printf(), cout 没了作用,不知道该怎么办。
??其实控制台的输入输出和平常的操作是一样的,没有作用只是EGE对控制台做了屏蔽操作,意思正常运行情况下不应该携带控制台。
??对于常用的三款IDE,下面介绍一下如何设置控制台的显示与关闭,并解决无法在控制台中输入输出的问题。VC编译器是默认关闭控制台的,而使用GCC编译器的是默认不关闭控制台的,需要额外的设置。
??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;
}
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;
}
??CodeBlocks 默认是有控制台弹出的,这时候直接使用 printf(), cout 就可以输入输出了。如果没有任何显示,那就说明配置的时候出了问题。
??在有些人的配置教程,会有一个 -mwindows 的链接参数,这个链接参数会屏蔽控制台,造成控制台无法输入输出。我们要把这个去掉。
??注意一下左边栏的那三个,分别是
检查一下,三个选项的配置,-mwindows 都要去掉。
??这里主要是设置项目类型为GUI应用(图形用户界面应用),这样就能关闭控制台了。
选择Project -> Properties
Dev-C++默认是显示控制台窗口的,直接就可以使用 printf(), std::cout 进行输出输出。
??如果创建空项目时,控制台却不可用,那可能是你配置EGE时出了差错。是不是错把 -mwindows 加上了?如果加上了,要删掉。我的安装教程里没出现过这个,但你可能参照了其它教程进行安装。
??参数如下面所示,都是链接的库,是没有 -mwindows 的。当然,如果你知道添加GCC的编译参数,可以自己额外添加其它的参数。
点击工具栏 项目(Project) -->项目属性(Prject Option…)
项目类型(Type) 选择Win32 GUI (图形用户界面程序), 而不是控制台程序(Win32 Console), 点击OK即可
先点击全部重新编译(Rebuild All), 项目设置改变后,最好先进行一下这个。
然后按照平常的编译运行即可。
??如果参照上面配置完成后,并且控制台已经可以使用后,就可以在程序利用控制台进行输入输出了。
??需要注意的是,我们应该以我们的程序为主,窗口只是程序和我们进行交互的界面,程序可以决定往哪个窗口输出,由哪个窗口输出。程序并不是控制台窗口,这个不要搞混了,因为有人问过:控制台输入的变量,怎么在EGE窗口中使用?窗口只是用来交互的,主体还是程序,输入的数据会进入到程序里面,程序通过调用接口来决定将数据往哪个窗口进行输出。
??控制台我们是用 printf() 进行输出,在EGE窗口中,输出可以是绘制图形和输出文字,输出文字使用xyprintf(), 这个和 printf() 类似,只是多了输出的坐标,因为图形窗口的输出排版是由坐标指定的,而控制台只是输出连续的文符,由控制符控制排版。
代码如下:
即通过控制台输入圆的半径,从而改变绘制圆的大小。通过输入数字,回车后就可以显示出圆,输入的数字不同,圆的大小也不同。
#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;
}
??ege.h 和 conio.h 这两个头文件是不能在同一个源文件里包含的。主要是 getch() 的冲突问题。
??EGE中定义了和 conio.h 中同名的 getch(),从而导致了冲突。EGE
中的 getch() 只能在EGE图形窗口中使用。所以正常使用 getch() 时,控制台是不能暂停的。
??但是我们在使用控制台时,还是有暂停并且输入不回显的需求,为此,我们可以另外新建一个源文件,只包含 conio.h ,然后定义一个新函数,来调用 conio.h 中的 getch()。我们在使用到的地方声明一下这个函数即可。
注意,VS中使用 getch() 可能会报错,这时候就要换成 _getch()
源文件:console.cpp
#include <conio.h>
int getch_console()
{
return getch();
}
源文件:
#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;
}
cs