C++ EGE 图形库 不完全整理

C++ EGE 图形库 不完全整理,第1张

EGE库

适用于win32控制台程序

#include “graphicsh” // 引用图形库

支持VC6, VC2008, VC2010, VC2012, VC2013, VC2015, VC2017, C-Free, DevCpp, Code::Blocks等等IDE

编写动画模块源程序

必须在主函数中初始化:

初始化绘图窗口 initgraph(宽,高) //宽和高的单位是像素

调用动画模块

循环结构,不断绘图/重绘;

处理鼠标/键盘事件:getch(),getkey(),getmouse()

关闭绘图窗口closegraph()

cleardevice()清屏

is_run()判断窗口是否被关闭,被关闭返回0

arc 画圆弧,边线颜色由setcolor函数设置,参数为(圆弧的圆心 x 坐标,y 坐标,起始角的角度,终止角的角度,半径)。

bar 画无边框填充矩形,颜色由setfillstyle函数设置,参数为(矩形左 x 坐标,矩形上y 坐标,右 x 坐标,下y 坐标) 。

rectangle画空心矩形。

circle 画空心圆,边线颜色由setcolor函数设置,参数为(圆心 x 坐标,圆心y 坐标,半径)

drawpoly 画多边形,边线颜色由setcolor函数决定,参数为(多边形顶点的个数,各顶点xy坐标的数组),注意该函数并不会自动连接多边形首尾

fillpoly 画填充的多边形,边线颜色根据setcolor函数,填充颜色根据setfillstyle函数,参数为(多边形顶点的个数,各顶点xy坐标的数组)

ellipse 画椭圆,边线颜色由setcolor函数决定。参数为(椭圆弧线圆心 x 坐标,圆心 y 坐标,椭圆弧线的起始角的角度,终止角的角度,椭圆弧线的 x 轴半径,y 轴半径) 

fillellipse 画填充椭圆,边线颜色由setcolor函数决定,填充颜色由setfillstyle函数决定。参数为(椭圆弧线圆心 x 坐标,圆心 y 坐标,椭圆弧线的起始角的角度,终止角的角度,椭圆弧线的 x 轴半径,y 轴半径) 。

EGERGB合成颜色,参数(红色部分,绿色部分,蓝色部分)

setbkcolor 设置当前绘图背景色

setcolor 设置当前绘图前景色

setfillcolor 设置当前绘图填充色

setfont (30, 0, "华文楷体");//指定字体高度宽度

setcolor(BLACK);

outtextxy(270, 20, "演示程序");

outtextxy(100, 100, "Hello EGE Graphics");

//写文字,outtextxy不支持\t \n这类格式化用的特殊字符

//要使用特殊格式化字符请用outtextrect

outtextrect(100, 120, 200, 100, "\tHello EGE Graphics\nHere is the next line");

mousepos(&x, &y) 获取当前鼠标位置

mouse_msg保存鼠标消息的结构体:

int x;当前鼠标 x 坐标

int y;当前鼠标 y 坐标

int wheel;鼠标滚轮滚动值,一般为 120 的倍数或约数

is_move()是否鼠标移动消息

is_down()是否鼠标按键按下消息

is_up()是否鼠标按键放开消息

is_left()是否鼠标左键消息

is_mid()是否鼠标中键消息

is_right()是否鼠标右键消息

mousemsg() 检测当前是否有鼠标消息,有鼠标消息返回 1否则返回 0

getmouse()获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待

mouse_msg msg={0};//初始化

if (mousemsg())用于检测有没有鼠标消息

msg = getmouse();

if (msgis_left()) //判断鼠标左键按下

if (msgis_right()) //判断鼠标右键按下

PIMAGE img ; //定义图像对象

img=newimage(100,50); //创建一个名为 img 的 PIMAGE 对象,尺寸为100x50

getimage(img, “/1jpg”,100, 100);//将读到图像对象,指定缩放宽度高度,0不缩放

getimage(img, 0, 0, 100, 100);

//从窗口中指定范围,抓取图像内容

putimage(200, 200, &img);

//贴图

delimage(img); //删除图像对象

功能:使用对话框让用户输入一个字符串

int inputbox_getline(LPCSTR  title, LPCSTR  text, LPSTR  buf, int len);

title对话框标题;

text对话框内显示的提示文字,可以使用'\n'或者'\t'进行格式控制。

buf用于接收输入的字符串指针,指向一个缓冲区;

len 缓冲区的大小,限制输入最大长度;

返回值:

返回1表示输入有效,buf中的内容为用户所输入的数据,返回0表示输入无效,同时buf清空。

keybd_event专门用于模仿键盘按键第二个:SendMessage根据窗口句柄发送一个消息给窗口函数定义:LRESULT

