当前位置 博文首页 > 依稀_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
骑毛驴的猴的博客:【2020-11-04】JS逆向之某宝模拟登入 骑毛驴的猴的博客:【2020-11-05】Flask+uWGSI+Nginx的部署 骑毛驴的猴的博客:【2020-11-11】JS逆向之蘑菇街商品数据接口解 骑毛驴的猴的博客:【2020-11-16】Python反爬虫之字体反爬 骑毛驴的猴的博客:【2020-11-22】JS逆向之某团美食商铺数据获取 骑毛驴的猴的博客:【2020-11-26】不扣JS系列之某医保服务平台数 骑毛驴的猴的博客:【2020-11-30】猿人学任务一之js混淆 - 源码 骑毛驴的猴的博客:【2020-12-11】JS逆向之某某排污监测信息发布 骑毛驴的猴的博客:【2020-12-16】JS逆向之某变IP 骑毛驴的猴的博客:【2020-12-23】JS逆向之某在线监测分析平台 骑毛驴的猴的博客:【2021-01-05】JS逆向之B站模拟登入(含极验 骑毛驴的猴的博客:【2021-01-11】JS逆向之美团模拟登入 骑毛驴的猴的博客:【2021-01-14】JS逆向之招标投标公告服务平台 骑毛驴的猴的博客:【2021-01-22】JS逆向之七麦数据analysis获取 骑毛驴的猴的博客:【2021-01-27】JS逆向之某片滑块参数分析 骑毛驴的猴的博客:【2021-01-29】JS逆向之数美滑块参数分析 骑毛驴的猴的博客:【2021-02-05】JS逆向之某某银行理财产品 骑毛驴的猴的博客:【2021-02-19】JS逆向之365玩游戏平台(worke 骑毛驴的猴的博客:【2021-03-16】JS逆向之有赞滑块分析 骑毛驴的猴的博客:【2021-03-17】JS逆向之某实时票房榜数据解密 骑毛驴的猴的博客:【2021-03-23】JS逆向之站D爷免费代理 骑毛驴的猴的博客:小红书接口参数X-sign 骑毛驴的猴的博客:【2021-04-02】JS逆向之某查查pe端cookie分析 骑毛驴的猴的博客:【2021-07-15】JS逆向之网易云音乐登入--最新 骑毛驴的猴的博客:【2021-07-15】小红书web端数美验证码 骑毛驴的猴的博客:【2021-04-14】xhs小程序端滑块验证码 骑毛驴的猴的博客:【2021-04-23】JS逆向之某船舶物资采购平台动 骑毛驴的猴的博客:【2021-04-25】APP逆向之某智网加密数据 骑毛驴的猴的博客:【2021-05-06】JS逆向之微店登入ua 骑毛驴的猴的博客:【2021-05-07】JS逆向之①号店登入(含滑块) 骑毛驴的猴的博客:【2021-05-12】JS逆向之dy创作者平台登入滑块 骑毛驴的猴的博客:【2021-05-25】JS逆向之某酷视频搜索接口(面 骑毛驴的猴的博客:【2021-06-03】JS逆向之wm世界主页滑块 骑毛驴的猴的博客:【2021-06-07】JS逆向之同花顺cookie(最新v值 signature(最新)_骑毛驴的猴的博客:【2021-08-31】抖音web参数 骑毛驴的猴的博客:【2021-07-01】JS逆向之房xx滑块 骑毛驴的猴的博客:【2021-07-16】堆糖小程序 zes_96_骑毛驴的猴的博客:【2021-07-23】JS逆向之某乎x 骑毛驴的猴的博客:【2021-07-23】JS逆向之雷速体育canvas渲染数 骑毛驴的猴的博客:【2021-07-26】JS逆向之某某西游藏宝阁 骑毛驴的猴的博客:【2021-07-27】JS逆向之dy滑块 骑毛驴的猴的博客:【2021-08-18】小红书x-s 骑毛驴的猴的博客:【2021-09-07】JS逆向之空气质量历史数据查询 骑毛驴的猴的博客:得物web端滑块及sign 骑毛驴的猴的博客:【2021-09-16】最右app之websign js_security_passport)_骑毛驴的猴的博客:【2021-09-17】JS逆向 英雄哪里出来:??13万字《C语言动漫对话教程(入门篇)》??(建议收 xpj8888的博客:wordpress异常管理(三)添加链接后点击访问:40 xpj8888的博客:PyCharm快简介大全,单步调试快捷键、查询/替换 xpj8888的博客:PyCharm快捷键大全(一):编辑快捷键、单步调试快 ASP.NET Core MVC 修改视图的默认路径及其实现原理解析 docker compose 一键部署分布式配置中心Apollo的过程详解 使用SQL SERVER存储过程实现历史数据迁移方式 Django框架之django admin的命令行详解 解决python将xml格式文件转换成txt文件的问题(xml.etree方法) 网站加速哪家强?四大免费CDN服务评测大PK php session无法传值怎么办 macbook pro怎么安装php7 高质量笔记来了!关于PHP7性能优化 php轻松实现可爱的随机头像 微信公众账号怎么注册申请?微信公众账号注册流程 微信公众平台服务号、订阅号和企业号之间有什么区别? android Chronometer控件使用大全 关于python变量的引用以及在底层存储原理 SpringBoot 在项目启动之后执行自定义方法的两种方式小结 uniapp实现滑动评分效果 vue中LocalStorage与SessionStorage的区别与用法 SEO案例分析 alimama做SEO引流量的方法 如何解决php图片名中文乱码问题 php命令行输出乱码怎么办