DEV-C++ ege.h库进阶

本文介绍了EGE库的高级功能,包括窗口的初始化模式、大小调整、标题设置,以及鼠标和键盘事件的处理。此外,还详细讲解了图像的加载、显示和保存,以及音乐播放类MUSIC的使用方法,如打开、播放、暂停和音量控制等。
摘要由CSDN通过智能技术生成

上次写了一个DEV-C++ ege.h库入门,这次我们继续介绍更多EGE库的功能。

一.窗口

我们知道initgraph函数可以创建一个窗口,但还有一些其他关于窗口的函数。

1.setinitmode

setinitmode(1,0,0);
initgraph(640,480);

函数声明:

void EGEAPI setinitmode(int mode, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT);

这个函数设置初始化模式,mode=0为普通,1为无边框窗口,xy是初始窗口坐标。

例如

setinitmode(1,0,0);
initgraph(640,480);

可以在电脑屏幕的左上角(也就是坐标(0,0)处)创建一个宽为640,高为480的窗口。

2.initgraph

这个函数是我们学习EGE最开始的一个函数了。但其实它的用法不只只是简单地创建一个黑色窗口,还有一些其他的用处。

void EGEAPI initgraph(int Width, int Height, int Flag);
inline void EGEAPI initgraph(int Width, int Height) {
	initgraph(Width, Height, getinitmode());
}

可以看到,事实上initgraph函数还有一个参数叫Flag,只不过后面函数重载隐藏掉了。

这个Flag参数是设置窗口初始化的模式的,你可以在里面填下面的枚举量。

enum initmode_flag {
	INIT_DEFAULT        = 0x0,
	INIT_NOBORDER       = 0x1,
	INIT_CHILD          = 0x2,
	INIT_TOPMOST        = 0x4,
	INIT_RENDERMANUAL   = 0x8,
	INIT_NOFORCEEXIT    = 0x10,
	INIT_UNICODE        = 0x20,
	INIT_WITHLOGO       = 0x100,
	INIT_ANIMATION      = INIT_DEFAULT | INIT_RENDERMANUAL | INIT_NOFORCEEXIT,
};

INIT_DEFAULT:默认参数,这与我们不填任何参数是一样的。

INIT_NOBORDER:没有标题栏,无框窗口。

INIT_CHILD:别的程序的子窗口。

INIT_TOPMOST:生成在最顶端,不可被其他窗口覆盖。

INIT_RENDERMANUAL:手动渲染模式。

INIT_NOFORCEEXIT:非强制退出模式。

INIT_UNICODE:允许使用UNICODE

INIT_WITHLOGO:显示出场动画。

 INIT_ANIMATION:动画模式,其实就是上面几个模式的组合。

如果想要同时使用两个或多个模式,只需要用异或即可。

例如我想让窗口在最顶端而且显示出场动画,只需

initgraph(x,y,INIT_TOPOST|INIT_WITHLOGO);

就可以了。

3.movewindow和resizewindow

void EGEAPI movewindow(int x, int y, bool redraw = true);	//移动窗口
void EGEAPI resizewindow(int width, int height);			//重设窗口尺寸

movewindow:将窗口移动至屏幕(x,y)处;redraw则是是否重新绘图,默认为true

resizewindow:重设窗口尺寸,例如

initgraph(640,480);
getch();
resizewindow(960,640);

将窗口重设成宽960高640的窗口。

4.setcaption

顾名思义,就是设置窗口标题。

setcaption("It is only a test!!!");

 5.-mwindows

这是一个编译选项,在编译选项后面加一个-mwindows可以隐藏cmd窗口。

 6.全屏

想要全屏的话,只需要initgraph(-1,-1)就好了。

但其实运行后你会发现左边还是会有一些缝隙。

要解决这个问题,只需要在前面加一个 setinitmode(1,0,0) 就好了。

二.鼠标和键盘

1.鼠标

EGE库里面有一些关于鼠标的函数。

//鼠标处理函数
int         EGEAPI mousemsg();                  // 检查是否存在鼠标消息
mouse_msg   EGEAPI getmouse();                  // 获取一个鼠标消息。如果没有,就等待
MOUSEMSG    EGEAPI GetMouseMsg();               // (不推荐使用的函数)获取一个鼠标消息。如果没有,就等待

