EasyX 图形库

窗口函数

closegragh();

关闭绘图窗口

cleardevice();

使用当前背景色来清口绘图设备(刷新)

initgragh(int width, int height [, int flag]);

–> 为 x 正方向

⬇ 为 y 正方向

flag 默认为 NULL , 可为以下值:

EW_DBLCLKS --> 在绘图窗口中支持鼠标双击事件

EW_NOCLOSE --> 禁用关闭按钮

EW_NOMINIMIZE --> 禁用最小化按钮

EW_SHOWCONSOLE --> 显示控制台窗口

其中,EW_ 可以省略,可用| 连接两个flag

_getch()

按任意键退出,需要包含<conion.h>头文件

关于设置颜色、模式、样式

背景相关函数
setbkcolor(color)

设置背景颜色,其中color可为指定颜色英文名,或者任意颜色的RGB表示,如(0, 0, 0)

#include<iostream>
#include<easyx.h>
#include<conio.h>

int main() {
	initgraph(640, 480, SW_SHOWNOACTIVATE);
	setbkcolor(LIGHTBLUE);
	cleardevice();

	setlinecolor(RED);
	rectangle(100, 100, 300, 300);

	_getch();
	closegraph();
	return 0;
}
setbkmode(mode)

设置图案文字背景模式,其中mode可为以下值:

OPAQUE --> 背景用当前背景色填充(默认)

TRANSPARENT --> 将背景透明化

填充相关函数
setfillcolor(color)

设置当前设备填充颜色

setfillstyle()
line线相关函数
setlinecolor(color)

设置线条颜色

setlinestyle(int style, int thickness [, ···])

设置线条样式,style可以是直线样式、端点样式、连接样式三类,或者是多类的组合

style是直线样式时,可以为以下值:

PS_SOLID线形为实线

PS_DASH线形为—

PS_DOT线形为······

PS_DASHDOT线形为-·-·-·-·-·

PS_DASHDOTDOT线形为-··-··-··-··

PS_NULL线形为不可见

图形绘制函数

圆 - circle相关

circle(int x, int y, int radius) 画无填充的圆

fillcircle(int x, int y, int radius) 画有边框的填充圆

solidcircle(int x, int y, int radius) 画无边框的填充圆

clearcircle(int x, int y, int radius) 以背景色清空圆形区域

矩形 - rectangle相关

rectangle(int left, int top, int right, int bottom) 画无填充矩形

fillrectangle(int left, int top, int right, int bottom) 画有边框的填充矩形

solidrectangle( int left, int top, int right, int bottom) 画无边框的填充矩形

clearrectangle( int left, int top, int right, int bottom) 以背景色清空矩形区域

椭圆 - ellipse 相关

椭圆外接矩形的左上角和右下角

ellipse( int left, int top, int right, int bottom)
fillellipse( int left, int top, int right, int bottom)
solidellipse( int left, int top, int right, int bottom)
clearellipse( int left, int top, int right, int bottom)

圆角矩形 - roundrec 相关

roundrect(int left,int top,int right,int bottom,int ellipsewidth,int ellipseheight)
fillroundrect(int left,int top,int right,int bottom,int ellipsewidth,int ellipseheight)
solidroundrect(int left,int top,int right,int bottom,int ellipsewidth,int ellipseheight)
clearroundrect(int left,int top,int right,int bottom,int ellipsewidth,int ellipseheight)

  • left:圆角矩形左部 x 坐标。

  • top:圆角矩形顶部 y 坐标。

  • right:圆角矩形右部 x 坐标。

  • bottom:圆角矩形底部 y 坐标。

  • ellipsewidth:构成圆角矩形的圆角的椭圆的宽度(x)。

  • ellipseheight:构成圆角矩形的圆角的椭圆的高度(y)。

文字绘制函数

outtextxy(int x,int y,LPCTSTR str)

在 (x, y) 位置输出字符串,str为待输出字符串的指针,且str需为char []类型

注意:默认情况下,输出字符串的背景会用当前背景色填充。使用函数setbkmode(TRANSPARENT)可以设置文字的背景部分保持透明或使用背景色填充。

settextcolor(color)

设置文本颜色

