赞
踩
本次我给您带了easyX库系列的颜色模型和样式设置的相关函数,希望您能看得开心。
函数或数据类型 | 描述 |
---|---|
LINESTYLE | 画线样式对象。 |
FILLSTYLE | 填充样式对象。 |
setbkcolor | 设置当前设备绘图背景色。 |
setlinecolor | 设置当前设备画线颜色。 |
setlinestyle | 设置当前设备画线样式。 |
setfillcolor | 设置当前设备填充颜色。 |
setfillstyle | 设置当前设备填充样式。 |
setpolyfillmode | 设置当前设备多边形填充模式。 |
setbkmode | 设置当前设备图案填充和文字输出时的背景模式。 |
setrop2 | 设置当前设备二元光栅操作模式。 |
getbkcolor | 获取当前设备背景色。 |
getlinecolor | 获取当前设备画线颜色。 |
getlinestyle | 获取当前设备画线样式。 |
getpolyfillmode | 获取当前设备多边形填充模式。 |
getfillcolor | 获取当前设备填充颜色。 |
getfillstyle | 获取当前设备填充样式。 |
getbkmode | 获取当前设备图案填充和文字输出时的背景模式。 |
getrop2 | 获取当前设备二元光栅操作模式。 |
结合我们之前提到的颜色模型:RGB模型、HSL模型、HSV模型,本次我们来看看有关颜色模型的操作。
COLORREF RGB(
BYTE byRed, // 颜色的红色部分
BYTE byGreen, // 颜色的绿色部分
BYTE byBlue // 颜色的蓝色部分
);
//参数
//byRed:颜色的红色部分,取值范围:0~255
//byGreen:颜色的绿色部分,取值范围:0~255
//byBlue:颜色的蓝色部分,取值范围:0~255
//返回值
//返回合成的颜色
COLORREF BGR(COLORREF color);
//参数
//color:需要交换红色和蓝色的颜色
//返回值
//返回交换红色和蓝色后的颜色
BYTE GetRValue(COLORREF rgb);//GetRValue宏在Windows SDK中定义
BYTE GetGValue(COLORREF rgb);//GetGValue宏在Windows SDK中定义
BYTE GetBValue(COLORREF rgb);//GetBValue宏在Windows SDK中定义
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。
//返回值
//无
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
//返回值
//无
COLORREF RGBtoGRAY(
COLORREF rgb
);
//参数
//rgb:原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颜色
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颜色
下面两个对象都是使用C++的关键字class实现的,class可以理解为是升级版的struct,easyX库中两个对象都有暴露出几个公有成员供我们使用,其具体用法,等后面使用的时候再说。
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;
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;
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(); }
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(); }
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可以使用“|”符号组合多种类型的样式,但是每一类的样式只能使用一个,其取值如下表格:
直线样式
端点样式
连接样式
//使用例子 #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(); }
这个函数还有一些讲不清楚的,等以后我们再回来讲解(等整个系列到达末尾,我会重新回来复习这些似懂非懂的地方)
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(); }
多边形除了设置填充颜色,还有一些填充样式有时也是我们所需要的,设置填充样式的函数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表示图案区域。
style取值
hatch取值
对于两个奇怪的参数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; }
为避免混淆,这个函数先不管了,以后再来研究。
为避免混淆,这个函数先不管了,以后再来研究。
为避免混淆,这个函数先不管了,以后再来研究。
COLORREF getbkcolor();
COLORREF getlinecolor();
void getlinestyle( LINESTYLE* pstyle );
COLORREF getfillcolor();
void getfillstyle( FILLSTYLE* pstyle );
int getpolyfillmode();
int getbkmode();
int getrop2();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。