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来获取鼠标点击位置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)