easyX库颜色模型和颜色及样式设置相关函数(注释版)

0.颜色模型和颜色及样式设置相关函数概览

本次我给您带了easyX库系列的颜色模型和样式设置的相关函数,希望您能看得开心。

函数或数据类型描述
LINESTYLE画线样式对象。
FILLSTYLE填充样式对象。
setbkcolor设置当前设备绘图背景色。
setlinecolor设置当前设备画线颜色。
setlinestyle设置当前设备画线样式。
setfillcolor设置当前设备填充颜色。
setfillstyle设置当前设备填充样式。
setpolyfillmode设置当前设备多边形填充模式。
setbkmode设置当前设备图案填充和文字输出时的背景模式。
setrop2设置当前设备二元光栅操作模式。
getbkcolor获取当前设备背景色。
getlinecolor获取当前设备画线颜色。
getlinestyle获取当前设备画线样式。
getpolyfillmode获取当前设备多边形填充模式。
getfillcolor获取当前设备填充颜色。
getfillstyle获取当前设备填充样式。
getbkmode获取当前设备图案填充和文字输出时的背景模式。
getrop2获取当前设备二元光栅操作模式。

1.颜色模型

结合我们之前提到的颜色模型:RGB模型、HSL模型、HSV模型,本次我们来看看有关颜色模型的操作。

1.0.RGB宏

1.0.1.RGB:通过红、绿、蓝颜色分量合成颜色

COLORREF RGB(
	BYTE byRed,		// 颜色的红色部分
	BYTE byGreen,	// 颜色的绿色部分
	BYTE byBlue		// 颜色的蓝色部分
);
//参数
//byRed:颜色的红色部分,取值范围:0~255
//byGreen:颜色的绿色部分,取值范围:0~255
//byBlue:颜色的蓝色部分,取值范围:0~255

//返回值
//返回合成的颜色

1.0.2.BGR:交换颜色中的红色和蓝色

COLORREF BGR(COLORREF color);
//参数
//color:需要交换红色和蓝色的颜色

//返回值
//返回交换红色和蓝色后的颜色

1.1.提取RGB颜色

1.1.1.GetRValue:返回指定颜色中的红色值

BYTE GetRValue(COLORREF rgb);//GetRValue宏在Windows SDK中定义

1.1.2.GetGValue:返回指定颜色中的绿色值

BYTE GetGValue(COLORREF rgb);//GetGValue宏在Windows SDK中定义

1.1.3.GetBValue:返回指定颜色中的蓝色值

BYTE GetBValue(COLORREF rgb);//GetBValue宏在Windows SDK中定义

1.2.RGB转化为HSL、HSV、GRAY

1.2.1.RGBtoHSL:转换RGB颜色为HSL颜色

void RGBtoHSL(
	COLORREF rgb,
	float *H,
	float *S,
	float *L
);
//参数
//rgb:原RGB颜色
//H用于返回HSL颜色模型的Hue(色相)分量,0 <= H < 360
//S用于返回HSL颜色模型的Saturation(饱和度)分量,0 <= S <= 1
//L用于返回HSL颜色模型的Lightness(亮度)分量,0 <= L <= 1。

//返回值
//无

2.2.2.RGBtoHSV:转换RGB颜色为HSV颜色

void RGBtoHSV(
	COLORREF rgb,
	float *H,
	float *S,
	float *V
);
//参数
//rgb:原RGB颜色。
//H用于返回HSV颜色模型的Hue(色相)分量,0 <= H < 360
//S用于返回HSV颜色模型的Saturation(饱和度)分量,0 <= S <= 1
//V用于返回HSV颜色模型的Value(明度)分量,0 <= V <= 1

//返回值
//无

1.2.3.RGBtoGRAY:转换RGB颜色为GAY灰度颜色

COLORREF RGBtoGRAY(
	COLORREF rgb
);
//参数
//rgb:原RGB颜色

//返回值
//对应的灰度颜色

1.3.HSL、HSV转化为RGB