settextstyle
// 一般使用第一个
void settextstyle(
	int nHeight,//指定高度(逻辑单位)。
	int nWidth,//指定宽度
	LPCTSTR lpszFace//字体名称
);
void settextstyle(
	int nHeight,
	int nWidth,
	LPCTSTR lpszFace,
	int nEscapement,//字符串倾斜角度
	int nOrientation,//每个字符倾斜角度
	int nWeight,//字符的笔画粗细,范围 0~1000。0 表示默认粗细。
	bool bItalic,//是否斜体
	bool bUnderline,//是否下划线
	bool bStrikeOut//是否删除线
);
void settextstyle(
	int nHeight,
	int nWidth,
	LPCTSTR lpszFace,
	int nEscapement,
	int nOrientation,
	int nWeight,
	bool bItalic,
	bool bUnderline,
	bool bStrikeOut,
	BYTE fbCharSet,//指定字符集
	BYTE fbOutPrecision,//输出精度
	BYTE fbClipPrecision,//剪辑精度
	BYTE fbQuality,//输出质量
	BYTE fbPitchAndFamily//指定以常规方式描述字体的字体系列
);
void settextstyle(const LOGFONT *font);

nHeight:指定高度(逻辑单位)。
nWidth:字符的平均宽度(逻辑单位)。如果为 0,则比例自适应。
lpszFace:字体名称。

nEscapement:字符串的书写角度,单位 0.1 度。
nOrientation:每个字符的书写角度,单位 0.1 度。
nWeight:字符的笔画粗细,范围 0~1000。0 表示默认粗细。详见 LOGFONT 结构体。
bItalic:是否斜体。
bUnderline:是否有下划线。
bStrikeOut:是否有删除线。
fbCharSet:指定字符集。详见 LOGFONT 结构体。
fbOutPrecision:指定文字的输出精度。详见 LOGFONT 结构体。
fbClipPrecision:指定文字的剪辑精度。详见 LOGFONT 结构体。
fbQuality:指定文字的输出质量。详见 LOGFONT 结构体。
fbPitchAndFamily:指定以常规方式描述字体的字体系列。详见 LOGFONT 结构体。
font:指向 LOGFONT 结构体的指针

// 输出居中对齐的文字
#include<easyx.h>
#include<conio.h>
#include<iostream>

int main() {
	initgraph(640, 480, EX_SHOWCONSOLE);
	setbkcolor(LIGHTBLUE);
	setbkmode(TRANSPARENT);
	cleardevice();

	setfillcolor(BLUE);
	solidrectangle(250, 200, 400, 300);

	settextstyle(40, 0, "楷体");
	char s[] = "好的";
	int len = textwidth(s);
	int x = (150 - len) / 2 + 250, y = (100 - 40) / 2 + 200;
	outtextxy(x, y, "好的");

	_getch();
	return 0;
}

图像处理函数

loadimage
// 从图片文件获取图像(bmp/gif/jpg/png/tif/emf/wmf/ico)

// 一般用第一种

void loadimage(
	IMAGE* pDstImg,			// 保存图像的 IMAGE 对象指针
	LPCTSTR pImgFile,		// 图片文件名
	int nWidth = 0,			// 图片的拉伸宽度
	int nHeight = 0,		// 图片的拉伸高度
	bool bResize = false	// 是否调整 IMAGE 的大小以适应图片
);

// 从资源文件获取图像(bmp/gif/jpg/png/tif/emf/wmf/ico)
void loadimage(
	IMAGE* pDstImg,			// 保存图像的 IMAGE 对象指针
	LPCTSTR pResType,		// 资源类型
	LPCTSTR pResName,		// 资源名称
	int nWidth = 0,			// 图片的拉伸宽度
	int nHeight = 0,		// 图片的拉伸高度
	bool bResize = false	// 是否调整 IMAGE 的大小以适应图片
);

#include <graphics.h>
#include <conio.h>

// 主函数
int main()
{
	// 绘图窗口初始化
	initgraph(640, 480);

	// 读取图片至绘图窗口
	loadimage(NULL, _T("D:\\test.jpg"));

	// 按任意键退出
	_getch();
	closegraph();
}

putimage
// 绘制图像

// 一般用第一种

void putimage(
	int dstX,				// 绘制位置的 x 坐标
	int dstY,				// 绘制位置的 y 坐标
	IMAGE *pSrcImg,			// 要绘制的 IMAGE 对象指针
    
	DWORD dwRop = SRCCOPY	// 三元光栅操作码
);

// 绘制图像(指定宽高和起始位置)
void putimage(
	int dstX,				// 绘制位置的 x 坐标
	int dstY,				// 绘制位置的 y 坐标
	int dstWidth,			// 绘制的宽度
	int dstHeight,			// 绘制的高度
	IMAGE *pSrcImg,			// 要绘制的 IMAGE 对象指针
	int srcX,				// 绘制内容在 IMAGE 对象中的左上角 x 坐标
	int srcY,				// 绘制内容在 IMAGE 对象中的左上角 y 坐标
	DWORD dwRop = SRCCOPY	// 三元光栅操作码
);

// 将屏幕 (0,0) 起始的 100x100 的图像拷贝至 (200,200) 位置:
IMAGE img;
getimage(&img, 0, 0, 100, 100);
putimage(200, 200, &img);

消息处理函数

