当前位置 博文首页 > 依稀_yixy的博客:EGE 控制台窗口的设置

    依稀_yixy的博客:EGE 控制台窗口的设置

    作者:[db:作者] 时间:2021-09-15 10:22

    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的图形窗口,并增加可以在里面绘图的函数,从而实现基础的绘图功能,已经能够满足学习的需求了。

    EGE中控制台的设置

    ??图形界面中,输入输出是没有控制台那么方便的。并且控制台可以一条一条地显示文本信息,可以很方便地进行调试,作用还是有的。但是像我们平常的软件,QQ, Office, 浏览器,也没见哪个软件是带有黑窗口的。因为这些图形界面有自己的输入输出,各种个性化的输入框,完全不需要控制台。
    ??所以在作图形界面程序的时候,不应该还保留控制台。但是控制台可以在开发的时候使用,用来输出调试信息,开发完成的时候,就关闭控制台。
    ??EGE在有些情况下,是关闭控制台并且屏蔽控制台输入输出的。所以刚接触EGE时,想要使用输入输出却发现之前的 printf(), cout 没了作用,不知道该怎么办。
    ??其实控制台的输入输出和平常的操作是一样的,没有作用只是EGE对控制台做了屏蔽操作,意思正常运行情况下不应该携带控制台
    ??对于常用的三款IDE,下面介绍一下如何设置控制台的显示与关闭,并解决无法在控制台中输入输出的问题。VC编译器是默认关闭控制台的,而使用GCC编译器的是默认不关闭控制台的,需要额外的设置。

    1. Visual Studio

    ??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;
    }
    

    2. CodeBlocks

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

    控制台出现但无法输入输出的情况

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

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

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

    在这里插入图片描述

    关闭控制台的方法

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

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

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

    在这里插入图片描述

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

    3. Dev-C++

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

    控制台不显示或不可用的原因

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

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

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

    EGE中控制台的使用

    ??如果参照上面配置完成后,并且控制台已经可以使用后,就可以在程序利用控制台进行输入输出了。
    ??需要注意的是,我们应该以我们的程序为主,窗口只是程序和我们进行交互的界面,程序可以决定往哪个窗口输出,由哪个窗口输出。程序并不是控制台窗口,这个不要搞混了,因为有人问过:控制台输入的变量,怎么在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;
    }
    

    在这里插入图片描述

    getch()的冲突问题

    ??ege.hconio.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