1.3.1.HSLtoRGB:转换HSL颜色为RGB颜色

COLORREF HSLtoRGB(
	float H,
	float S,
	float L
);
//参数
//H:原HSL颜色模型的Hue(色相)分量,0 <= H < 360
//S:原HSL颜色模型的Saturation(饱和度)分量,0 <= S <= 1
//L:原HSL颜色模型的Lightness(亮度)分量,0 <= L <= 1

//返回值
//对应的RGB颜色

1.3.2.HSVtoRGB:转换HSV颜色为RGB颜色

COLORREF HSVtoRGB(
	float H,
	float S,
	float V
);
//参数
//H:原HSV颜色模型的Hue(色相)分量,0 <= H < 360
//S:原HSV颜色模型的Saturation(饱和度)分量,0 <= S <= 1
//V:原HSV颜色模型的Value(明度)分量,0 <= V <= 1

//返回值
//对应的RGB颜色

2.颜色及样式设置相关函数

2.1.两个对象

下面两个对象都是使用C++的关键字class实现的,class可以理解为是升级版的struct,easyX库中两个对象都有暴露出几个公有成员供我们使用,其具体用法,等后面使用的时候再说。

2.1.1.LINESTYLE:画线样式对象

class LINESTYLE();
//公有成员
//DWORD style:画线样式,详见setlinestyle函数的style参数
//DWORD thickness:线的宽度,以像素为单位
//DWORD* puserstyle:用户自定义样式数组,详见setlinestyle函数的puserstyle参数
//DWORD userstylecount:用户自定义样式数组的元素数量

//备注
//参数的详细含义及使用方法请参考setlinestyle函数

如果您没学过C++,可以暂时使用struct来理解,当然这种理解并不够严谨。

typedef struct LINESTYLE
{
	DWORD style;//画线样式,详见setlinestyle函数的style参数 
    DWORD thickness;//线的宽度,以像素为单位 
    DWORD* puserstyle;//用户自定义样式数组,详见setlinestyle函数的puserstyle参数 
  	DWORD userstylecount;//用户自定义样式数组的元素数量
  	……
}LINESTYLE;

2.1.2.FILLSTYLE:填充样式对象

class FILLSTYLE();
//公有成员
//int style:填充形式,详见setfillstyle函数重载的style参数
//long hatch:填充图案样式,详见setfillstyle函数重载的hatch参数
//IMAGE* ppattern:填充图像,详见setfillstyle函数重载的ppattern参数

//备注
//参数的详细含义及使用方法请参考setfillstyle函数

如果您没学过C++,可以暂时使用struct来理解,当然这种理解并不够严谨。

typedef struct FILLSTYLE
{
	int style;//填充形式,详见setfillstyle函数重载的style参数
	long hatch;//填充图案样式,详见setfillstyle函数重载的hatch参数
	IMAGE* ppattern;//填充图像,详见setfillstyle函数重载的ppattern参数
  	……
}FILLSTYLE;

2.2.设置颜色和样式

2.2.1.setbkcolor:设置当前设备背景色

void setbkcolor(COLORREF color);
//参数
//color指定要设置的背景颜色

//返回值
//无

注意这里的设置设备背景色,并不是立刻改变此时的背景颜色,而是改变此时背景色的值。再次刷新绘画设备更新背景时才会真正换背景颜色。例如:在使用outtextxy()或者cleardevice()时(前者是在绘画区域指定的地方输出字符串。后者之前有讲过,是用来清除屏幕内容的。)

//使用例子
#include <graphics.h>
#include <cstdio>

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

	// 设置背景色为蓝色
	setbkcolor(BLUE);
	getchar();

	// 用背景色清空屏幕
	cleardevice();
	getchar();

	// 设置背景色为红色
	setbkcolor(RED);
	getchar();

	// 用背景色清空屏幕
	cleardevice();
	getchar();

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

2.2.2.setlinecolor:设置当前设备画线颜色

void setlinecolor(COLORREF color);