void        EGEAPI flushmouse();                // 清空鼠标消息缓冲区
int         EGEAPI showmouse(int bShow);        // 设置是否显示鼠标
int         EGEAPI mousepos(int *x, int *y); // 获取当前鼠标位置

最常用的函数是getmouse函数,它的返回值是一个叫mouse_msg的结构体。

typedef struct mouse_msg {
	int             x;
	int             y;
	mouse_msg_e     msg;
	unsigned int    flags;
	int             wheel;
	bool is_left() { return (flags & mouse_flag_left) != 0; }
	bool is_right() { return (flags & mouse_flag_right) != 0; }
	bool is_mid() { return (flags & mouse_flag_mid) != 0; }
	bool is_down() { return msg == mouse_msg_down; }
	bool is_up() { return msg == mouse_msg_up; }
	bool is_move() { return msg == mouse_msg_move; }
	bool is_wheel() { return msg == mouse_msg_wheel; }
}mouse_msg;

其中x,y为鼠标坐标,is_left和is_right判断是否按下鼠标左右键。

如果只想要得到鼠标坐标,可以使用mousepos函数。

#include<ege.h>
using namespace ege;
int main(){
    setinitmode(1,0,0);
    initgraph(-1,-1);
    int x,y;
    for(;;){
        mousepos(&x,&y);
        xyprintf(0,0,"x:%d    y:%d    ",x,y);
        Sleep(1);
    }
}

2.键盘

在控制台窗口编程时,我们一边会这么写。

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)

if(KEY_DOWN(VK_SPACE)) ...    //如果按下空格
if(KEY_DOWN('A')) ...         //如果按下字母A

在中间的VK_NONAME中可以填winuser.h里的常量

#define VK_LBUTTON					    1
#define VK_RBUTTON					    2
#define VK_CANCEL					    3
#define VK_MBUTTON					    4

#define VK_BACK 					    8
#define VK_TAB						    9
#define VK_CLEAR					   12
#define VK_RETURN					   13
#define VK_SHIFT					   16
#define VK_CONTROL					   17
#define VK_MENU 					   18
#define VK_PAUSE					   19
#define VK_CAPITAL					   20
#define VK_KANA 					 0x15
#define VK_HANGEUL					 0x15
#define VK_HANGUL					 0x15
#define VK_JUNJA					 0x17
#define VK_FINAL					 0x18
#define VK_HANJA					 0x19
#define VK_KANJI					 0x19
#define VK_ESCAPE					 0x1B
#define VK_CONVERT					 0x1C
#define VK_NONCONVERT					 0x1D
#define VK_ACCEPT					 0x1E
#define VK_MODECHANGE					 0x1F
#define VK_SPACE					   32
#define VK_PRIOR					   33
#define VK_NEXT 					   34
#define VK_END						   35
#define VK_HOME 					   36
#define VK_LEFT 					   37
#define VK_UP						   38
#define VK_RIGHT					   39
#define VK_DOWN 					   40
#define VK_SELECT					   41
#define VK_PRINT					   42
#define VK_EXECUTE					   43
#define VK_SNAPSHOT					   44
#define VK_INSERT					   45
#define VK_DELETE					   46
#define VK_HELP 					   47
#define VK_LWIN 					 0x5B
#define VK_RWIN 					 0x5C
#define VK_APPS 					 0x5D
#define VK_SLEEP					 0x5F
#define VK_NUMPAD0					 0x60
#define VK_NUMPAD1					 0x61
#define VK_NUMPAD2					 0x62
#define VK_NUMPAD3					 0x63
#define VK_NUMPAD4					 0x64
#define VK_NUMPAD5					 0x65
#define VK_NUMPAD6					 0x66
#define VK_NUMPAD7					 0x67
#define VK_NUMPAD8					 0x68
#define VK_NUMPAD9					 0x69
#define VK_MULTIPLY					 0x6A
#define VK_ADD						 0x6B
#define VK_SEPARATOR					 0x6C
#define VK_SUBTRACT					 0x6D
#define VK_DECIMAL					 0x6E
#define VK_DIVIDE					 0x6F
#define VK_F1						 0x70
#define VK_F2						 0x71
#define VK_F3						 0x72
#define VK_F4						 0x73
#define VK_F5						 0x74
#define VK_F6						 0x75
#define VK_F7						 0x76
#define VK_F8						 0x77
#define VK_F9						 0x78
#define VK_F10						 0x79
#define VK_F11						 0x7A
#define VK_F12						 0x7B
#define VK_F13						 0x7C
#define VK_F14						 0x7D
#define VK_F15						 0x7E
#define VK_F16						 0x7F
#define VK_F17						 0x80
#define VK_F18						 0x81
#define VK_F19						 0x82
#define VK_F20						 0x83
#define VK_F21						 0x84
#define VK_F22						 0x85
#define VK_F23						 0x86
#define VK_F24						 0x87
#define VK_NUMLOCK					 0x90
#define VK_SCROLL					 0x91
#define VK_LSHIFT					 0xA0
#define VK_RSHIFT					 0xA1
#define VK_LCONTROL					 0xA2
#define VK_RCONTROL					 0xA3
#define VK_LMENU					 0xA4
#define VK_RMENU					 0xA5

