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 
#include 

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 
#include 
#include 

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. 直线样式
    easyX库颜色模型和颜色及样式设置相关函数(注释版)_第1张图片

  2. 端点样式
    easyX库颜色模型和颜色及样式设置相关函数(注释版)_第2张图片

  3. 连接样式
    easyX库颜色模型和颜色及样式设置相关函数(注释版)_第3张图片

//使用例子
#include 
#include 

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 
#include 

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取值
    easyX库颜色模型和颜色及样式设置相关函数(注释版)_第4张图片

  2. hatch取值
    easyX库颜色模型和颜色及样式设置相关函数(注释版)_第5张图片

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

//使用例子
#include 
#include 

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();

你可能感兴趣的:(开发语言,c语言)