EasyX 基础 - 第二部分

第一部分:

EasyX 基本绘图和文字输出的部分

目录

一、图像处理

1.1 - loadimage

1.2 - putimage

1.3 - 如何查看一张图片的大小

二、消息处理

2.1 - flushmessage

2.2 - peekmessage

2.3 - 非 EasyX 函数 - 处理键盘消息函数

三、其他函数

3.1 - 批量绘图

3.1.1 - BeginBatchDraw

3.1.2 - FlushBatchDraw

3.1.3 - EndBatchDraw

3.1.4 - 示例

3.2 - 获取绘图窗口句柄

3.2.1 - GetHWnd

3.2.2 - 示例

3.3 - 非 EasyX 函数 - 音乐播放函数



一、图像处理

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

  1. 首先包含头文件 windows.h 和 mmsystem.h

  2. 然后加载静态库 winmm.lib。具体操作:#pragma comment(lib, "winmm.lib")

  3. 最后使用 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值