只有使用setlinecolor()提前设置好线条的颜色,才能使用不同颜色的线条。

//使用例子
#include <graphics.h>
#include <conio.h>
#include <cstdio>

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

	// 设置背景色为蓝色
	setbkcolor(BLUE);
	getchar();

	// 用背景色清空屏幕
	cleardevice();
	getchar();

	// 设置绘图色为绿色
	setlinecolor(GREEN);
	// 画矩形
	rectangle(100, 100, 300, 300);
	getchar();

	// 设置背景色为红色
	setbkcolor(RED);
	getchar();

	// 用背景色清空屏幕
	cleardevice();
	getchar();

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

2.2.3.setlinestyle:设置当前设备画线样式

void setlinestyle(
	const LINESTYLE* pstyle
);
//参数
//pstyle:指向画线样式LINESTYLE的指针
//返回值
//无

void setlinestyle(
	int style,
	int thickness = 1,
	const DWORD *puserstyle = NULL,
	DWORD userstylecount = 0
);
//style:画线样式(详见下面的三个表格)
//thickness:线的宽度,以像素为单位,默认值为1
//puserstyle:用户自定义样式数组,仅当线型为PS_USERSTYLE时该参数有效。
	//数组第一个元素指定画线的长度
	//第二个元素指定空白的长度
	//第三个元素指定画线的长度
	//第四个元素指定空白的长度,以此类推……
//userstylecount:用户自定义样式数组的元素数量

需要注意的是setlinestyle()有重载版本(即,上面两个函数定义都是setlinestyle()的定义,这是C++的特性,是C所没有的)

其中对于参数style的不同值指定了不同的画线样式:直线样式、端点样式、连接样式。k可以使用“|”符号组合多种类型的样式,但是每一类的样式只能使用一个,其取值如下表格:

  1. 直线样式
    在这里插入图片描述

  2. 端点样式
    在这里插入图片描述

  3. 连接样式
    在这里插入图片描述

//使用例子
#include <graphics.h>
#include <cstdio>

