上次写了一个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库入门