SendMessage(HWND

hWnd,UINT

Msg,WPARAM

wParam,LPARAM

IParam);第一个参数是窗口句柄,第二参数个是消息类型,下面的消息表列举了所有消息,第三,四个参数是消息附带信息,解释依赖于消息类型,比如一个字符消息(WM_CHAR),那么第三个参数就储存有一个字符的ASCII码。消息机制大家都应该知道吧,Windows是基于消息的系统,鼠标移动键盘按键都会产生消息。接下来举一个例子,发送一个WM_CHAR消息给窗口,也就是模仿键盘按键,接收消息的窗口依旧以"无标题txt

-

记事本"为例:SendMessage例子:模仿键盘按键#include<windowsh>int

main(){

HWND

wnd;

wnd=FindWindow(NULL,"无标题txt

-

记事本");while(1){SendMessage(wnd,WM_CHAR,WPARAM('a'),0);Sleep(300);}return

0;}呵呵上面的例子是不是没用,这是为什么呢,哪里出错了吗错倒是没有错,只是窗口句柄有问题,消息发送给了主窗口。接收消息的窗口不对。记事本窗口界面有些有什么东西呢菜单,编辑框,

状态栏等控件,控件也是窗口,既然是窗口,那当然它们也有窗口句柄,而在记事本里是在哪里打字的编辑框控件里打字的嘛!所以消息应该发送编辑框控件,那如何获得记事本里编辑框控件的窗口句柄呢用FindWindow吗不知道编辑框窗口标题名,类名也不知道,当然也有其它方法获取编辑框窗口标题名和窗口类名,如Spy++。关于如何获得编辑框句柄,将在以后的函数中会有介绍,这里我们就用WindowFromPoint这个函数来获取,这个函数获取窗口句柄的方法比较笨,(相对于我这个例子来说),这个函数是根据什么来获取窗口句柄的呢根据屏幕坐标点,如屏幕坐标点20,20,当前是哪个窗口占有,就返回哪个窗口的句柄。有了这个函数,我们还需要一个函数GetCursorPos获取鼠标当前位置(针对于屏幕);可行的例子:模仿键盘按键:#include<windowsh>int

main()

{

POINT

curpos;//一个可储存坐标点的结构体变量,x横坐标,y,纵坐标,如curposx

curposy

while(1)

{

GetCursorPos(&curpos);//获取当前鼠标的位置,位置将储存在curpos里。

HWND

hWnd

=

WindowFromPoint(curpos);//根据curpos所指的坐标点获取窗口句柄

SendMessage(hWnd,WM_CHAR,WPARAM('g'),0);//发送一个字符(按键)消息g给当前鼠标所指向的窗口句柄

Sleep(300);//睡眠三百毫秒,相当于等待三分之一秒

}

}这个程序一运行后,只要把鼠标指向要输入字符的窗口句柄,那么就相当于键盘每三分之一秒按了一个g键,试试吧!如果这样觉得模仿键盘按键太麻烦的话,那么就用keybd_event这个函数,这个专门用于模仿键盘按键的,关于怎么用,自己百度一搜,就知道了。既然SendMessage能模仿键盘按键的话,那也能模仿鼠标左击,右击。而此时SendMessage函数第三,四个参数的解释就是储存有鼠标左击,右击时的位置。如模仿鼠标右击,想一想,一次鼠标右击有哪几步,分别是鼠标右键按下,鼠标右键松开,如果你按下鼠标右键不松开,那它是不是鼠标右击,不是的,直到你松开鼠标右键,才能算是一次完整的鼠标右击鼠标右键按下的消息类型是“WM_RBUTTONDOWN”,右键松开的消息是“WM_RBUTTONUP”,那么一次完整的鼠标右击应该是:

SendMessage(wnd,WM_RBUTTONDOWN,0,0);//鼠标右键按下,第三,四个参数说明了鼠标按下时的位置

Sleep(100);//间隔100毫秒

SendMessage(wnd,WM_RBUTTONUP,0,0);//鼠标右键松开同样,也有一个专门模仿鼠标动作的函数,mouse_event这个函数,可以模仿鼠标的移动,单击,双击等。以后会有专门介绍。

这个在MSDN有明确说明,lParam的低字是x坐标,高字是y坐标,都是相对于客户区的。这个和vc,qt或者dev c++无关,这是 *** 作系统的约定

case WM_LBUTTONDOWN:

{

ptx = GET_X_LPARAM(lParam);

pty = GET_Y_LPARAM(lParam);

}

} break;

GetPixel函数可以得到指定坐标点的像素值。

函数功能:该函数检索指定坐标点的像素的RGB颜色值。

函数原型:COLORREF GetPixel(HDC hdc, int nXPos, int nYPos)

参数

hdc:设备环境句柄。

nXPos:指定要检查的像素点的逻辑X轴坐标。

