第一部分:
目录
一、图像处理
1.1 – loadimage
这个函数用于从文件中读取图像
。
void loadimage(
IMAGE* pDstImg,
LPCTSTR pImgFile,
int nWidth = 0,
int nHeight = 0,
bool bResize = false
);
参数
:
-
pDstImg
:保存图像的 IMAGE 对象指针。如果为 NULL,表示图片将读取至绘图窗口。 -
pImgFile
:图片文件名。支持 bmp/ gif/ jpg/ png/ tif/ emf/ wmf/ ico 格式的图片。gif 格式的图片仅加载第一帧;gif 与 png 均不支持透明。 -
nWidth
:图片的拉伸宽度。加载图片后,会拉伸至该宽度。如果为 0,表示使用原图的宽度。 -
nHeight
:图片的拉伸高度。加载图片后,会拉伸至该高度。如果为 0,表示使用原图的高度。 -
bResize
:是否调整 IMAGE 的大小以适应图片。
1.2 – putimage
这个函数的几个重载用于在当前设备上绘制指定图像
。
void putimage(
int dstX,
int dstY,
IMAGE* pSrcImg,
DWORD dwRop = SRCCOPY
);
参数
:
-
dstX
:绘制位置的 x 坐标。 -
dstY
:绘制位置的 y 坐标。 -
pSrcImg
:要绘制的 IMAGE 对象指针。 -
dwRop
:三元光栅操作码。
1.3 – 如何查看一张图片的大小
右击图片 –> 选择”属性” –> 选择”详细信息”
。
二、消息处理
消息缓冲区可以缓冲 63 个未处理的消息。每次获取消息时,将从消息缓冲区取出一个最早发生的消息。消息缓冲区满了之后,不再接受任何消息
。
2.1 – flushmessage
这个函数用于清空消息缓冲区
。
void flushmessage(BYTE filter = -1);
参数
:
-
filter
:指定要清空的消息范围,默认为 -1,即清空所有类别的消息。可以用以下值或值的组合清空指定类别的消息:标志 描述 EM_MOUSE 鼠标消息 EM_KEY 按键消息 EM_CHAR 字符消息 EM_WINDOW 窗口消息
2.2 – peekmessage
这个函数用于获取一个消息,并立即返回
。
bool peekmessage(
ExMessage* msg,
BYTE filter = -1,
bool removemsg = true;
);
参数
:
-
msg:指向消息结构体的 ExMessage 的指针,用来保存获取到的消息
。 -
filter
:指定要获取的消息范围,默认为 -1,即获取所有类别的消息。可以用以下值或值的组合获取指定类别的消息:标志 描述 EM_MOUSE 鼠标消息 EM_KEY 按键消息 EM_CHAR 字符消息 EM_WINDOW 窗口消息 -
removemsg
:在 peekmessage 处理完消息后,是否将其从消息队列中移出。
默认情况下,连续的鼠标单击会被识别为一系列的单击事件。如果希望两个连续的鼠标单击被识别为双击事件,请在创建绘图窗口的时候指定标志位 EW_DBLCLKS
。
返回值
:
-
如果获取到了消息,返回 true。
-
如果当前没有消息,则返回 false。
2.3 – 非 EasyX 函数 – 处理键盘消息函数
可以使用
kbhit()
或者
_kbhit()
函数来判断是否有键盘消息;使用
getch()
或者
_getch()
函数来接受所按的字符。
使用这些函数需要引入头文件 conio.h
。
三、其他函数
3.1 – 批量绘图
在设备上不断进行绘图操作时,会发生闪屏的现象,针对这个问题,需要使用以下的函数进行处理
。
3.1.1 – BeginBatchDraw
这个函数用于开始批量绘图。执行后,任何绘图操作都将暂时不输出到绘图窗口上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出
。
void BeignBatchDraw();
3.1.2 – FlushBatchDraw
这个函数用于执行未完成的绘制任务
。
void FlushBatchDraw();
3.1.3 – EndBatchDraw
这个函数用于结束批量绘制,并执行未完成的绘制任务
。
void EndBatchDraw();
3.1.4 – 示例
以下代码实现一个圆从左向右移动,如果不使用以上的函数进行处理,会有比较明显的闪烁。可以通过注释的方式,进行比较
。
#include <graphics.h>
#define WIDTH 640
#define HEIGHT 480
int main()
{
initgraph(WIDTH, HEIGHT);
// BeginBatchDraw();
setlinecolor(WHITE);
setfillcolor(RED);
int radius = 40;
int x = 0;
for (x = radius; x <= WIDTH - radius; x++)
{
fillcircle(x, HEIGHT / 2, radius);
// FlushBatchDraw();
Sleep(10);
cleardevice();
}
// EndBatchDraw();
return 0;
}
3.2 – 获取绘图窗口句柄
3.2.1 – GetHWnd
这个函数用于获取绘图窗口句柄
。
HWND GetHWnd();
在 Windows 下,句柄是一个窗口的标识,得到句柄后,可以使用 Windows API 中的函数实现对窗口的控制
。
3.2.2 – 示例
#include <graphics.h>
#include <stdio.h>
#define WIDTH 640
#define HEIGHT 480
int main()
{
initgraph(WIDTH, HEIGHT);
// 获取窗口句柄
HWND hWnd = GetHWnd();
// 修改窗口标题
SetWindowText(hWnd, L"Game");
// 弹出对话框
int ret = MessageBox(NULL, L"Game Over! Again?", L"Game", MB_OKCANCEL);
if (ret == IDOK)
{
printf("游戏重新开始~\n");
}
else if (ret == IDCANCEL)
{
printf("游戏已退出!\n");
}
closegraph();
return 0;
}
3.3 – 非 EasyX 函数 – 音乐播放函数
为了实现用 C 语言播放音乐,我们需要使用 Windows 的一个 API
。
-
首先包含头文件 windows.h 和 mmsystem.h
。 -
然后加载静态库 winmm.lib。具体操作:#pragma comment(lib, “winmm.lib”)
。 -
最后使用 mciSendString 函数播放音乐
。
// MCI:Media Control Interface,即媒体控制接口
MCIERROR mciSendString(
LPCSTR lpstrCommand, // 命令字符串
LPSTR lpstrReturnString, // 接受返回信息的缓冲区,为 NULL 时则不返回信息
UINT uReturnLength, // 上述缓冲区的大小
HWND hwndCallBack // 一般为 NULL
);
示例
:
// 打开音乐
mciSendString("open ./ThatGirl.mp3 alias BGM", NULL, 0, NULL); // alias - 别名
// 播放音乐
mciSendString("play BGM repeat", NULL, 0, NULL); // repeat - 重复
// 关闭音乐
mciSendString("close BGM", NULL, 0, NULL);