#define VK_OEM_1					 0xBA
#define VK_OEM_2					 0xBF
#define VK_OEM_3					 0xC0
#define VK_OEM_4					 0xDB
#define VK_OEM_5					 0xDC
#define VK_OEM_6					 0xDD
#define VK_OEM_7					 0xDE
#define VK_OEM_8					 0xDF

#define VK_PROCESSKEY					 0xE5

#define VK_ATTN 					 0xF6
#define VK_CRSEL					 0xF7
#define VK_EXSEL					 0xF8
#define VK_EREOF					 0xF9
#define VK_PLAY 					 0xFA
#define VK_ZOOM 					 0xFB
#define VK_NONAME					 0xFC
#define VK_PA1						 0xFD
#define VK_OEM_CLEAR					 0xFE

在EGE库中,关于键盘也有一些函数。

//键盘处理函数
int     EGEAPI kbmsg();
key_msg EGEAPI getkey();
EGE_DEPRECATE(getchEx)
int     EGEAPI getchEx(int flag);
EGE_DEPRECATE(kbhitEx)
int     EGEAPI kbhitEx(int flag);
int     EGEAPI keystate(int key);       // 获得键码为key的键(见key_code_e)是否按下,如果key使用鼠标按键的键码,则获得的是鼠标键状态
void    EGEAPI flushkey();              // 清空键盘消息缓冲区

#if !defined(_INC_CONIO) && !defined(_CONIO_H_)
#define _INC_CONIO
#define _CONIO_H_
int EGEAPI getch();
int EGEAPI kbhit();
#else
#define getch getchEx
#define kbhit kbhitEx
#endif

我们可以看到,在这一堆函数声明中,有一个getch和kbhit。这就是为什么我们在#include<ege.h>的同时不能#include<conio.h>

其中keystate函数和我们上面的KEY_DOWN定义是一样的,只不过keystate里的参数是填key_code_e里的枚举量。