ExMessage - 消息结构体

定义如下

struct ExMessage
{
	USHORT message;					// 消息标识 --> 成员
	union
	{
		// 鼠标消息的数据
		struct
		{
			bool ctrl		:1;		// Ctrl 键是否按下
			bool shift		:1;		// Shift 键是否按下
			bool lbutton	:1;		// 鼠标左键是否按下
			bool mbutton	:1;		// 鼠标中键是否按下
			bool rbutton	:1;		// 鼠标右键
			short x;				// 鼠标的 x 坐标
			short y;				// 鼠标的 y 坐标
			short wheel;			// 鼠标滚轮滚动值,为 120 的倍数
		};

		// 按键消息的数据
		struct
		{
			BYTE vkcode;			// 按键的虚拟键码
			BYTE scancode;			// 按键的扫描码(依赖于 OEM)
			bool extended	:1;		// 按键是否是扩展键
			bool prevdown	:1;		// 按键的前一个状态是否按下
		};

		// 字符消息的数据
		TCHAR ch;

		// 窗口消息的数据
		struct
		{
			WPARAM wParam;
			LPARAM lParam;
		};
	};
};

成员:message,是消息标识,可以为以下值

在这里插入图片描述

左边是值,右边是值所属的消息类别,需要包含<graphics.h>库来判别消息类别

getmessage

用于获取一个消息,如果当前消息队列中没有,就一直等待。

ExMessage getmessage(BYTE filter = -1);
void getmessage(ExMessage *msg, BYTE filter = -1);

msg用来保存获取到的消息

filter指定获取消息的类别,默认-1获取所有类别的消息,也可以为以下值:

EM_MOUSE --> 鼠标消息

EM_KEY --> 键盘消息

EM_CHAR --> 字符消息

EM_WINDOW --> 窗口消息

返回值

重载 1 返回保存有消息 ExMessage 的结构体。

重载 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 处理完消息后,是否将其从消息队列中移除

一些使用实例

画图

如:画圆

#include<stdio.h>
#include<graphics.h>//图形库头文件
int main()
{
    //创建一个窗口,确定窗口大小
    //initgraph(1024,1024,SHOWCONSOLE | NOCLOSE | NOMINIMIZE);
    initgraph(3000, 3000,SHOWCONSOLE);
    //下面这两步不能换位置,不能缺少
    setbkcolor(WHITE);//设置背景颜色
    cleardevice();//清屏

    setfillcolor(RED);//设置填充颜色
    setlinecolor(BLUE);//设置线条颜色
    setlinestyle(PS_SOLID, 5);//设置线条样式:实心,粗度5像素
    //画圆
    circle(500, 50, 50);
    fillcircle(500,200,100);
    solidcircle(500,500,200);
    //关闭窗口
    getchar();
    closegraph();
    return 0;
}

在这里插入图片描述

文字
文字输出
//1,在字符串前面加上大写的 L
outtextxy(50, 50, L"我是一个小青蛙");
//2,用TEXT()把字符串包起来,_T()
outtextxy(50, 150, _T("我是一个小青蛙"));
//3,不需要添加任何代码,进项目->属性->配置属性->常规->字符集->改为多字节字符集推荐使用介个
outtextxy(50, 150, "我是一个小青蛙");
文字居中
#include<stdio.h>
#include<graphics.h>
int main()
{
    initgraph(1024, 1024, SHOWCONSOLE);
    setbkcolor(YELLOW);
    cleardevice();
    //先画一个粉色的圆角矩形
    setlinecolor(BLACK);//黑框
    setfillcolor(RGB(255, 210, 223));//粉底
    fillroundrect(100, 100, 400, 300, 50, 50);
    //设置文字样式
    settextstyle(25, 0, "楷体");//设置字体高度,宽度,字型
    setbkmode(TRANSPARENT);//设置字体背景透明,默认不透明
    settextcolor(BLUE);//蓝字

    //文字居中
    char arr[] = "我是一直小青蛙~";
    int x_buff = (300 - textwidth(arr)) / 2;//textwidth求字符串所占像素长度
    int y_buff = (200 - textheight(arr)) / 2;//textheight求字符串所占像素高度

    outtextxy(100 + x_buff, 100 + y_buff, arr);

    getchar();
    closegraph();
    return 0;
}

图像
#include<stdio.h>
#include<graphics.h>
int main()
{
    initgraph(1000, 1000, SHOWCONSOLE);
    setbkcolor(YELLOW);
    cleardevice();

    //输出图片
    IMAGE img1;//定义一个(变量)对象
    IMAGE img2;//定义一个(变量)对象
    loadimage(&img1, "C:\\Users\\LENOVO\\Desktop\\wallpaper\\xx.png",768,432);//绝对路径
    loadimage(&img2, "./oo.png",512,288);//相对路径: ./表示当前文件夹下,../表示答盎前文件夹的上一级目录
    putimage(0, 0, &img1);
    putimage(500, 500, &img2);
    getchar();
    closegraph();
    return 0;
}

