EasyX学习笔记

563 阅读6分钟

一、基础

1. 窗口

  • EasyX所创立窗口的原点位于显示窗口左上角,以向右为x轴正方向,向下为y轴正方向,度量单位为像素点。

  • 窗口函数

    • initgraph(int width,int height,int flag = NULL)用于初始化绘图窗口。flag为窗口的样式(SHOWCONSOLE为保留控制台显示|NOCLOSE为关闭键无效|NOMINIMIZE为最小化键无效;三个功能可以通过 | 一起使用)

    • closegraph() 关闭绘图窗口

    • cleardevice() 清空绘图设备

    • getchar() 使用closegraph()函数关闭窗口前使用

    • 改变窗口颜色(两个函数需要一起使用)

      • setbkcolor(); 参数为颜色的英文大写
      • cleardevice(); 清除覆盖窗口

2.基本图形绘制

  • 图形绘制函数用于在窗口上绘制各种图形。

  • 绘图函数从填充样式分类可以分为无填充、有边框填充、无边框三种

  • 实例(圆)

    • circle() 无填充
    • fillcircle() 有边框填充
    • solidcircle() 无边框填充
  • 从形状来分,常用的可以分为八种:

    • circle (圆
    • ellipse(椭圆
    • pie(扇形
    • polygon(多边形
    • rectangle(矩形
    • roundrect(圆角矩形
    • line(线
    • putpixel(点
  • 绘制函数

    • setfillcolor() 设置填充颜色
    • setlinecolor() 设置线条颜色
    • setlinestyle(高,宽,字体) 设置线条样式
  • 代码

#include<iostream>
#include <graphics.h> //引用图形库头文件
#include <conio.h> //使用_getch()

using namespace std;

int main()
{
	//initgraph(640, 480,NOCLOSE(关闭建无效化)|NOMINIMIZE(最小化建无效化)|SHOWCONSOLE(显示终端控制台)); // 创建绘图窗口,大小为 640x480 像素
	initgraph(640, 480, SHOWCONSOLE);

	//改变背景颜色
	setbkcolor(WHITE);
	cleardevice(); //清屏

	////绘图
	setlinestyle(PS_SOLID, 5); //设置线条样式
	setfillcolor(YELLOW); //设置填充颜色
	setlinecolor(BLUE); //设置线条颜色
	circle(50, 50, 50); // 画圆,圆心(50, 50),半径 100
	fillcircle(50, 160, 50);
	solidcircle(50, 270, 50);

	_getch(); // 按任意键继续
	closegraph(); // 关闭绘图窗口
	return 0;
}
  • 效果

pSXhLB6.png

3.基本文字绘制

  • 函数

    • outtextxy(int x,int y,LPCTSTR str) 在指定位置输出字符串

    • settextcolor ORREF color) 设置当前文字颜色

    • settextstyle(int nHeight,int nWidth,LPCTSTR IpszFace) 设置字体样式;IpszFace为字体名称

    • textheight(LPCTSTR str) 获取字符串实际占用的像素高度

    • textwidth(LPCTSTR str) 获取字符串实际占用的像素宽度

  • 代码

#include<iostream>
#include <graphics.h> //引用图形库头文件
#include <conio.h> //使用_getch()

using namespace std;

int main()
{
	initgraph(640, 480, SHOWCONSOLE);

	//改变背景颜色
	setbkcolor(WHITE);
	cleardevice(); //清屏

	//绘图
	setlinestyle(PS_SOLID, 5); //设置线条样式
	setfillcolor(YELLOW); //设置填充颜色
	setlinecolor(BLUE); //设置线条颜色
	circle(50, 50, 50); // 画圆,圆心(50, 50),半径 100
	fillcircle(50, 160, 50);
	solidcircle(50, 270, 50);

	//绘制文字
	settextcolor(RED); //设置颜色
	settextstyle(20, 0, "楷体"); //设置文字样式,大小,字体
	setbkmode(TRANSPARENT); //设置背景模式为透明
	settextcolor(RGB(0, 126, 50));
	outtextxy(50, 50, "hhhhhhhhhhhhh");//指定位置输出文字

	//文字居中
	fillrectangle(200, 50, 500, 100);
	settextcolor(RGB(10, 126, 200));
	char arr[] = "xxxxxxxx";
	int width = 300 / 2 - textwidth(arr) / 2;
	int height = 50 / 2 - textheight(arr) / 2;
	outtextxy(width + 200, height + 50, arr);

	_getch(); // 按任意键继续
	closegraph(); // 关闭绘图窗口
	return 0;
}
  • 效果

pSX49gA.png

二、图像输出

1.函数

  • 在使用图像之前,需要定义一个变量(对象),然后把图片加载进变量才能进行使用。

    • 平时定义变量都是使用的基础数据类型,比如int temp;
    • 在使用图像的时候需要使用EasyX提供给我们的类型:IMAGE,如IMAGE img
  • loadimage(IMAGE*pDstlmg.LPCTSTRplmgFileintnWidth= 0,int nHeight= 0,bool bResize = false) 从文件中读取图像

    • pDstlmg为保存图像的 IMAGE 对象指针

    • plmgFile为图片文件名

    • nWidth为图片的拉伸宽度

    • nHeight为图片的拉伸高度

    • bResize为是否调整 IMAGE 的大小以适应图片

  • putimage(intdstX,int dstYIMAGE*pSrclmg,DWORD dwRop=SRCCOPY) 在当前设备上绘制指定图像。

    • dstX为绘制位置的x坐标

    • dstY为绘制位置的y坐标

    • pSrclmg为要绘制的 IMAGE 对象指针

    • dwRop为三元光栅操作码

2.代码

#include<iostream>
#include <graphics.h> //引用图形库头文件
#include <conio.h> //使用_getch()

using namespace std;

int main()
{
	initgraph(640, 480, SHOWCONSOLE);

	//改变背景颜色
	setbkcolor(WHITE);
	cleardevice(); //清屏

	//输出图片
	IMAGE img; //定义一个(变量)对象
	//加载图片
	//相对路径:./表示当前文件夹下,../当前文件夹的上一级目录
	loadimage(&img, "./1.png", 199, 128);
	//绝对路径:文件路径
	//loadimage(&img,""C:\Users\violet\Documents\Visual Studio 2013\Projects\easyx\easyx\1.png"");
	putimage(0, 0, &img);

	_getch(); // 按任意键继续
	closegraph(); // 关闭绘图窗口
	return 0;
}

3.效果

pSX41bV.png

三、鼠标操作

1.代码

#include<iostream>
#include<easyX.h>
#include<string>

using namespace std;

void button(int x,int y,int w,int h,char *text){
	setbkmode(TRANSPARENT);
	setfillcolor(BROWN);
	fillroundrect(x, y, x + w, y + h, 10, 10);

	settextstyle(30, 0, "黑体");

	char text_[50] = "button";
	strcpy(text_, text);
	int tx = x + (w - textwidth(text)) / 2;
	int ty = y + (h - textheight(text)) / 2;

	outtextxy(tx, ty, text);
}

int main(){
	initgraph(680, 480, EWX_SHUTDOWN);
	button(50, 50, 150, 50, "按钮");

	ExMessage msg;

	while (1){
		if (peekmessage(&msg, EX_MOUSE)){
			switch (msg.message){
			case WM_LBUTTONDOWN:
				if (msg.x >= 50 && msg.x <= 50 + 150 && msg.y >= 50 && msg.y <= 50 + 50)
					cout << "我是按钮,我被点击了" << endl;
				break;
			default:
				break;
			}
		}
	}
	
	getchar();
	return 0;
}

2.效果

pSX4N8J.png

四、键盘操作

1.函数

  • 用于获取鼠标消息的函数有两个

    • getch() 需要头文件conio.h
    • GetAsyncKeyState(键值) 需要头文件windows.h,但是由于EasyX包含了windows头文件,所以无须自己包含
  • getch() 需要使用返回值来判断

    • 与非ASCII表字符的按键比较,需要使用虚拟键值
      • 上:72、左:75、下:80、右:77
    • 如果是与字母比较直接写字母,比如'A"
  • GetAsyncKeyState(键值) 需要传入一个键值,如果按下返回真

    • 上:VK UP、下:VK DOWN、左:VK LEFT、右、VK_RIGHT
  • 键盘操作函数为非EasyX操作函数

2.代码

#include<iostream>
#include <graphics.h> //引用图形库头文件
#include <conio.h> //使用_getch()

using namespace std;

int main()
{
	initgraph(640, 480, SHOWCONSOLE);

	//双重缓冲图,需要放在绘图代码之前和之后
	BeginBatchDraw();

	//改变背景颜色
	setbkcolor(WHITE);
	cleardevice(); //清屏

	int x = 0, y = 0;

	while (1){
		//控制球移动
		setfillcolor(BROWN);
		fillcircle(x, y, 20);
		FlushBatchDraw();
		//if (kbhit()){//判断是否有键盘
		//	char key = _getch(); //阻塞函数,不输入一直在这等
		//	cout << (int)key << key << endl;
		//}
		//	switch (key){
		//	case 72:
		//	case 'w':
		//	case 'W':
		//		y -= 5;
		//		cout << "上键" << endl;
		//		break;
		//	case 80:
		//	case 's':
		//	case 'S':
		//		y += 5;
		//		cout << "下键" << endl;
		//		break;
		//	case 75:
		//	case 'a':
		//	case 'A':
		//		x -= 5;
		//		cout << "左键" << endl;
		//		break;
		//	case 77:
		//	case 'd':
		//	case 'D':
		//		x += 5;
		//		cout << "右键" << endl;
		//		break;
		//	}
		//}

		if (GetAsyncKeyState(VK_UP)){//上建
			y--;
		}
		if (GetAsyncKeyState(VK_DOWN)){//下建
			y++;
		}
		if (GetAsyncKeyState(VK_LEFT)){//左建
			x--;
		}
		if (GetAsyncKeyState(VK_RIGHT)){//右建
			x++;
		}
	}

	_getch(); // 按任意键继续
	closegraph(); // 关闭绘图窗口
	return 0;
}

3.效果

811a31f6-3260-481f-ae73-40b4163bf8c9.gif

五、音乐播放

1.函数

  • 为了实现用C语言播放音乐,我们需要用到windows的一个API

    • 首先需要包含头文件windows.h(如果已经包含graphics.h则无需包含)

    • 然后还需要加载静态库winmm.lib

    • 最后就可以使用mciSendString函数来播放音乐了

  • MCIERROR mciSendStringA(LPCSTR IpstrCommand,LPSTRIpstrReturnString,UINT uReturnLength, HWND hwndCallback )

    • LPCSTR IpstrCommand 命令字符串:"命令 设备[参数]”

    • LPSTRIpstrReturnString 接收返回信息的缓冲区,为NULL时不返回信息

    • UINT uReturnLength 上述缓冲区的大小

    • HWND hwndCallback 一般为NULL

2.代码

#include<iostream>
#include <graphics.h> //引用图形库头文件
#include <conio.h> //使用_getch()
#include<mmsystem.h> //包含多媒体设备接口头文件
#pragma comment(lib,"winmm.lib") //加载静态库

using namespace std;

//播放音乐
void BGM(){
	//打开音乐,播放音乐
	mciSendString("open ./6.mp3 alias BGM", 0, 0, 0); //alias 取别名
	mciSendString("play BGM repeat", 0, 0, 0); //repeat 重复播放
	if (0)
		mciSendString("close BGM", 0, 0, 0);
}

int main()
{
	initgraph(640, 480, SHOWCONSOLE);

	BGM();

	//改变背景颜色
	setbkcolor(WHITE);
	cleardevice(); //清屏

	IMAGE img;
	loadimage(&img, "./2.jpg", 640, 480);
	putimage(0, 0, &img);

	_getch(); // 按任意键继续
	closegraph(); // 关闭绘图窗口
	return 0;
}

3.效果

0f4180c6-3389-4694-b7e3-413c7fbf236a.gif

六、修改窗口标题、弹出对话框

1.函数

  • HWND hWnd =GetHWnd() 获得窗口句柄
  • SetWindowText(hWnd,"love") 修改窗口标题
  • MessageBox(hWnd,"我是消息框","我是标题" MB OKCANCEL) 设置模态对话框

2.代码

#include<iostream>
#include <graphics.h> //引用图形库头文件
#include <conio.h> //使用_getch()

using namespace std;

void change(){
	//获取窗口句柄
	HWND hnd = GetHWnd();
	//设置窗口标题
	SetWindowText(hnd, "hhhhhhhhh");
	//弹出窗口,提示用户操作
	int isok = MessageBox(hnd, "xxxxxxx", "提示", MB_OKCANCEL);
	if (isok == IDOK) cout << "你点击了OK" << endl;
	else if (IDCANCEL == isok) cout << "你点击了取消" << endl;
}

int main()
{
	initgraph(640, 480, SHOWCONSOLE);

	change();

	//改变背景颜色
	setbkcolor(WHITE);
	cleardevice(); //清屏

	IMAGE img;
	loadimage(&img, "./2.jpg", 640, 480);
	putimage(0, 0, &img);

	_getch(); // 按任意键继续
	closegraph(); // 关闭绘图窗口
	return 0;
}

3.效果

ac0658a9-e8f0-492a-92dd-8038de64f7a2.gif