easy X(C语言图形化界面)学习

易错:

1.文件为(.cpp)后缀

头文件

#include <graphics.h> // 包含图形库的头文件

创建窗口

在这里插入图片描述

# define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <graphics.h> // 包含图形库的头文件

int main()
{
	// 创建一个窗口  大 小
	initgraph(640, 480);
	
	getchar(); // 保持窗口打开
	
	// 关闭窗口
	closegraph();

	return 0;
}

运行结果如下:
在这里插入图片描述
第三个参数

	//1 创建一个窗口
	initgraph(640, 480,SHOWCONSOLE);
	   // 这里第三个参数是显示控制台
	  //第三个参数,如果是NOCLOSE,窗口关闭键失效。NOMINIMIZE,窗口缩小键失效
	  // 二者 NOCLOSE | NOMINIMIZE ,则全部失效

图形填充

在这里插入图片描述
画几个圆

# define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <graphics.h> // 包含图形库的头文件

int main()
{
	//1 创建一个窗口
	initgraph(640, 480);

	//设置背景颜色
	setbkcolor(WHITE);
	cleardevice();//清屏


	// 给圆填涂颜色
	setfillstyle(PS_SOLID,5);// 设置线条格式  ps_solid 实线  5个像素
	setfillcolor(YELLOW);// 设置填充颜色
	setlinecolor(BLUE);// 设置线条颜色

	//画个圆
	circle(50, 50, 50);
	fillcircle(50, 150, 50);
	solidcircle(50, 250, 50);

	getchar();
	//2 关闭窗口
	closegraph();

	return 0;
}

在这里插入图片描述

文字创建

在这里插入图片描述
举例:

	//绘制文字
	//设置颜色
	settextcolor(RED);
	//设置文字样式,大小,字体
	settextstyle(50, 0, "楷体");
	//设置背景模式  tran sparent 透明
	setbkmode(TRANSPARENT);
	//设置颜色 RGB
	settextcolor(RGB(0, 255, 13));//画板里的三原色数据
	outtextxy(50, 50, "打印字体咯~");

运行结果:
在这里插入图片描述
RGB画板的三原色数据
在这里插入图片描述

修改outtextxy函数,让其输出多个字符(字符串)
在这里插入图片描述
文字居中

	//把文字居中
	setfillcolor(YELLOW);// 设置填充颜色
	setlinecolor(BLUE);// 设置线条颜色
	setbkmode(TRANSPARENT);
	fillrectangle(200, 50, 500, 100);//500-200=300   100-50=50
	settextcolor(RED);
	char arr[] = "居中好吧!!!";
	int width = 300 / 2 - textwidth(arr) / 2;
	int height = 50 / 2 - textheight(arr) / 2;

	outtextxy(width + 200, height + 50, arr);

运行结果:
在这里插入图片描述


输出图片

在这里插入图片描述
举例:
输出图片相对路径时,把文件放在vs对应的项目文件中

	// 输出图片
	IMAGE img;// 定义一个(变量)对象
	// 加载图片
	// 相对路径:./表示当前文件下,../表示当前文件的上一级目录
	// 绝对路径:C:\Users\30438\Pictures\CSDN插图\MySQL.jpg
	loadimage(&img, "C:\\Users\\30438\\Pictures\\CSDN插图\\MySQL.jpg",250,250);
	//               若文件路径有空格   处理方法举例:\"12 easyX学习\"   
	//                          250,250为照片设置高度,宽度
	//相对路径
	//loadimage(&img, "./MySQL.jpg");
	putimage(0, 0, &img);//前面坐标用变量也可以

运行结果为:

在这里插入图片描述

鼠标消息函数(老版)

在这里插入图片描述

举例:

	//鼠标信息
	while (1)  // 不断地处理事务,需要循环
	{
		if (MouseHit())
		{
			MOUSEMSG msg = GetMouseMsg();
			printf("坐标(%d,%d)\n", msg.x, msg.y);//控制台打印鼠标的坐标
			// 消息分发
			switch (msg.uMsg)
			{
			case WM_LBUTTONDOWN:
				outtextxy(400, 400, "鼠标左键按下");
				break;
			case WM_RBUTTONDOWN:
				outtextxy(400, 400, "鼠标右键按下");
				break;
			}
		}
	}

运行结果:
在这里插入图片描述
判断鼠标是否在以上矩形中,若在就输出其语句