图像有尾巴,背景消失

while里面渲染背景

背景闪烁不定

利用双缓冲

  • 双缓冲绘图,需要放在绘图代码之前和之后

  • BeginBatchDraw();开始批量绘图

  • ---------中间放绘图代码---------------

  • EndBatchDraw(); 结束批量绘制

FlushBatchDraw();//清空批量绘图

鼠标

#include<stdio.h>
#include<easyx.h>

void button(int x, int y, int w, int h,const char* text)
{

    setbkmode(TRANSPARENT);//设置字体背景透明
    setfillcolor(BROWN);//设置填充颜色
    fillroundrect(x,y,x+w,y+h,10,10);//设置按钮
    
    char text_[50] = {0};//按钮内容物
    strcpy(text_,text);//复制
    settextstyle(40,0,"黑体");
    int tx = x + (w-textwidth(text_))/2;
    int ty = y + (h-textheight(text_))/2;    
    outtextxy(tx,ty,text_);
}

int main ()
{
    initgraph(1000,1000,EW_SHOWCONSOLE);
    button(50,50,150,50,"按钮");
      
    ExMessage msg;
    while(1)
    {
        if(peekmessage(&msg, EM_MOUSE))//有鼠标消息返回真,没有返回假
        {
            switch(msg.message)
            {
                case WM_LBUTTONDOWN:
                    if(msg.x>=50&&msg.x<=50+150&&msg.y>=50&&msg.y<=50+150)
                    {
                        printf("哼哼,被左键点击了\n");
                    }
                    break;
                case WM_RBUTTONDOWN:
                    if(msg.x>=50&&msg.x<=50+150&&msg.y>=50&&msg.y<=50+150)
                    {
                        printf("哈哈哈,被右键点击了\n");
                    }
                    break;
                default:
                    break;
            }
        }
    }
    
    getchar();
    closegraph();
    return 0;
}

在这里插入图片描述

键盘

获取键盘消息的函数
getch()/_getch()

需要包含头文件<conio.h>

  • 上 --> 72
  • 下 --> 80
  • 左 --> 75
  • 右 --> 77
  • 如果是与字母比较直接写字母,如'A'
  • 返回char

char key = _getch();

GetAsyncKeyState(键值)
  • 上:VK_UP
  • 下:VK_DOWN
  • 左:VK_LEFT
  • 右:VK_RIGHT
  • 返回bool
  • 相比getch()可以进行斜上斜下,比较顺滑.

if(GetAsyncKeyState(VK_UP))

音乐操作

在这里插入图片描述

#include<stdio.h>
#include<graphics.h>
#include<mmsystem.h>//包含多媒体设备接口头文件,一定放在graphics.h下面
#pragma comment(lib,"winmm.lib")//加载静态库

void BGM()//播放音乐
{
    //打开音乐,播放音乐  alias取别名 repeat重复播放
    mcisendstring("open ./让我做你的眼睛.mp3 alias BGM",0,0,0);//向多媒体设备接口(mci)发送(send)一个字符串(string)
    mcisendstring("play BGM repeat",0,0,0);
    if(0)
    {
        mcisendstring("close BGM ",0,0,0);
    }
}
int main ()
{
    initgraph(600,600,SHOWCONSOLE);
    BGM();
    getchar();
    closegraph();
    return 0;
}

open指令打开需要播放的音乐,alias后面制定了前面文件路径的别名,以后想要操作这个文件直接使用这个别名就行了,后面的三个参数平时,就记着写作NULL0NULL即可。

第二条语句play指令后面接上面定义的别名,repeat表示歌曲循环播放

修改窗口标题、弹出对话框

在这里插入图片描述

#include<stdio.h>
#include<graphics.h>
#include<mmsystem.h>//包含多媒体设备接口头文件,一定放在graphics.h下面
#pragma comment(lib,"winmm.lib")//加载静态库

void change()
{
    //获取窗口句柄
    HWND hnd = GetHWnd();
    //设置窗口标题
    SetWindowText(hnd,"很高兴认识你");
    //弹出窗口,提示用户操作
    int is_ok = MessageBox(hnd,"我是消息框","要不要关闭我",MB_OKCANCEL);
    if(is_ok == IDOK)
    {
        printf("你点击了OK\n");
    }
    else if(is_ok == IDCANCEL)
    {
        printf("你点击了cancel\n");
    }
}
int main ()
{
    initgraph(600,600,SHOWCONSOLE);
    change();
    getchar();
    closegraph();
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值