一、窗口创建
(1)几种创建方式
#include<easyx.h>//easyx的头文件
#include<iostream>
using namespace std;
int main()
{
//创建一个500*500的窗口
//参数为:长度,宽度,是否显示黑框(无参为不显示黑框,有这个参数则显示)
initgraph(500, 500);//不显示dox黑屏
initgraph(500, 500, EX_SHOWCONSOLE);//显示dox黑屏
//生成框没有关闭按钮
initgraph(500, 500, EX_NOCLOSE);
//生成框没有最小化按钮
initgraph(500, 500, EX_NOMINIMIZE);
//如果要实现多个特性的显示框,第三个参数用|连接
initgraph(500, 500, EX_SHOWCONSOLE | EX_NOCLOSE | EX_NOMINIMIZE);
getchar();//用于实现窗口的暂停
return 0;
}
(2)窗口颜色调整
int main()
{
//创建窗口(有黑框)
initgraph(500, 500, EX_SHOWCONSOLE);
//设置窗口颜色
setbkcolor(WHITE);
//清除原窗口颜色,以显示新的白色
cleardevice();
getchar();
}
//库中颜色
// Color constant
#define BLACK 0
#define BLUE 0xAA0000
#define GREEN 0x00AA00
#define CYAN 0xAAAA00
#define RED 0x0000AA
#define MAGENTA 0xAA00AA
#define BROWN 0x0055AA
#define LIGHTGRAY 0xAAAAAA
#define DARKGRAY 0x555555
#define LIGHTBLUE 0xFF5555
#define LIGHTGREEN 0x55FF55
#define LIGHTCYAN 0xFFFF55
#define LIGHTRED 0x5555FF
#define LIGHTMAGENTA 0xFF55FF
#define YELLOW 0x55FFFF
#define WHITE 0xFFFFFF
int main()
{
//创建窗口(有黑框)
initgraph(500, 500, EX_SHOWCONSOLE);
//设置窗口颜色
//在画图中查找色号可以实现想要颜色的填充,用RGB函数即可
setbkcolor(RGB(21, 134, 41));
//清除原窗口颜色,以显示新的颜色
cleardevice();
getchar();
}
RGB号的找法:在画图软件中找
(3)坐标体系
二、基本图形绘制
(1)线条
int main()
{
//纯白窗口创建
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
//绘制一个点(x,y,颜色)
putpixel(200, 100, RED);
//绘制一条线(先设置好,再绘制)
//设置线条颜色
setlinecolor(BLUE);
//设置线条样式(样式,粗细)
setlinestyle(PS_SOLID, 3);
//开始绘制(起点x,起点y,终点x,终点y)
line(0, 0, 500, 500);
//跟据显示框绘制
line(0, 0, getwidth(), getheight());
getchar();
return 0;
}
库中线条类型 :
/* Pen Styles */
#define PS_SOLID 0
#define PS_DASH 1 /* ------- */
#define PS_DOT 2 /* ....... */
#define PS_DASHDOT 3 /* _._._._ */
#define PS_DASHDOTDOT 4 /* _.._.._ */
#define PS_NULL 5
#define PS_INSIDEFRAME 6
#define PS_USERSTYLE 7
#define PS_ALTERNATE 8
#define PS_STYLE_MASK 0x0000000F
#define PS_ENDCAP_ROUND 0x00000000
#define PS_ENDCAP_SQUARE 0x00000100
#define PS_ENDCAP_FLAT 0x00000200
#define PS_ENDCAP_MASK 0x00000F00
#define PS_JOIN_ROUND 0x00000000
#define PS_JOIN_BEVEL 0x00001000
#define PS_JOIN_MITER 0x00002000
#define PS_JOIN_MASK 0x0000F000
#define PS_COSMETIC 0x00000000
#define PS_GEOMETRIC 0x00010000
#define PS_TYPE_MASK 0x000F0000
#define AD_COUNTERCLOCKWISE 1
#define AD_CLOCKWISE 2
(2)矩形
#include<easyx.h>//easyx的头文件
#include<iostream>
using namespace std;
int main()
{
//纯白窗口创建
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
//绘制一个矩形边框
//先调一下矩形线的颜色
setlinecolor(RED);
//开始绘制(左上角x,左上角y,右下角x,右下角y)
rectangle(100, 0, 100 + 50, 0 + 50);
//绘制一个填充颜色的矩形边框
setlinecolor(RED);
rectangle(210, 0, 210 + 50, 0 + 50);
//设置填充的颜色
setfillcolor(YELLOW);
//把颜色填到矩形中
fillrectangle(210, 0, 210 + 50, 0 + 50);
//绘制一个无边框但填充颜色的矩形
solidrectangle(320, 0, 320 + 50, 0 + 50);
//设置填充的颜色
setfillcolor(YELLOW);
//可以看到,绘制无边框矩形时如果前面定义过填充颜色,会进行自动填充
//绘制一个圆角矩形
//开始绘制(左上角x,左上角y,右下角x,右下角y,角的椭圆a,角的椭圆b)
roundrect(430, 0, 430 + 50, 0 + 50, 10, 10);
//给圆角矩形填充颜色
fillroundrect(430, 0, 430 + 50, 0 + 50, 10, 10);
//给圆角矩形去边框
solidroundrect(430, 0, 430 + 50, 0 + 50, 10, 10);
getchar();
return 0;
}
关于圆角矩形角的椭圆示意图:
(3)圆形
int main()
{
//纯白窗口创建
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
setlinecolor(RED);
//绘制一个圆(圆心x,圆心y,半径r)
circle(100, 100, 50);
//填充颜色
setfillcolor(YELLOW);
fillcircle(100, 100, 50);
//去边框
solidcircle(100, 100, 50);
getchar();
return 0;
}
(4)椭圆
int main()
{
//纯白窗口创建
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
setlinecolor(RED);
//绘制一个椭圆(参数和矩形一样,只是会变成椭圆)
ellipse(100, 0, 200, 50);
//当然也可以进行颜色填充和去边操作
getchar();
return 0;
}
(5)库中更多图形的定义
// Drawing related functions
COLORREF getpixel(int x, int y); // Get pixel color
void putpixel(int x, int y, COLORREF color); // Set pixel color
void line(int x1, int y1, int x2, int y2); // Draw a line
void rectangle (int left, int top, int right, int bottom); // Draw a rectangle without filling
void fillrectangle (int left, int top, int right, int bottom); // Draw a filled rectangle with a border
void solidrectangle(int left, int top, int right, int bottom); // Draw a filled rectangle without a border
void clearrectangle(int left, int top, int right, int bottom); // Clear a rectangular region
void circle (int x, int y, int radius); // Draw a circle without filling
void fillcircle (int x, int y, int radius); // Draw a filled circle with a border
void solidcircle(int x, int y, int radius); // Draw a filled circle without a border
void clearcircle(int x, int y, int radius); // Clear a circular region
void ellipse (int left, int top, int right, int bottom); // Draw an ellipse without filling
void fillellipse (int left, int top, int right, int bottom); // Draw a filled ellipse with a border
void solidellipse(int left, int top, int right, int bottom); // Draw a filled ellipse without a border
void clearellipse(int left, int top, int right, int bottom); // Clear an elliptical region
void roundrect (int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // Draw a rounded rectangle without filling
void fillroundrect (int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // Draw a filled rounded rectangle with a border
void solidroundrect(int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // Draw a filled rounded rectangle without a border
void clearroundrect(int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // Clear a rounded rectangular region
void arc (int left, int top, int right, int bottom, double stangle, double endangle); // Draw an arc
void pie (int left, int top, int right, int bottom, double stangle, double endangle); // Draw a sector without filling
void fillpie (int left, int top, int right, int bottom, double stangle, double endangle); // Draw a filled sector with a border
void solidpie(int left, int top, int right, int bottom, double stangle, double endangle); // Draw a filled sector without a border
void clearpie(int left, int top, int right, int bottom, double stangle, double endangle); // Clear a rounded rectangular region
void polyline (const POINT *points, int num); // Draw multiple consecutive lines
void polygon (const POINT *points, int num); // Draw a polygon without filling
void fillpolygon (const POINT *points, int num); // Draw a filled polygon with a border
void solidpolygon(const POINT *points, int num); // Draw a filled polygon without a border
void clearpolygon(const POINT *points, int num); // Clear a polygon region
void polybezier(const POINT *points, int num); // Draw three square Bezier curves
void floodfill(int x, int y, COLORREF color, int filltype = FLOODFILLBORDER); // Fill the area
(6)折线的绘制
int main()
{
//纯白窗口创建
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
setlinecolor(RED);
setlinestyle(PS_SOLID, 3);
//POINT的实质的结构体
POINT points[] = { {10,10},{50,50},{100,50},{220,350} };
polyline(points, 4);
getchar();
return 0;
}
三、文字操作
(1)基本操作
int main()
{
//纯白窗口创建
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
//画个填充颜色的带框矩形
setlinecolor(RED);
rectangle(100, 100, 300, 200);
setfillcolor(YELLOW);
fillrectangle(100, 100, 300, 200);
//写文字
// 注意:凡是easy文字相关函数的调用,字符串一定要写L进行字符集的转化
//设置文字大小与类型(宽度,高度(0为自适应),字体)
settextstyle(50, 0, L"华文楷体 常规");
//设置文字颜色
settextcolor(BLUE);
//设置背景模式,以防止文字遮盖背景
setbkmode(TRANSPARENT);
//开写
outtextxy(110, 120, L"HELLOW!");
getchar();
return 0;
}
文体查找:
三种解决字符集转换的方法:
(2)将int类型的变量输出为屏幕文字
注意:这个地方使用了第三项来改变字符集
int main()
{
//纯白窗口创建
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
//画个填充颜色的带框矩形
setlinecolor(RED);
rectangle(100, 100, 300, 200);
setfillcolor(YELLOW);
fillrectangle(100, 100, 300, 200);
//写文字
// 注意:凡是easy文字相关函数的调用,字符串一定要写L进行字符集的转化
//设置文字大小与类型(宽度,高度(0为自适应),字体)
settextstyle(50, 0, "华文楷体 常规");
//设置文字颜色
settextcolor(BLUE);
//设置背景模式,以防止文字遮盖背景
setbkmode(TRANSPARENT);
//开写
int score = 66;
char str[100] = "";
//三个参数(字符串地址,)
sprintf_s(str, "score:%d", score);
outtextxy(110, 120, str);
getchar();
return 0;
}
(3)文字在矩形居中显示
int main()
{
//纯白窗口创建
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
//变量定义
int rx = 100;
int ry = 100;
int rw = 200;
int rh = 100;
//画个填充颜色的带框矩形
setlinecolor(RED);
rectangle(rx, ry, rx + rw, ry + rh);
setfillcolor(YELLOW);
fillrectangle(rx, ry, rx + rw, ry + rh);
//textwidth=tw textheight=th
settextstyle(30, 0, "华文楷体 常规");
int hspace = (rw - textwidth("HELLOW!")) / 2;
int vspace = (rh - textheight("HELLOW!")) / 2;
settextcolor(BLUE);
setbkmode(TRANSPARENT);
outtextxy(rx + hspace, ry + vspace, "HELLOW!");
getchar();
return 0;
}
四、关于消息
(1)基本使用
定义消息结构体,peekmessage是获取消息,返回一个bool值,如果获取到了就是真,它有三个参数,第一个是消息的地址,第二个是获取的目标,第二第三都有默认值,图中的EX_MOUSE是鼠标的意思,msg结构体有message成员存放消息信息,如果这个信息是鼠标左键被按下(WM_LBUTTONDOWN)就打印按下了鼠标左键
int main()
{
//创建窗口
initgraph(500, 500, EX_SHOWCONSOLE);
//定义消息结构体变量
ExMessage msg = { 0 };
//套入死循环,便于多次检测消息
while (1)
{
//获取消息(消息地址,控制目标(这里是鼠标))
if (peekmessage(&msg, EX_MOUSE))
{
//(msg.message可以访问消息类型)
switch (msg.message)
{
case WM_LBUTTONDOWN: // 左键按下
printf("左键按下 \n");
break;
case WM_RBUTTONDOWN: // 右键按下
printf("右键按下 \n");
break;
case WM_MBUTTONDOWN: // 中键按下
printf("中键按下 \n");
break;
case WM_MOUSEWHEEL: // 滚轮滚动
printf("滚轮滚动 \n");
break;
case WM_LBUTTONDBLCLK: // 左键双击
printf("左键双击 \n");
break;
}
}
}
return 0;
}
库中的控制目标:
库中的消息类型(可以在帮助文档中查找):
打印点击位置和滚轮方向(+120是前,-120是后)
int main()
{
//创建窗口
initgraph(500, 500, EX_SHOWCONSOLE);
//定义消息结构体变量
ExMessage msg = { 0 };
//套入死循环,便于多次检测消息
while (1)
{
//获取消息(消息地址,控制目标(这里是鼠标))
if (peekmessage(&msg, EX_MOUSE))
{
//(msg.message可以访问消息类型)
switch (msg.message)
{
case WM_LBUTTONDOWN: // 左键按下
printf("左键按下 pos(%d,%d)\n", msg.x, msg.y);
break;
case WM_RBUTTONDOWN: // 右键按下
printf("右键按下 pos(%d,%d)\n", msg.x, msg.y);
break;
case WM_MBUTTONDOWN: // 中键按下
printf("中键按下 pos(%d,%d)\n", msg.x, msg.y);
break;
case WM_MOUSEWHEEL: // 滚轮滚动
printf("滚轮滚动 dir(%d)\n", msg.wheel);
break;
case WM_LBUTTONDBLCLK: // 左键双击
printf("左键双击pos(%d,%d)\n", msg.x, msg.y);
break;
}
}
}
return 0;
}
结合键盘
int main()
{
//创建窗口
initgraph(500, 500, EX_SHOWCONSOLE);
//定义消息结构体变量
ExMessage msg = { 0 };
//套入死循环,便于多次检测消息
while (1)
{
//获取消息(这次获取的是键盘消息)
if (peekmessage(&msg, EX_KEY))
{
//按键按下
if (msg.message == WM_KEYDOWN)
{
printf("按键按下\n");
}
//按键抬起
if (msg.message == WM_KEYUP)
{
printf("按键抬起\n");
}
}
}
return 0;
}
检测具体按下了哪个键
int main()
{
//创建窗口
initgraph(500, 500, EX_SHOWCONSOLE);
//定义消息结构体变量
ExMessage msg = { 0 };
//套入死循环,便于多次检测消息
while (1)
{
//获取消息(这次获取的是键盘消息)
if (peekmessage(&msg, EX_KEY))
{
//按键按下
if (msg.message == WM_KEYDOWN)
{
printf("按键按下\n");
//具体是哪个键按下
switch (msg.vkcode)
{
case VK_UP:
printf("上键按下\n");
break;
case VK_DOWN:
printf("下键按下\n");
break;
case VK_LEFT:
printf("左键按下\n");
break;
case VK_RIGHT:
printf("右键按下\n");
break;
//用大写字符代表键盘上的具体某个键
case 'A':
printf("AAA\n");
break;
case 'C':
printf("CCC\n");
break;
}
}
//按键抬起
if (msg.message == WM_KEYUP)
{
printf("按键抬起\n");
}
}
}
return 0;
}
(2)画个移动圆形
#include<easyx.h>//easyx的头文件
#include<windows.h>
#include<iostream>
using namespace std;
int main()
{
//创建窗口
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
//圆形属性
int x = 50;
int y = 50;
int r = 30;
int speed = 3;
int vx = 0;
int vy = 0;
//开启双缓冲避免闪屏(一般是开始绘图时就要开启)
BeginBatchDraw();
//定义消息结构体变量
ExMessage msg = { 0 };
//套入死循环,便于多次检测消息
while (1)
{
//清除上一帧的内容
cleardevice();
//获取消息(这次获取的是键盘消息)
if (peekmessage(&msg, EX_KEY))
{
//按键按下
if (msg.message == WM_KEYDOWN)
{
switch (msg.vkcode)
{
case VK_UP:
vy = -1;
break;
case VK_DOWN:
vy = 1;
break;
case VK_LEFT:
vx = -1;
break;
case VK_RIGHT:
vx = 1;
break;
}
}
else if (msg.message == WM_KEYUP)
{
switch (msg.vkcode)
{
case VK_UP:
vy = 0;
break;
case VK_DOWN:
vy = 0;
break;
case VK_LEFT:
vx = 0;
break;
case VK_RIGHT:
vx = 0;
break;
}
}
}
//更新小球位置
x += speed * vx;
y += speed * vy;
//绘制小球
setlinecolor(RED);
circle(x, y, r);
setfillcolor(BLUE);
fillcircle(x, y, 30);
//加载双缓冲
FlushBatchDraw();
//这个为了控制帧率,不写会导致小球直接飞掉
Sleep(10);
}
//结束双缓冲
EndBatchDraw();
return 0;
}
(3)按钮制作
五、帧率控制
(1)这个的问题是出现闪屏,没有控制数字改变的速度
int main()
{
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
setbkmode(TRANSPARENT);
int score = 0;
char str[50] = "";
while (1)
{
sprintf_s(str, "Score:%d", score++);
settextcolor(BLACK);
//用于刷新分数,防止分数重叠
cleardevice();
outtextxy(20, 20, str);
getchar();
}
return 0;
}
(2)加入双缓冲防止闪屏
1.这是第一种,局部使用
int main()
{
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
setbkmode(TRANSPARENT);
int score = 0;
char str[50] = "";
while (1)
{
sprintf_s(str, "Score:%d", score++);
settextcolor(BLACK);
BeginBatchDraw();
cleardevice();
outtextxy(20, 20, str);
EndBatchDraw();
getchar();
}
return 0;
}
2.这是第二种,全局使用
int main()
{
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
setbkmode(TRANSPARENT);
BeginBatchDraw();
int score = 0;
char str[50] = "";
while (1)
{
sprintf_s(str, "Score:%d", score++);
settextcolor(BLACK);
cleardevice();
outtextxy(20, 20, str);
//这个写在绘制后
FlushBatchDraw();
getchar();
}
EndBatchDraw();
return 0;
}
(3)加入帧率控制部分
int main()
{
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
setbkmode(TRANSPARENT);
//60FPS定义
//clock_t就是long
const clock_t FPS = 1000 / 60;//1s/60帧 每一帧应该花费的时间
int starttime = 0;//用于保存一次开始时的时间
int freamtime = 0;//用于进行一次循环的时间
BeginBatchDraw();
int score = 0;
char str[50] = "";
while (1)
{
//clock返回的时程序进行到现在的时间
starttime = clock();
sprintf_s(str, "Score:%d", score++);
settextcolor(BLACK);
cleardevice();
outtextxy(20, 20, str);
FlushBatchDraw();
freamtime = clock() - starttime;
if (freamtime > 0)
{
//暂停使单次时间达到60FPS
Sleep(FPS - freamtime);
}
getchar();
}
EndBatchDraw();
return 0;
}
六、图片相关
(1)首先要有把图片保存到工程相关的地方
(2)基本操作
int main()
{
//这里的窗口大小和图片属性的大小相同
initgraph(2512, 1373, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
//定义图片变量
IMAGE img;
//加载图片(1.绝对路径 2.相对路径)
//1. loadimage(&img, "D:\\代码\\界面库学习\\kon.jpg");
//2. loadimage(&img,"界面库学习/kon.jpg");相对路径和main.cpp在同一个文件夹里面
//分隔符要么是\\,要么是/
//一般推荐第二种,便于代码移植
loadimage(&img, "D:\\代码\\界面库学习\\界面库学习\\kon.png");
//输出图片
//前两个参数是图片左上角的坐标
putimage(0, 0, &img);
getchar();
return 0;
}
(2)原图和掩码图
上面的例子有一个明显的缺点,图片的张贴会覆盖背景
int main()
{
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
//定义图片变量
IMAGE img;
loadimage(&img, "D:\\代码\\界面库学习\\界面库学习\\ghost-down.jpg");
//输出图片
putimage(100, 100, &img);
getchar();
return 0;
}
把原图和它的掩码图同时加载,就可以避免背景覆盖问题
#include<easyx.h>//easyx的头文件
#include<windows.h>
#include<iostream>
#include<time.h>
using namespace std;
int main()
{
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
BeginBatchDraw();
//定义图片变量
IMAGE img;
IMAGE img_mask;
loadimage(&img_mask, "D:\\代码\\界面库学习\\界面库学习\\ghost-mask.jpg");
loadimage(&img, "D:\\代码\\界面库学习\\界面库学习\\ghost-down.jpg");
//输出图片(先张贴掩码图,在张贴原图)
putimage(100, 100, &img_mask, NOTSRCERASE);
putimage(100, 100, &img, SRCINVERT);
FlushBatchDraw();
getchar();
EndBatchDraw();
return 0;
}
(4)动态过程
#include<easyx.h>//easyx的头文件
#include<windows.h>
#include<iostream>
#include<time.h>
using namespace std;
int main()
{
initgraph(500, 500, EX_SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
int FPS = 1000 / 60;
int starttime = 0;
int freamtime = 0;
BeginBatchDraw();
//定义图片变量
IMAGE img1;
IMAGE img2;
IMAGE img3;
loadimage(&img1, "D:\\代码\\界面库学习\\界面库学习\\ghost1-down.jpg");
loadimage(&img2, "D:\\代码\\界面库学习\\界面库学习\\ghost2-down.jpg");
loadimage(&img3, "D:\\代码\\界面库学习\\界面库学习\\ghost3-down.jpg");
IMAGE image[3] = { img1,img2,img3 };
while (1)
{
for (int i = 0; i < 3; i++)
{
//先清空屏幕,再贴图
cleardevice();
putimage(100, 100, image + i);
starttime = clock();
FlushBatchDraw();
freamtime = clock() - starttime;
if (freamtime > 0)
{
Sleep(FPS - freamtime);
}
FlushBatchDraw();
getchar();
}
}
EndBatchDraw();
return 0;
}
(5)精灵表动画
七、音乐播放
(1)基本操作
#include<easyx.h>
//下面这三串代码是播放音乐必要的
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
//
#include<iostream>
using namespace std;
int main()
{
//先open再play,只播放一次
mciSendString("open D:\\代码\\界面库学习\\界面库学习\\Start.mp3", NULL, 0, NULL);
mciSendString("play D:\\代码\\界面库学习\\界面库学习\\Start.mp3", NULL, 0, NULL);
getchar();
return 0;
}
(2)简便写法与调整音量大小
#include<easyx.h>
//下面这三串代码是播放音乐必要的
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
//
#include<iostream>
using namespace std;
int main()
{
//先open再play,只播放一次
//简便写法
mciSendString("open D:\\代码\\界面库学习\\界面库学习\\Start.mp3 alias bgm", NULL, 0, NULL);
mciSendString("play bgm", NULL, 0, NULL);
//调整音量大小
mciSendString("setaudio bgm volume to 50", NULL, 0, NULL);
getchar();
return 0;
}
(3)播放错误检查
#include<easyx.h>
//下面这三串代码是播放音乐必要的
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
//
#include<iostream>
using namespace std;
int main()
{
//先open再play,只播放一次
//简便写法
mciSendString("open D:\\代码\\界面库学习\\界面库学习\\Start.mp3 alias bgm", NULL, 0, NULL);
mciSendString("play bgm", NULL, 0, NULL);
//调整音量大小
MCIERROR ret = mciSendString("setaudio bgm volume to 50", NULL, 0, NULL);
//通过返回值确认是否播放成功
if (ret != 0)
{
//获取错误信息
char err[100] = { 0 };
mciGetErrorString(ret, err, sizeof(err));
}
getchar();
return 0;
}
(5)函数封装
可以尝试写一个参数只有路径字符串的播放音乐的函数
这个是示例
(6)用于播放音效的函数
这个函数只能播放.wav格式的音乐