// 文字居中
	setfillcolor(YELLOW);// 设置填充颜色
	setlinecolor(BLUE);// 设置线条颜色
	setbkmode(TRANSPARENT);
	fillrectangle(200, 50, 500, 100);//500-200=300   100-50=50
	settextcolor(RED);
	char arr[] = "居中好吧!!!";
	int width = 300 / 2 - textwidth(arr) / 2;
	int height = 50 / 2 - textheight(arr) / 2;

	outtextxy(width + 200, height + 50, arr);

	//鼠标信息
	while (1)  // 不断地处理事务,需要循环
	{
		if (MouseHit())
		{
			MOUSEMSG msg = GetMouseMsg();
			//判断鼠标是否在上面的矩形中,若在就输出一句话,不过这个是重复一直输出
		    //若放在wm_lbuttondown这种,就点击再输出
			
			if (msg.x > 200 && msg.x < 500 && msg.y>50 && msg.y < 100)
			{
				printf("鼠标就在这个矩形里了哦\n");
			}


			// 消息分发
			switch (msg.uMsg)
			{
			case WM_LBUTTONDOWN:
				outtextxy(400, 400, "鼠标左键按下");
				printf("坐标(%d,%d)\n", msg.x, msg.y);//控制台打印鼠标的坐标
				break;
			case WM_RBUTTONDOWN:
				outtextxy(400, 400, "鼠标右键按下");
				printf("坐标(%d,%d)\n", msg.x, msg.y);//控制台打印鼠标的坐标
				break;
			}
		}
	}

运行结果:
在这里插入图片描述

鼠标操作(新版)

只是换了一个结构体,可以获取更多的信息(鼠标,按键等等等)

ExMessage msg;
	while (1)  // 不断地处理事务,需要循环
	{
		if (peekmessage(&msg,EM_MOUSE))
		{
			// 消息分发
			switch (msg.message)
			{
			case WM_LBUTTONDOWN:
				outtextxy(400, 400, "鼠标左键按下");
				if (msg.x > 200 && msg.x < 500 && msg.y>50 && msg.y < 100)
				{
					printf("鼠标就在这个矩形里了哦\n");
				}
				break;
			case WM_RBUTTONDOWN:
				outtextxy(400, 400, "鼠标右键按下");
				printf("坐标(%d,%d)\n", msg.x, msg.y);//控制台打印鼠标的坐标
				break;
			}
		}
	}

运行结果:
在这里插入图片描述

键盘消息函数

非easyX函数
在这里插入图片描述

getch()

用到头文件 conio.h
堵塞函数,不输入一直在这里等

#include <conio.h> // 使用_getch()   获取键位

	while (1)  // 不断地处理事务,需要循环
	{
		char key = _getch();
		printf("%d,%c\n", key, key);
		switch (key)
		{
		case 72://上键
		case 'w':              // 这里是定义了上键为w ,当然也可以定义其他的键位
		case 'W':
			printf("上键\n");
			break;
		case 80://下键
		case 's':
		case 'S':
			printf("下键\n");
			break;
		case 75://左键
		case 'a':
		case 'A':
			printf("左键\n");
			break;
		case 77://右键
		case 'd':
		case 'D':
			printf("右键\n");
			break;
		}
	}

效果演示:
在这里插入图片描述
目前只是在控制台上操作

设置一个小球,对其进行键位控制

int x=0, y=0;
	//鼠标信息
	ExMessage msg;
	while (1)  // 不断地处理事务,需要循环
	{
		// 创建一个小物体,进行移动
		cleardevice();//清屏,除去移动后留下的拖影
		setfillcolor(BLUE);
		fillcircle(x, y, 20);

		char key = _getch();
		printf("%d,%c\n", key, key);
		switch (key)
		{
		case 72://上键
		case 'w':              // 这里是定义了上键为w ,当然也可以定义其他的键位
		case 'W':
			y -= 5;
			printf("上键\n");
			break;
		case 80://下键
		case 's':
		case 'S':
			y += 5;
			printf("下键\n");
			break;
		case 75://左键
		case 'a':
		case 'A':
			x -= 5;
			printf("左键\n");
			break;
		case 77://右键
		case 'd':
		case 'D':
			x += 5;
			printf("右键\n");
			break;
		}
	}

效果演示:
在这里插入图片描述

在显示其他组件(图片什么的)的同时,完成小球移动,就是把其语句放在同一个while循环中,当然这样也会导致界面缓存闪屏
在这里插入图片描述
解决方法,可以创建一个缓冲区(双缓冲绘图)