typedef enum key_code_e {
	key_mouse_l     = 0x01,
	key_mouse_r     = 0x02,
	key_mouse_m     = 0x04,
	key_back        = 0x08,
	key_tab         = 0x09,
	key_enter       = 0x0d,
	key_shift       = 0x10,
	key_control     = 0x11,
	key_menu        = 0x12,
	key_pause       = 0x13,
	key_capslock    = 0x14,
	key_esc         = 0x1b,
	key_space       = 0x20,

	key_pageup      = 0x21,
	key_pagedown    = 0x22,
	key_home        = 0x23,
	key_end         = 0x24,

	key_left        = 0x25,
	key_up          = 0x26,
	key_right       = 0x27,
	key_down        = 0x28,

	key_print       = 0x2a,
	key_snapshot    = 0x2c,
	key_insert      = 0x2d,
	key_delete      = 0x2e,

	key_0           = 0x30,
	key_1           = 0x31,
	key_2           = 0x32,
	key_3           = 0x33,
	key_4           = 0x34,
	key_5           = 0x35,
	key_6           = 0x36,
	key_7           = 0x37,
	key_8           = 0x38,
	key_9           = 0x39,

	key_A           = 0x41,
	key_B           = 0x42,
	key_C           = 0x43,
	key_D           = 0x44,
	key_E           = 0x45,
	key_F           = 0x46,
	key_G           = 0x47,
	key_H           = 0x48,
	key_I           = 0x49,
	key_J           = 0x4a,
	key_K           = 0x4b,
	key_L           = 0x4c,
	key_M           = 0x4d,
	key_N           = 0x4e,
	key_O           = 0x4f,
	key_P           = 0x50,
	key_Q           = 0x51,
	key_R           = 0x52,
	key_S           = 0x53,
	key_T           = 0x54,
	key_U           = 0x55,
	key_V           = 0x56,
	key_W           = 0x57,
	key_X           = 0x58,
	key_Y           = 0x59,
	key_Z           = 0x5a,
	key_win_l       = 0x5b,
	key_win_r       = 0x5c,

	key_sleep       = 0x5f,

	key_num0        = 0x60,
	key_num1        = 0x61,
	key_num2        = 0x62,
	key_num3        = 0x63,
	key_num4        = 0x64,
	key_num5        = 0x65,
	key_num6        = 0x66,
	key_num7        = 0x67,
	key_num8        = 0x68,
	key_num9        = 0x69,

	key_multiply    = 0x6a,
	key_add         = 0x6b,
	key_separator   = 0x6c,
	key_subtract    = 0x6d,
	key_decimal     = 0x6e,
	key_divide      = 0x6f,

	key_f1          = 0x70,
	key_f2          = 0x71,
	key_f3          = 0x72,
	key_f4          = 0x73,
	key_f5          = 0x74,
	key_f6          = 0x75,
	key_f7          = 0x76,
	key_f8          = 0x77,
	key_f9          = 0x78,
	key_f10         = 0x79,
	key_f11         = 0x7a,
	key_f12         = 0x7b,

	key_numlock     = 0x90,
	key_scrolllock  = 0x91,

	key_shift_l     = 0xa0,
	key_shift_r     = 0xa1,
	key_control_l   = 0xa2,
	key_control_r   = 0xa3,
	key_menu_l      = 0xa4,
	key_menu_r      = 0xa5,

	key_semicolon   = 0xba,
	key_plus        = 0xbb,
	key_comma       = 0xbc,
	key_minus       = 0xbd,
	key_period      = 0xbe,
	key_slash       = 0xbf,
	key_tilde       = 0xc0,
	key_lbrace      = 0xdb,
	key_backslash   = 0xdc,
	key_rbrace      = 0xdd,
	key_quote       = 0xde,

	key_ime_process = 0xe5,
}key_code_e;

示例程序:

#include<ege.h>
using namespace ege;
int main(){
	initgraph(640,480);
	for(;;){
		cleardevice();
		if(keystate(key_0)) xyprintf(0,0,"You pressed 0!!!    ");
		if(keystate(key_delete)) xyprintf(0,0,"You pressed delete!!!");
		if(keystate(key_space)) break;
		Sleep(1);
	}
}

三.图像处理

在EGE库中,我们有如下函数处理图像:

//图片函数
#define getmaxx getwidth
#define getmaxy getheight

int EGEAPI getwidth(PCIMAGE pimg = NULL);          // 获取图片宽度
int EGEAPI getheight(PCIMAGE pimg = NULL);         // 获取图片高度
int EGEAPI getx(PCIMAGE pimg = NULL);              // 获取当前 x 坐标
int EGEAPI gety(PCIMAGE pimg = NULL);              // 获取当前 y 坐标

PIMAGE         EGEAPI newimage();                      // 创建 PIMAGE
PIMAGE         EGEAPI newimage(int width, int height); // 创建 PIMAGE
void           EGEAPI delimage(PCIMAGE pImg);          // 删除 PIMAGE
color_t*       EGEAPI getbuffer(PIMAGE pImg);
const color_t* EGEAPI getbuffer(PCIMAGE pImg);

