EGE库是一个作为Easy Graphics(简单图形库)的C语言图形库,可以在Visual C++6.0及以上开发环境、Dev-C++21及以上开发环境中使用,是为了让C语言爱好者可以用C语言来编写图形界面。
EGE库鼠标操作是EGE库中十分重要的一部分,本文将从以下几个方面进行详细的阐述。
鼠标消息函数及参数
EGE库中常用到的鼠标消息函数有三个:
void MouseHit(); void GetMouseMsg(MouseMsg *mouse); void GetMessage(Msg *msg);
MouseHit()
函数用于检测鼠标消息是否被触发,如果有,则进行后续的鼠标操作;GetMouseMsg()
函数用于获取鼠标消息;GetMessage()
函数用于接受消息,如果全局消息队列中存在消息,则返回该消息。
MouseHit()
函数不需要参数,GetMouseMsg(MouseMsg *mouse)
和GetMessage(Msg *msg)
函数需要传递一个结构体指针作为参数。其中,MouseMsg
结构体有以下成员:
int x,y;//鼠标当前坐标 int buttons;//鼠标按键的状态(左、右、中键) int status;//鼠标的状态(按下、松开、移动)
而Msg
结构体有以下成员:
int message;//消息类型 int paramH;//消息参数的高位 int paramL;//消息参数的低位 long time;//消息发送时间 HWND hwnd;//目标窗口的句柄
鼠标坐标系
EGE库鼠标坐标系以窗口的左上角为原点,向右为x轴正向,向下为y轴正向。
鼠标事件
EGE库鼠标事件主要包括鼠标按下、鼠标松开、鼠标移动三个动作。发生这些动作时,EGE库会捕捉到鼠标坐标、鼠标按键状态等信息,并根据相应动作的事件进行操作。
鼠标移动
鼠标的移动是可以被检测到的,这也是常用于实现游戏鼠标控制的方式。通过获取鼠标当前的坐标信息,可以在程序中实现鼠标跟随和鼠标拖动等操作。
鼠标点击
鼠标点击是指鼠标按键按下后松开的一种操作。这里有几个需要注意的问题:
- EGE库会检测到鼠标按键的状态(左、右、中键),根据按键状态进行后续操作。
- 在鼠标点击事件中,可以通过判断鼠标点击的坐标是否在指定区域内来判断是否触发了按钮等事件。
鼠标双击
鼠标双击事件比较复杂,需要结合计时器控件,具体实现可见代码示例。通过计算两次鼠标点击事件的时间间隔,以及位置是否相近等信息,判断是否触发了鼠标双击事件。
示例代码
实现鼠标移动
#include <graphics.h> int main() { initgraph(640, 480); MouseMsg m; while (true) { if (MouseHit()) { GetMouseMsg(&m); //判断鼠标移动 if (m.status == MOUSEMOVE) { cleardevice();//清空画面 circle(m.x, m.y, 20);//绘制圆形 } } } closegraph(); return 0; }
实现鼠标点击
#include <graphics.h> int main() { initgraph(640, 480); MouseMsg m; while (true) { if (MouseHit()) { GetMouseMsg(&m); //判断鼠标点击 if (m.status == BUTTON_DOWN) { if (m.buttons == 1)//左键 { //判断鼠标点击是否在指定区域内 if (m.x > 200 && m.x < 400 && m.y > 200 && m.y < 300) { cleardevice();//清空画面 settextcolor(BLUE);//设置文字颜色 outtextxy(250, 250, "Hello World!");//输出指定文字到画面中 } } } } } closegraph(); return 0; }
实现鼠标双击
#include <graphics.h> int main() { initgraph(640, 480); MouseMsg m; long lastTime = 0;//上一次点击时间 while (true) { if (MouseHit()) { GetMouseMsg(&m); //判断鼠标点击 if (m.status == BUTTON_DOWN) { if (m.buttons == 1)//左键 { //判断鼠标点击是否在指定区域内 if (m.x > 200 && m.x < 400 && m.y > 200 && m.y < 300) { //判断是否是双击事件 if (GetTickCount() - lastTime < 500)//时间间隔小于500毫秒 { cleardevice();//清空画面 settextcolor(BLUE);//设置文字颜色 outtextxy(250, 250, "双击事件触发!");//输出指定文字到画面中 } lastTime = GetTickCount();//记录当前点击时间 } } } } } closegraph(); return 0; }