目录
一、其他小知识
1.1如何在VS中实现快速替换功能
1.2enum与define
1.3_getch()函数的介绍
1.4C/C++中的<Windows.h>库
1.5基于vs的图片音频导入
二、EASYX库
2.1简单的注意事项
2.2窗口函数
2.2.1创建一个窗口(initgraph)
2.2.2其他
设置背景色时,需要两条命令
2.3图形绘制函数
清屏函数(cleardevice)
设置背景模式(setbkmode)
2.4文字绘制函数
2.5图像处理函数(重点)
2.6音乐的使用
2.7消息(鼠标 键盘)
键盘和鼠标的使用
2.8其他函数·
2.8.1键盘消息函数
2.8.2如何修改窗口标题
点击【编辑】->[查找和替换]->[快速替换],将需要替换的内容和原内容进行填写,并选择全部替换即可!
定义
enum 标识符
{
枚举数据表
};
(1)enum是关键字,标识枚举类型。定义枚举类型必须用enum开头。
(2)枚举数据表中的名字是程序员自己设定,这些名字只是一个符号。但注意命名时要提高程序的可读性。枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
(3)枚举数据表的值都是整数。第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。也可以人为设定枚举成员的值,从而自定义某个范围内的整数。
(4)可以在定义类型时对枚举常量初始化。
(5)枚举类型可以进行比较。
(6)枚举常量不是字符串,不能用%s方式输出字符串。
(7)enum
类型 不允许元素为字符常量、字符串常量、整型常量、浮点常量、布尔常量等字面常量
注意:
enum用来定义一系列宏定义常量区别用,相当于一系列的#define xx xx,当然它后面的标识符也可当作一个类型标识符;typedef enum则是用来定义一个数据类型,那么该类型的变量值只能在enum定义的范围内取。两者在这点上是没有差别的。
用法:因为枚举变量输出的是索引,可以使用switch(){}
语句转换成字符串,提高代码的可读性
我们一般所使用的 getchar() 函数在读入一个字符时必须按一下 Enter 键,该代码才会继续运行;但是 _getch() 函数读入一个字符时 不用 enter 代码会继续跑;最简单使用场景是登陆界面输入密码时,我们不想让密码显示,而是每一次输入都显示一个‘*’,使用_getch()函数需使用到头文件:
#include
system("cls");//清屏,清除运行框里所有的内容。
system("pause");//暂停,按任意键继续。
system("shutdown -s -t 60")//最后一个数字代表几秒,表示在几秒后关机。
system("shutdown -a");//取消关机的命令(与上一个搭配)。
system("color 02");//换背景和字体的颜色,具体颜色下面会讲。
背景颜色图
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 湖蓝色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
特殊·:
1>Sleep(时间(毫秒));代表的是让计算机暂停输入输出特定时间,括号里写要暂停的毫秒数,如Sleep(1000)代表休眠1000毫秒(1秒)
2>MessageBox(句柄, 显示内容,标题,选择选项);
句柄可以为NULL,表示当前窗体的句柄。
最后一个参数是显示在提示框中的按钮类型:
如
MB_ABORTRETRYIGNORE//终止,重试,忽略
MB_OKCANCEL//确定,取消
MB_RETRYCANCEL//重试,取消
MB_YESNO//是,否
MB_YESNOCANCEL//是,否,取消
MB_OK//确定
2.1.1.如果在使用的时候报错,可能是因为需要用多字节字符集,点击项目—>属性—>找到字符集 ,将它改为 多字节字符集
2.1.2 使用easyx图形库,要使用头文件 #include
initgraph函数有三个参数,第一个是窗口的宽度,第二个是窗口的高度,第三个参数有三个功能,第一个是展示控制台(SHOWCONSOLE—>show 展示,console 控制台)
#include
#include
int main()
{
initgraph(460, 460,SHOWCONSOLE);
while (1)
{
; // 使程序卡住,不闪退,方便看到效果
}
return 0;
}
第二个 NOCLOSE(没有关闭功能)
第三个功能 NOMINIMIZE(没有关闭功能)
closegraph();//关闭绘图窗口
cleardevice();//清空绘图设备
cleardevice();这个函数用于清除屏幕内容。具体的,是用当前背景色清空屏幕,并将当前点移至 (0, 0)。
特别的:
setbkcolor(YELLOW);
cleardevice();
常见图形
circle 画圆 ellipse 椭圆 pie 扇形 polygon 多边形
rectangle 矩形 roundrect 圆角矩形 line 画线 putpixel 画点
画圆(circle,solidcircle)
circle(int x, int y, r) , solidcircle(int x, int y, r) -->实心圆, fillcircle(int x, int y, r)-->用于绘制带边框的填充圆。
圆心坐标(x, y),圆的半径r
画线条(line)
line(int x1, int y1, int x2, int y2)
线条为 (x1, y1) 和 (x2, y2)两个点连接成的
画矩形(rectangle)
rectange(int x1,int y1,int x2, int y2)
(x1, y1)左上顶点 (x2, y2)右下顶点 画矩形
设置填充颜色(setfillcolor)
注意:颜色需要大写 例如 setfillcolor(GREEN)
设置线条颜色(setlinecolor)
颜色需要大写,setlinecolor(GREEN)
设置线条样式(setlinestyle)
设置背景颜色(setbkcolor)
setbkcolor(GREEN)
设置背景时候,需要用清屏函数(无参数),将window的黑色除去,才能够显示出setbkcolor函数所设置出的颜色。
一般在做游戏或者其他项目中,用来设置成透明的
setbkmode(TRANSPARENT) -->transparent 透明的
文字的打印(outtextxy)
outtextxy(int x, int y, 文字)
(x,y)位置 例如 outtextxy(40,50,“你好呀”)
文字的颜色(settextcolor)
settextcolor(GREEN)
文字的形式(settextstyle)
settextstyle(int x, int y, 字体)
(x, y) 位置
例如 settextstyle(40, 40, “宋体”)
注意:
1.printf和scanf不会在图形窗口显示
2.不兼容的解决
2.1在字符串前加大写的Z
2.2在字符串前用—T()包起来
另外还有两个函数可以求字符串的像素宽度和高度
int textheight(LPCTSTR str);//用于获取字符串实际占用的像素高度。
int textwidth(LPCTSTR str);//用于获取字符串实际占用的像素宽度。
通过这两个函数可以让字符串的居中对齐:
#include //包含图形库头文件
int main()
{
// 初始化绘图窗口,宽度和高度
initgraph(640,480);
setbkcolor(RGB(203, 221, 244));
cleardevice();
setfillcolor(YELLOW);
fillrectangle(200, 50, 500, 100);
settextcolor(RGB(155, 0, 15));
char arr[] = "测试字符串";
int width = 300 / 2 - textwidth(arr)/2;
int height = 50 / 2 - textheight(arr) / 2;
setbkmode(TRANSPARENT);
outtextxy(width + 200, height + 50, arr);
while (1)
{
;
}
closegraph();//关闭绘图窗口
cleardevice();//清空绘图设备
return 0;
}
第一步:放图片
先将图片复制粘贴到项目所在的文件夹
第二步:定义图片(IMAGE)
用IMAGE对图片进行定义,例如 IMAGE image
如果图片不止一张,用数组贮存图片,例如IMAGE image[N],N代表图片的数量
第三步:加载图片(loadimage)
IMAGE image;
loadimage(&image,“(定义图片的地址)”),.“./images/2.bmp”(放图片的位置));
注意:如果出现重载中没有一个可以转换参数的类型的报错
有三种解决方法:
第一种(最简单的方法):调成多字节字符集(具体步骤在前面的注意事项中)。
第二种,在loadimage函数中,放图片的位置的参数前面加上个,_T(放图片的位置)。
第三种方法:在放图片位置的参数前面加上个L。
第四步:图片的打印(putimage)
putimage(int x, int y, 定义图片的地址)
(x, y)表示位置
同时loadimage函数的第三个参数和第四个参数,分别表示图片的宽度和高度。
switch (map[level][i][j])
{
case space:
//printf(" ");
putimage(x, y, image_all);
break;
case wall:
//printf("▓ ");
putimage(x, y, image_all + 1);
break;
case destination:
//printf("☆");
putimage(x, y, image_all + 2);
break;
case box:
//printf("□");
putimage(x, y, image_all + 3);
break;
case player:
//printf("♀");
putimage(x, y, image_all + 4);
break;
case box + destination:
//printf("★");
putimage(x, y, image_all + 5);
break;
case player + destination:
//printf("♂");
putimage(x, y, image_all + 4);
break;
}
}
注意·:1图片位置应与.cpp同文件夹
2./表示当前文件下
首先声明一点,这个并不属于easyx库,而是属于windows,所以就需要用头文件,#include
#include
#include
#include // 包含多媒体设备接口文件
#pragma comment(lib, "winmm.lib")
int main()
{
initgraph(460, 460);
//第一种
mciSendString("open ./fire/小幸运.mp3", 0, 0, 0);
mciSendString("play ./fire/小幸运.mp3", 0, 0, 0);
//
//第二种方法 alias 取别名 bk
//mciSendString("open ./fire/小幸运.mp3 alias bk", 0, 0, 0); 打开音乐
//mciSendString("play bk ", 0, 0, 0); 播放音乐
// mciSendString("close ./fire/小幸运.mp3", 0, 0, 0); 关闭音乐
//如果想程序运行一会儿 自动关闭音乐,
//可以使用Sleep函数,然后再关闭音乐的函数,Sleep(3000)表示前面的程序执行3秒,再执行下面的程序
while (1)
{
; // 使程序卡住,不闪退,方便看到效果
}
return 0;
}
其中mciSendString 最后三个参数 分别是 快进 快退,这里播放,就没管,全为0
#include
#include
#include
#pragma comment(lib,"winmm.lib")
using namespace std;
int main()
{
PlaySound(TEXT("F:\\c.wav"),NULL,SND_FILENAME | SND_ASYNC);
cin.get();
cin.get();
return 0;
}
PlaySound只能播放WAV文件。
首先,我们应该知道,initgraph 创建的窗口的无法直接使用键盘和鼠标操作的,所以接下来我们来学习,怎样输出消息。
消息的定义(ExMessage)
直接使用 ,像这样Exmessage m;来定义一个消息
消息的接受(peekmessage)
peekmessage(参数1, 参数2),peekmessage的参数1为消息的地址,参数2则为接受消息的对象(键盘或者鼠标或者都有),所以peekmessage的参数2有3种,分别是EM_MOUSE(鼠标) , EM_KEY(键盘), EM_MOUSE | EM_KEY(鼠标和键盘)
#include
#include
int main()
{
ExMessage m; // 定义消息
peekmessage(&m, EM_KEY); //接受消息(键盘)
peekmessage(&m, EM_MOUSE); //接受消息(鼠标)
peekmessage(&m, EM_KEY | EM_MOUSE);// 接受消息(鼠标和键盘)
return 0;
}
#include
#include
#include
#pragma comment(lib, "winmm.lib")
int main()
{
initgraph(460, 460);
ExMessage m; // 定义消息
//peekmessage(&m, EM_KEY); //接受消息(键盘)
//peekmessage(&m, EM_MOUSE); //接受消息(鼠标)
peekmessage(&m, EM_KEY | EM_MOUSE);// 接受消息(鼠标和键盘)
mciSendString("open ./fire/11.mp3", 0, 0, 0);
while (1)
{
if (m.message == WM_LBUTTONDOWN) // 鼠标左键 M_RBUTTONDOWN 鼠标右键
{
mciSendString("play ./fire/11.mp3", 0, 0, 0);
}
if (m.message == WM_KEYDOWN) // 按键
{
if (m.vkcode == 'f') // 如果按f 就播放小幸运
{
mciSendString("pause ./fire/11.mp3", 0, 0, 0);
}
}
}
return 0;
}
1.void FlushMouseMsgBuffer():用于清空鼠标消息缓冲区
2.MOUSEMSG GetMouseMsg():用于获取鼠标消息。如果鼠标消息队列为空,等待直到有鼠标消息。
3.bool PeekMouseMsg(MOUSEMSG *pMsg, bool bRemoveMsg):用于获取鼠标消息并立即返回。
4.bool MouseHit():用于检查鼠标消息
5.struct MOUSEMSG
{
UINT uMsg; //当前鼠标信息。
bool mkCtrl; //按下CTRL键。
bool mkShift; // SHIFT键为down。
bool mkLButton;//鼠标左键按下。
bool mkMButton;//鼠标中键是向下的。
bool mkRButton;//点击鼠标右键。
int x;//光标的x坐标。(物理坐标)
int y;//光标的y坐标。(物理坐标)
int wheel;//鼠标滚轮滚动值。
}:用于保存鼠标消息
应用:如何控制游戏里人物的移动
ExMessage msg;
peekmessage(&msg, EM_KEY);
switch (msg.message)
{
case WM_KEYDOWN://键盘按下消息
switch (msg.vkcode)
{
case VK_LEFT://按下左键
break;
case VK_RIGHT://按下右键
break;
case VK_UP://按下上键
break;
case VK_DOWN://按下下键
break;
}
break;
}
要使用头文件conio.h
getch()与getchar()类似,但是getch()不需要回车就能输入,如果是上下左右等非ASCII码字符按键时,则使用虚拟键值,其中
上:72
下:80
左:75
右:77
HWND GetHWnd();//这个函数用于获取绘图窗口句柄。
具体使用方式如下:
void change()
{
//获取窗口句柄
HWND hnd = GetHWnd();
//设置窗口标题
SetWindowText(hnd, "测试标题");
//弹出窗口,提示用户操作
MessageBox(NULL, "游戏失败", "窗口标题", MB_OKCANCEL);
}