int main()
{
	// 初始化绘图窗口
	initgraph(640, 480, EX_SHOWCONSOLE);
	getchar();

	// 设置背景色为蓝色
	setbkcolor(BLUE);
	getchar();

	// 用背景色清空屏幕
	cleardevice();
	getchar();

	// 设置线的样式和颜色
	setlinecolor(RED);
	setlinestyle(PS_DASH ,2);
	getchar();

	// 画圆
	circle(100, 100, 50);
	getchar();
 
  	// 设置线的样式和颜色
	setlinecolor(RED);
	DWORD a[4] = { 10, 40, 30, 20 };
	setlinestyle(PS_USERSTYLE | PS_ENDCAP_FLAT, 5, a, 4);
	getchar();

	// 画圆
	circle(250, 250, 150);
	getchar();

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

这个函数还有一些讲不清楚的,等以后我们再回来讲解(等整个系列到达末尾,我会重新回来复习这些似懂非懂的地方)

2.2.4.setfillcolor:设置当前设备填充颜色

void setfillcolor(COLORREF color);

有的时候我们不单单只是使用线条构图,还有的时候需要使用封闭的多边形组合为一个形状,这个时候这些多边形可能就需要填充对应的颜色,有关多边形的绘制我们以后再提及,这里只是进行了简单的使用。

//使用例子
#include <graphics.h>
#include <cstdio>

int main()
{
	// 初始化绘图窗口
	initgraph(640, 480, EX_SHOWCONSOLE);
	getchar();

	// 设置背景色为蓝色
	setbkcolor(BLUE);
	getchar();

	// 用背景色清空屏幕
	cleardevice();
	getchar();

	// 设置线条颜色和样式
	setlinecolor(YELLOW);
	DWORD a[4] = { 10, 40, 30, 20 };
	setlinestyle(PS_USERSTYLE | PS_ENDCAP_FLAT, 5, a, 4);
	getchar();

	// 设置填充颜色
	setfillcolor(RED);
	getchar();

	// 画实心圆
	fillcircle(200, 200, 100);
	getchar();

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

2.2.5.setfillstyle:设置当前设备填充样式

多边形除了设置填充颜色,还有一些填充样式有时也是我们所需要的,设置填充样式的函数setfillstyle()也有几个重载函数。

void setfillstyle(
	FILLSTYLE* pstyle
);
//pstyle:指向填充样式 FILLSTYLE 的指针。

void setfillstyle(
	int style,
	long hatch = NULL,
	IMAGE* ppattern = NULL
);
//style:指定填充样式,取值详见下面的表格
//hatch:指定填充图案,仅当style为BS_HATCHED时有效。填充图案的颜色由函数setfillcolor设置,背景区域使用背景色还是保持透明由函数setbkmode设置,取值详见下面的表格
//ppattern:指定自定义填充图案或图像,仅当style为BS_PATTERN或BS_DIBPATTERN时有效。当style为BS_PATTERN时,ppattern指向的IMAGE对象表示自定义填充图案,IMAGE中的黑色(BLACK)对应背景区域,非黑色对应图案区域。图案区域的颜色由函数settextcolor设置。当style为BS_DIBPATTERN时,ppattern指向的IMAGE对象表示自定义填充图像,以该图像为填充单元实施填充。

void setfillstyle(
	BYTE* ppattern8x8
);
//ppattern8x8:指定自定义填充图案,效果同BS_PATTERN,该重载以BYTE[8]数组定义8 x 8区域的填充图案。数组中,每个元素表示一行的样式,BYTE类型有8位,按位从高到低表示从左到右每个点的状态,由此组成8 x 8的填充单元,将填充单元平铺实现填充。对应的二进制位为0表示背景区域,为1表示图案区域。
  1. style取值
    在这里插入图片描述

  2. hatch取值
    在这里插入图片描述

  3. 对于两个奇怪的参数ppattern和ppattern8x8。这两个参数我也没搞懂,以后再来细细研究把……

//使用例子
#include <graphics.h>
#include <cstdio>

int main()
{
    // 初始化图形窗口
    initgraph(640, 480, EX_SHOWCONSOLE);
    getchar();

    // 绘制红色矩形并使用默认填充模式填充
    setfillcolor(RED);
    setfillstyle(BS_HATCHED, HS_VERTICAL);
    fillrectangle(100, 100, 200, 200);
    getchar();

    // 绘制蓝色圆形并使用自定义填充样式填充
    setfillcolor(BLUE);
    setfillstyle(BS_HATCHED, HS_HORIZONTAL);
    fillcircle(350, 150, 50);
    getchar();

    // 等待用户按键并关闭图形窗口
    closegraph();
    getchar();
    return 0;
}

2.2.6.setpolyfillmode:设置当前设备多边形填充模式

为避免混淆,这个函数先不管了,以后再来研究。

2.2.7.setbkmode:设置当前设备图案填充和文字输出时的背景模式

为避免混淆,这个函数先不管了,以后再来研究。

2.2.8.setrop2:设置当前设备二元光栅操作模式

为避免混淆,这个函数先不管了,以后再来研究。

2.3.获取颜色和样式

2.3.1.getbkcolor:获取当前设备背景色

COLORREF getbkcolor();

2.3.2.getlinecolor:获取当前设备画线颜色

COLORREF getlinecolor();

2.3.3.getlinestyle:获取当前设备画线样式

void getlinestyle( LINESTYLE* pstyle );

2.3.4.getfillcolor:获取当前设备填充颜色

COLORREF getfillcolor();

2.3.5.getfillstyle:获取当前设备填充样式

void getfillstyle( FILLSTYLE* pstyle );

2.3.6.getpolyfillmode:获取当前设备多边形填充模式

int getpolyfillmode();

2.3.7.getbkmode:获取当前设备图案填充和文字输出时的背景模式

int getbkmode();

2.3.8.getrop2:获取当前设备二元光栅操作模式

int getrop2();
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

limou3434

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值