int  EGEAPI resize_f(PIMAGE pDstImg, int width, int height);  //重设尺寸,但不填充背景色
int  EGEAPI resize(PIMAGE pDstImg, int width, int height); //重设尺寸,并填充背景色
int EGEAPI getimage(PIMAGE pDstImg, int srcX, int srcY, int srcWidth, int srcHeight);                             // 从屏幕获取图像
int EGEAPI getimage(PIMAGE pDstImg, PCIMAGE pSrcImg, int srcX, int srcY, int srcWidth, int srcHeight);            // 从另一个 PIMAGE 对象中获取图像
int  EGEAPI getimage(PIMAGE pDstImg, LPCSTR  pImgFile, int zoomWidth = 0, int zoomHeight = 0);                     // 从图片文件获取图像(bmp/jpg/gif/emf/wmf)
int  EGEAPI getimage(PIMAGE pDstImg, LPCWSTR pImgFile, int zoomWidth = 0, int zoomHeight = 0);                     // 从图片文件获取图像(bmp/jpg/gif/emf/wmf)
int  EGEAPI getimage(PIMAGE pDstImg, LPCSTR  pResType, LPCSTR  pResName, int zoomWidth = 0, int zoomHeight = 0);   // 从资源文件获取图像(bmp/jpg/gif/emf/wmf)
int  EGEAPI getimage(PIMAGE pDstImg, LPCWSTR pResType, LPCWSTR pResName, int zoomWidth = 0, int zoomHeight = 0);   // 从资源文件获取图像(bmp/jpg/gif/emf/wmf)
void EGEAPI putimage(int dstX, int dstY, PCIMAGE pSrcImg, DWORD dwRop = SRCCOPY);                                  // 绘制图像到屏幕
void EGEAPI putimage(int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, DWORD dwRop = SRCCOPY);                                // 绘制图像到屏幕(指定宽高)
void EGEAPI putimage(int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, int srcWidth, int srcHeight, DWORD dwRop = SRCCOPY);   // 绘制图像到屏幕(指定源宽高和目标宽高进行拉伸)
void EGEAPI putimage(PIMAGE pDstImg, int dstX, int dstY, PCIMAGE pSrcImg, DWORD dwRop = SRCCOPY);                                                                 // 绘制图像到另一图像中
void EGEAPI putimage(PIMAGE pDstImg, int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, DWORD dwRop = SRCCOPY);                // 绘制图像到另一图像中(指定宽高)
void EGEAPI putimage(PIMAGE pDstImg, int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, int srcWidth, int srcHeight, DWORD dwRop = SRCCOPY);   // 绘制图像到另一图像中(指定源宽高和目标宽高进行拉伸)
int  EGEAPI saveimage(PCIMAGE pimg, LPCSTR  filename);
int  EGEAPI saveimage(PCIMAGE pimg, LPCWSTR filename);
int  EGEAPI savepng(PCIMAGE pimg, LPCSTR  filename, int bAlpha = 0);
int  EGEAPI savepng(PCIMAGE pimg, LPCWSTR filename, int bAlpha = 0);
int  EGEAPI getimage_pngfile(PIMAGE pimg, LPCSTR  filename);
int  EGEAPI getimage_pngfile(PIMAGE pimg, LPCWSTR filename);

1.PIMAGE

PIMAGE是一种存储图像数据的数据类型。

2.newimage

在创建一个新的PIMAGE对象时,我们就需要用到newimage函数。

PIMAGE p=newimage();

如果我们不加这个newimage()的话,当尝试获取图像时,则会发生报错。

如果将一个PIMAGE对象定义成全局变量,则需要在main函数或其他函数内将其赋值为newimage()。

3.putimage

putimage有六个重载。