nYPos:指定要检查的像素点的逻辑Y轴坐标。

返回值:返回值是该象像点的RGB值。如果指定的像素点在当前剪辑区之外;那么返回值是CLR_INVALID。

GetCursorPos函数可以得到当前鼠标的坐标点。

函数功能:该函数检取光标的位置,以屏幕坐标表示。

函数原型:BOOL GetCursorPos(LPPOINT lpPoint)。

参数

IpPoint:POINT结构指针,该结构接收光标的屏幕坐标。

通过Windows API 函数“HWND WindowFromPoint(POINT Point)”可以获取光标所在处的窗口的句柄。需要有一个触发消息来调用这个函数:比如按下键盘上的某个按键来触发这个函数调用。这是个简单的示范,能够模拟鼠标点击其他窗口的关闭按钮行为;要获得更完善的方案,可以给我私信。

具体 *** 作方法:运行程序,让后将鼠标指针移动至其他窗口之上,最好是在标题栏上;然后按下键盘上的任意按键(推荐按字母键)。

在VC++60“文件”菜单中,新建一个空的“Win32 AppLication”工程。然后新建一个cpp源文件,在源文件中写入如下代码:

#include <windowsh>

LRESULT CALLBACK WindowProc(HWND hdl_wnd, UINT msg_code, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)

{

 WNDCLASS wndcls;

 wndclscbClsExtra = 0;

 wndclscbWndExtra = 0;

 wndclshbrBackground = (HBRUSH)COLOR_BTNSHADOW;

 wndclshCursor = ::LoadCursor(NULL, IDC_ARROW);

 wndclshIcon = ::LoadIcon(NULL, IDI_APPLICATION);

 wndclshInstance = hInstance;

 wndclslpfnWndProc = WindowProc;

 wndclslpszClassName = "gethandle";

 wndclslpszMenuName = NULL;

 wndclsstyle = CS_VREDRAW | CS_HREDRAW;

 ::RegisterClass(&wndcls);

 ::CreateWindow("gethandle", "获取窗口句柄", WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, 200, 120, 400, 300, NULL, NULL, hInstance, 0);

 MSG msg;

 while (::GetMessage(&msg, NULL, 0, 0))

 {

   ::TranslateMessage(&msg);

   ::DispatchMessage(&msg);

 }

 return 1;

}

LRESULT CALLBACK WindowProc(HWND hdl_wnd, UINT msg_code, WPARAM wParam, LPARAM lParam)

{

 LRESULT value = 0;

 switch (msg_code)

 {

   case WM_CLOSE:

     ::PostQuitMessage(WM_QUIT);

   break;

    //注意:必须在本窗口获得键盘输入焦点的时候,WM_KEYDOWN消息才能生效!

    //如果想在本窗口没有焦点的时候都能生效,则需要安装全局的键盘钩子。

   case WM_KEYDOWN:

   {

     POINT pt;

     HWND hdl_other;

     ::GetCursorPos(&pt);  //获取鼠标指针的坐标

     hdl_other = ::WindowFromPoint(pt); //将该坐标传递给获取句柄的函数

     ::PostMessage(hdl_other, WM_CLOSE, 0, 0);  //用获取到的句柄,向目标窗口发送一个WM_CLOSE消息。WM_CLOSE消息相当于用户点击了窗口右上角的关闭按钮。

   }

   break;

   default:

   return ::DefWindowProc(hdl_wnd, msg_code, wParam, lParam);

 }

 return value;

}

SetCursorPos(); 这个函数是设置鼠标的屏幕位置。

先获取需要设置的点相对于窗口的位置。然后转换为屏幕坐标,再调用SetCursorPos函数,

假设窗口内某点位置为CPoint pt(X,Y);转换为屏幕坐标ClientToScreen(pt);之后用SetCursorPos(pt)即可

假设是用pciture控件显示。

那么可以先改变控件的ID,然后定义一个CSTATIC 类型的变量如m_ctrlPic。

先得到当前鼠标坐标:

CPoint point;

GetCursorPos( &point );

然后得到picture控件rect。

CRect rect;

::GetClientRect(m_ctrlPicGetSafeHwnd(), &rect);

然后把当前鼠标坐标转为相对于rect的坐标。

::ScreenToClient(m_ctrlPicGetSafeHwnd(), &point);

然后判断该点坐标是否在rect内,在就显示

if(rectPtInRect(point))

{

CString strPos;

strPosFormat("%d:%d", pointx, pointy);

AfxMessageBox(strPos);

}

}

以上就是关于C++ EGE 图形库 不完全整理全部的内容,包括:C++ EGE 图形库 不完全整理、vc++ sendmessage() key_event()如何使用、c++如何使用WM_LBUTTONDOWN来获取鼠标点击位置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9468445.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存