EasyX 基础 – 第二部分

  • Post author:
  • Post category:其他




第一部分:



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);



版权声明:本文为melonyzzZ原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。