void EGEAPI putimage(int dstX, int dstY, PCIMAGE pSrcImg, DWORD dwRop = SRCCOPY);                                  // 绘制图像到屏幕
void EGEAPI putimage(int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, DWORD dwRop = SRCCOPY);                                // 绘制图像到屏幕(指定宽高)
void EGEAPI putimage(int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, int srcWidth, int srcHeight, DWORD dwRop = SRCCOPY);   // 绘制图像到屏幕(指定源宽高和目标宽高进行拉伸)
void EGEAPI putimage(PIMAGE pDstImg, int dstX, int dstY, PCIMAGE pSrcImg, DWORD dwRop = SRCCOPY);                                                                 // 绘制图像到另一图像中
void EGEAPI putimage(PIMAGE pDstImg, int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, DWORD dwRop = SRCCOPY);                // 绘制图像到另一图像中(指定宽高)
void EGEAPI putimage(PIMAGE pDstImg, int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, int srcWidth, int srcHeight, DWORD dwRop = SRCCOPY);   // 绘制图像到另一图像中(指定源宽高和目标宽高进行拉伸)

1.简单地显示

#include<ege.h>
using namespace ege;
int main(){
	initgraph(640,480);
	PIMAGE p=newimage();
	getimage(p,"SMACK!!!.jpg");
	putimage(0,0,p);
	getch();
}

这段代码会将图片直接放在窗口(0,0)处,不管放不放的下。

 2.显示图片一部分

#include<ege.h>
using namespace ege;
int main(){
	initgraph(640,480);
	PIMAGE p=newimage();
	getimage(p,"SMACK!!!.jpg");
	putimage(0,0,50,50,p,100,100);
	getch();
}

这会从图片的(100,100)往右下选取50*50的像素,显示在(0,0)处

 3.压缩显示图片的一部分

#include<ege.h>
using namespace ege;
int main(){
	initgraph(640,480);
	PIMAGE p=newimage();
	getimage(p,"SMACK!!!.jpg");
	putimage(0,0,50,50,p,100,100,200,100);
	getch();
}

这会从图片的(100,100)往右下选取100*200的像素,压缩成50*50,显示在(0,0)处

 4.delimage

删除PIMAGE变量。

#include<ege.h>
using namespace ege;
int main(){
	initgraph(640,480);
	PIMAGE p=newimage();
	getimage(p,"SMACK!!!.jpg");
	putimage(0,0,p);
	getch();
	delimage(p);
}

5.getimage_pngfile

上面都是显示bmp/jpg/gif/emf/wmf图像的,而下面这个函数可以读取png文件。

int  EGEAPI getimage_pngfile(PIMAGE pimg, LPCSTR  filename);
int  EGEAPI getimage_pngfile(PIMAGE pimg, LPCWSTR filename);

还有一些其他函数也是关于png的。

int  EGEAPI savepng(PCIMAGE pimg, LPCSTR  filename, int bAlpha = 0);
int  EGEAPI savepng(PCIMAGE pimg, LPCWSTR filename, int bAlpha = 0);
int  EGEAPI getimage_pngfile(PIMAGE pimg, LPCSTR  filename);
int  EGEAPI getimage_pngfile(PIMAGE pimg, LPCWSTR filename);

用法跟上面的是一样的。

四.音乐播放

1.MUSIC类

EGE库中,有一个专门处理音乐的类——MUSIC

class MUSIC
{
public:
	MUSIC();
	virtual ~MUSIC();
	operator HWND()const{ return (HWND)m_dwCallBack; }
public:
	int   IsOpen() { return (m_DID != MUSIC_ERROR) ? 1 : 0; }
	DWORD OpenFile(LPCSTR  filepath);
	DWORD OpenFile(LPCWSTR filepath);
	DWORD Play(DWORD dwFrom = MUSIC_ERROR, DWORD dwTo = MUSIC_ERROR);
	DWORD Pause();
	DWORD Seek(DWORD dwTo); //播放位置定位,单位为ms
	DWORD SetVolume(float value);
	DWORD Close();
	DWORD Stop();
	DWORD GetPosition();
	DWORD GetLength();
	// 以下函数GetPlayStatus的返回值为以下之一(意义看后缀):
	// MUSIC_MODE_NOT_OPEN   //没有正确打开
	// MUSIC_MODE_NOT_READY  //设备没准备好 (较少使用)
	// MUSIC_MODE_PAUSE  //暂停中
	// MUSIC_MODE_PLAY   //正在播放
	// MUSIC_MODE_STOP   //成功打开后,或者播放完是这个状态
	// MUSIC_MODE_OPEN   //打开中 (较少使用)
	// MUSIC_MODE_SEEK   //定位中 (较少使用)
	DWORD GetPlayStatus();
private:
	DWORD       m_DID;
	PVOID       m_dwCallBack;
};

