VS2019——easyx新版图形库图形化界面及音频播放的疑难杂症


一。mcisendstring()和playsound()

easyx插入音频的时候

当我利用mcisendstring()播放音频信息时候会发现只用通过控制台界面输出才能输出我的音频

信息,当我通过initgraph()在画布中播放的时候就会发现无法播放音频信息,不管我是把文件转换成wav,MP3,还是用绝对路径又或者把文件放在目录下使用相对路径都没有办法,我的问题跟下面这位老哥很相似

(20条消息) 新版easyX图形库在VS2019中mciSendString无法播放音乐-编程语言-CSDN问答

#include<stdio.h>
#include<Windows.h>
#include<graphics.h>//包含图形库头文件
#include<mmsystem.h>//包含多媒体设备接口头文件
#pragma comment(lib,"winmm.lib")
 
void PlayBGM()
{
    mciSendString("open E:/Visual Studio 代码/EasyX practice 1/Saved Pictures/霜雪千年.mp3 alias BGM", 0, 0, 0);//打开音乐,向多媒体设备接口发送一个字符串 ,代表指令
    mciSendString("play BGM wait", 0, 0, 0);//播放音乐
    mciSendString("close BGM", 0, 0, 0);
}
 
int main()
{
 
    initgraph(640, 480, NOCLOSE|NOMINIMIZE);//定义窗口的宽和高
 
    IMAGE img;
 
    loadimage(&img, "E:/Visual Studio 代码/EasyX practice 1/Saved Pictures/42BEA21B730B6C289BA516BD4CA85267.jpg");
    putimage(0, 0, &img);
    PlayBGM();
 
    while (1)
    {
        //使程序处于循环中
    }
 

这是哪位老哥的代码块,

后来我换了个思路利用的是Windowsi下面的API方法,Playsound的函数,发现可以在画布下播放音频

PlaySound("C:\\Users\\Administrator.CH-202202161013\\source\\repos\\eaxyx\\eaxyx\\music.wav", NULL, SND_SYNC);

第一个是文件路径,后面的如果是单纯插入音频的话是就照着写就可以了,就跟mciSendstring

后面的0,0,0是一样的,playsound没有单纯的打开函数(写入即用)

下面是详细解说

在游戏中播放音乐 - CodeBus

二.图形化界面

easyx的图形化界面是非常简单

initgraph(1000, 800);

这个是画布设置黑色的一篇没有颜色如果要单纯的颜色写入的话就要调用setbkcolor(RGB(i, i, i))

(具体颜色选择在这里不累述了)

loadimage(&im, _T("C:\\Users\\Administrator.CH-202202161013\\source\\repos\\eaxyx\\eaxyx\\hongkong.jpg"), 1000, 800);

图片的放入

什么image 呀,_T(){#include <tchar.h> 头文件,Unicode 转多字符集等等,}

,字符问题呀,尺寸大小之类的也不是今天的重点

重点。我在界面切换的时候常常会出现莫名奇妙的黑屏退出的情况

一开始是认为我的界面没有刷新,

按钮状态没有还原,还是属于按下状态,当鼠标在按个按钮时,就会出现冲突

我运行代码的时候,我点完第一个操作结束后,在点第二个就直接熄屏了(弹出的是黑色的控制台窗口)什么字都没有的那种黑色操作框

有的时候是连续操作两个方法可以,在点击第三次操作的时候就熄屏了

而且如果是正常的退出命令的话


是显示的是一个图片然后暂停后才退出
 

如图

后来我发现

其实我的每一个case语句之后在break之前我都有一个FlushMouseMsgBuffer()(清除鼠标的缓存信息)
所以我觉得应该不是鼠标操作没有重置的原因,为了说明这一点我单独的吧这个swtich语句放在main里面运行了(什么画布都不要)发现循环的很流畅,我觉得应该是图片加载次数过多的问题(可能跟内存容量有关吧,我也不是太懂)希望有大佬可以更我讲一下原因


于是我单独的写了一个方法体
只加载一次图片然后再循环里面把这个函数调用一次
发现循环边流程了四个操作都可以顺畅的切换
(以前的代码里面是每循环一次都要加载一次图片)

bool putting_picture(MOUSEMSG m) {
	if (button_judge(m.x, m.y)==1|| button_judge(m.x, m.y)==2|| button_judge(m.x, m.y)==3)
	{
		IMAGE im;
		initgraph(1000, 700);
		loadimage(&im, _T("C:\\Users\\Administrator.CH-202202161013\\Desktop\\QQ图片20220302091847.jpg"), 1000, 700);
		putimage(0, 0, &im);
		return true;
	}
	if (button_judge(m.x, m.y) == 4)
	{
		IMAGE im;
		initgraph(1000, 800);
		loadimage(&im, _T("C:\\Users\\Administrator.CH-202202161013\\source\\repos\\eaxyx\\eaxyx\\hongkong.jpg"), 1000, 800);
		putimage(0, 0, &im);
		system("puase");
		Sleep(10000);
		closegraph();
		exit(0);
	}
	else
	{
		return false;
	}
}
bool sign() {

	settextstyle(30, 0, "楷体");
	outtextxy(300, 150, "用户名");
	outtextxy(300, 200, "密码");
	settextstyle(30, 0, "黑体");
	char coco[64];
	TCHAR input[] = _T("请输入ID");
	InputBox(coco, 10, input);
	outtextxy(400, 150, coco);
	char coco2[64];
	TCHAR input2[] = _T("请输入密码");
	InputBox(coco2, 10, input2);
	outtextxy(400, 200, coco2);
	Sleep(600);
	if (strcmp(coco, "1949") == 0 && strcmp(coco2, "snape") == 0) {
		return true;
	}
	else
	{
		HWND SignError = GetHWnd();
		int isok = MessageBox(SignError, "用户名或密码错误!", "提示", MB_OK);
		return false;
	}
}

书山有路勤为径,绝知此事要躬行

(如有错误,务必斧正)
 

  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值