开始:

	int x = 0, y = 0;// 设置小球的初识位置
	while (1)  // 不断地处理事务,需要循环
	{
		// 双缓冲绘图 ,需要放在绘图代码之前和之后
		BeginBatchDraw();

	    //设置背景颜色(a,b)

结束:

		// 创建一个小物体,进行移动
		setfillcolor(BLUE);
		fillcircle(x, y, 20);
		EndBatchDraw();

		char key = _getch();

完整代码如下:

# define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <graphics.h> // 包含图形库的头文件
#include <conio.h> // 使用_getch()   键位

int main()
{

	//1 创建一个窗口
	initgraph(640, 480,SHOWCONSOLE);
	                    // 这里第三个参数是显示控制台
	                    //第三个参数,如果是NOCLOSE,窗口关闭键失效。NOMINIMIZE,窗口缩小键失效,二者 | ,则全部失效
	                  
	int x = 0, y = 0;// 设置小球的初识位置
	while (1)  // 不断地处理事务,需要循环
	{
		// 双缓冲绘图 ,需要放在绘图代码之前和之后
		BeginBatchDraw();

	    //设置背景颜色(a,b)
	    setbkcolor(WHITE);//a
	    cleardevice();//b   清屏

		// 输出图片
		IMAGE img;// 定义一个(变量)对象
		// 加载图片
		// 相对路径:./表示当前文件下,../表示当前文件的上一级目录
		// 绝对路径:C:\Users\30438\Pictures\CSDN插图\MySQL.jpg
		loadimage(&img, "C:\\Users\\30438\\Pictures\\CSDN插图\\MySQL.jpg", 250, 250);
		//               若文件路径有空格   处理方法举例:\"12 easyX学习\"   
		//                          250,250为照片设置高度,宽度
		//相对路径
		//loadimage(&img, "./MySQL.jpg");
		putimage(0, 0, &img);//前面坐标用变量也可以

		//鼠标信息
		ExMessage msg;

		// 创建一个小物体,进行移动
		setfillcolor(BLUE);
		fillcircle(x, y, 20);
		EndBatchDraw();// 结束缓冲区

		char key = _getch();
		printf("%d,%c\n", key, key);
		switch (key)
		{
		case 72://上键
		case 'w':              // 这里是定义了上键为w ,当然也可以定义其他的键位
		case 'W':
			y -= 5;
			printf("上键\n");
			break;
		case 80://下键
		case 's':
		case 'S':
			y += 5;
			printf("下键\n");
			break;
		case 75://左键
		case 'a':
		case 'A':
			x -= 5;
			printf("左键\n");
			break;
		case 77://右键
		case 'd':
		case 'D':
			x += 5;
			printf("右键\n");
			break;
		}
	}

	getchar();
	//2 关闭窗口
	closegraph();

	return 0;
}

音乐播放

在这里插入图片描述
这个只支持mp3,网易云的不行

# define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <graphics.h> // 包含图形库的头文件
#include <conio.h> // 使用_getch()   键位
#include <mmsystem.h>   // 包含多媒体设备接口头文件
                        //必须在graphics头文件下方
#pragma comment(lib,"winmm.lib")//加载静态库
                         // 这是预编译指令

void BGM() // 播放音乐
{
	// 打开音乐,播放音乐      alias  取别名             后面参数调音量等
	mciSendString("open 天后.mp3 alias BGM",0,0,0);
	//              repeat 重复播放   pause 暂停  close 关闭
	mciSendString("play BGM repeat", 0, 0, 0);


}

repeat 重复播放 pause 暂停 close 关闭 resume 继续

修改窗口标题,弹出框框

在这里插入图片描述

void change()
{
	// 获取窗口句柄
	HWND hnd = GetHWnd();
	// 设置窗口标题
	SetWindowText(hnd, "c语言plus");
	//弹出窗口,提示用户操作
	int isok=MessageBox(NULL, "干嘛?","提示标题",MB_OKCANCEL);
	// 这里是NULL,窗口和主窗口都可以拖动,
	  // 若写变量hnd,则是强制小窗口的确认,主窗口一直弹出,且无法点击
	// 其返回值是Int型,可进行赋值判断
	if (isok == IDOK)
	{
		printf("您点击了确认\n");  // 在控制台输出
	}
	else if (IDCANCEL == isok)
	{
		printf("您点击了取消\n");
	}
}

把其操作写入change()函数内
在这里插入图片描述

  • 27
    点赞
  • 175
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

汴京城下君

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

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

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

打赏作者

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

抵扣说明:

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

余额充值