2.OpenFile

创建了一个MUSIC对象之后,要播放音乐,首先得打开音乐文件。

#include<ege.h>
using namespace ege;
int main(){
	initgraph(640,480);
	MUSIC m;
	m.OpenFile("express_myself.mp3");
	getch();
}

输路径时,可以输相对路径,而且要把后缀带上。

在我试过的后缀中,好像就只能打开MP3

其他格式好像都打不开。

3.Play

成功打开音乐后,我们就可以播放了。

要播放的话,只需直接m.Play()就可以了。至于后面的dwFrom和dwTo参数是什么,我也不是很清楚

#include<ege.h>
using namespace ege;
int main(){
	initgraph(640,480);
	MUSIC m;
	m.OpenFile("express_myself.mp3");
	m.Play();
	getch();
}

4.Stop

顾名思义,就是停止音乐。

5.Pause

暂停音乐,和Stop还是有一点区别。

如果使用了Stop,下一次播放会从头开始

如果使用了Pause,下一次播放会从上一次暂停的地方开始。

#include<ege.h>
using namespace ege;
bool b;
int main(){
	initgraph(640,480);
	MUSIC m;
	m.OpenFile("express_myself.mp3");
	m.Play();
	for(;;){
		if(keystate(key_space)){
			if(b){
				m.Play();
				b=0;
			}else{
				m.Pause();
				b=1;
			}
		}
		Sleep(100);
	}
	getch();
}

6.Close

关闭音乐,如果要播放得再次OpenFile.

7.IsOpen

判断是否成功打开音乐。

8.三个Get

1.GetPlayStatus

获取音乐类此时的状态,会返回一个数。

enum music_state_flag {
	MUSIC_MODE_NOT_OPEN = 0x0,
	MUSIC_MODE_NOT_READY = 0x20C,
	MUSIC_MODE_PAUSE = 0x211,
	MUSIC_MODE_PLAY = 0x20E,
	MUSIC_MODE_STOP = 0x20D,
	MUSIC_MODE_OPEN = 0x212,
	MUSIC_MODE_SEEK = 0x210,
};

// MUSIC_MODE_NOT_OPEN   //没有正确打开
// MUSIC_MODE_NOT_READY  //设备没准备好 (较少使用)
// MUSIC_MODE_PAUSE      //暂停中
// MUSIC_MODE_PLAY       //正在播放
// MUSIC_MODE_STOP       //成功打开后,或者播放完是这个状态
// MUSIC_MODE_OPEN       //打开中 (较少使用)
// MUSIC_MODE_SEEK       //定位中 (较少使用)

2.GetLength

获取音乐的长度,单位ms.

3.GetPosition

获取当前播放到音乐的第几ms.

#include<ege.h>
using namespace ege;
bool b;
int main(){
	initgraph(640,480);
	MUSIC m;
	m.OpenFile("express_myself.mp3");
	m.Play();
	for(;;){
		xyprintf(0,0,"%d",m.GetPosition());
		if(keystate(key_space)){
			if(b){
				m.Play();
				b=0;
			}else{
				m.Pause();
				b=1;
			}
		}
		Sleep(100);
	}
	getch();
}

 9.SetVolume

设置音量,范围[0,1]。例如可以像下面那样设置渐进。

#include<ege.h>
using namespace ege;
int main(){
	initgraph(640,480);
	MUSIC m;
	m.OpenFile("express_myself.mp3");
	m.Play();
	for(int i=0;;i++){
		if(i<=100) m.SetVolume(i/100.0);
		Sleep(1);
	}
	getch();
}

10.Seek

这个我也不清楚是干什么的,不过应该是定位。

五.总结

那么这就是我们今天的EGE库使用进阶篇啦!当然还有很多东西没讲到,下次我们再继续!

上期内容:DEV-C++ ege.h库入门

下期内容:DEV-C++ ege.h库 绘图教程(一)

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值