page contents

C语言——图形库图形颜色及样式设置

C语言——图形库图形颜色及样式设置

一、FILLSTYLE

填充样式对象。

class FILLSTYLE();

公有成员:

int style;

填充形式,详细解释同 setfillstyle 函数重载的 style 参数。

long hatch;

填充图案样式,详细解释同 setfillstyle 函数重载的 hatch 参数。

IMAGE* ppattern;

填充图像,详细解释同 setfillstyle 函数重载的 ppattern 参数。

说明:

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

示例:

请参考 setfillstyle 函数中的示例。

二、getbkcolor

这个函数用于获取当前绘图背景色。

COLORREF getbkcolor();

参数:

(无)

返回值:

返回当前绘图背景色。

示例:

(无)

三、getbkmode

这个函数用于获取图案填充和文字输出时的背景模式。

int getbkmode();

参数:

(无)

返回值:

如果函数执行成功,返回值表示当前背景混合模式(OPAQUE 或 TRANSPARENT,详见 setbkmode 函数的参数)。如果函数执行失败,返回值为 0。

示例:

(无)

四、getfillcolor

这个函数用于获取当前的填充颜色。

COLORREF getfillcolor();

参数:

(无)

返回值:

返回当前的填充颜色。

示例:

(无)

请参阅:

setfillcolor getfillstyle setfillstyle

五、getfillstyle

这个函数用于获取当前填充样式。

void getfillstyle(
    FILLSTYLE* pstyle
);

参数:

pstyle

返回当前填充样式。详见 setfillstyle

返回值:

(无)

示例:

(无)

六、getlinecolor

这个函数用于获取当前画线颜色。

COLORREF getlinecolor();

参数:

(无)

返回值:

返回当前的画线颜色。

示例:

(无)

请参阅:

setlinecolor getlinestyle setlinestyle

七、getlinestyle

这个函数用于获取当前画线样式。

void getlinestyle(
    LINESTYLE* pstyle
);

参数:

pstyle

返回当前画线样式。详见 setlinestyle

返回值:

(无)

示例:

(无)

八、getpolyfillmode

这个函数用于获取当前多边形填充模式。

int getpolyfillmode();

参数:

(无)

返回值:

如果函数执行成功,返回值表示当前的多边形填充模式(ALTERNATE 或 WINDING,详见 setpolyfillmode 函数的参数)。如果函数执行失败,返回值为 0。

示例:

(无)

九、getrop2

这个函数用于获取前景的二元光栅操作模式。

int getrop2();

参数:

(无)

返回值:

二元光栅操作码,详见 setrop2 函数。

示例:

(无)

十、LINESTYLE

画线样式对象。

class LINESTYLE();

公有成员:

DWORD style;

画线样式,详细解释同 setlinestyle 函数重载的 style 参数。

DWORD thickness;

线的宽度,以像素为单位。

DWORD* puserstyle;

用户自定义样式数组,详细解释同 setlinestyle 函数重载的 puserstyle 参数

DWORD userstylecount;

用户自定义样式数组的元素数量。

说明:

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

示例:

请参考 setlinestyle 函数中的示例。

十一、setbkcolor

这个函数用于设置当前绘图背景色。

void setbkcolor(COLORREF color);

参数:

color

指定要设置的背景颜色。

返回值:

(无)

说明:

“背景色”是调色板绘图模式下的概念,所谓的背景色,是调色板中编号为 0 的颜色,可以通过修改编号 0 的颜色达到随时修改背景色的目的。在调色板模式下,显存中保存的是每种颜色在调色板中的编号。在 EasyX 中,已经废弃了调色板模式。

真彩色绘图模式下没有调色板,显存中直接保存每个点的颜色,没有背景色的概念。

EasyX 采用真彩色绘图模式,同时使用背景色,目的有两个:
1. 当文字背景不是透明时,指定文字的背景色。
2. 执行 cleardevice() 或 clearcliprgn() 时,使用该颜色清空屏幕或裁剪区。

示例:

以下示例实现在蓝色背景下绘制红色的矩形:

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

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

	// 设置背景色为蓝色
	setbkcolor(BLUE);
	// 用背景色清空屏幕
	cleardevice();

	// 设置绘图色为红色
	setcolor(RED);
	// 画矩形
	rectangle(100, 100, 300, 300);

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

十二、setbkmode

这个函数用于设置图案填充和文字输出时的背景模式。

void setbkmode(int mode);

参数:

mode

指定图案填充和文字输出时的背景模式,可以是以下值:

OPAQUE 背景用当前背景色填充(默认)。
TRANSPARENT 背景是透明的。

返回值:

(无)

示例:

(无)

十三、setfillcolor

这个函数用于设置当前的填充颜色。

void setfillcolor(COLORREF color);

参数:

color

填充颜色。

返回值:

(无)

示例:

设置蓝色填充:

setfillcolor(BLUE);

请参阅:

getfillcolor getfillstyle setfillstyle

十四、setfillstyle

这个函数用于设置当前填充样式。

void setfillstyle(
    FILLSTYLE* pstyle
);
void setfillstyle(
    int style,
    long hatch = NULL,
    IMAGE* ppattern = NULL
);
void setfillstyle(
    BYTE* ppattern8x8
);

参数:

pstyle

指向填充样式 FILLSTYLE 的指针。

style

指定填充样式。可以是以下宏或值:

BS_SOLID 0 固实填充。
BS_NULL 1 不填充。
BS_HATCHED 2 图案填充。
BS_PATTERN 3 自定义图案填充。
BS_DIBPATTERN 5 自定义图像填充。

hatch

指定填充图案,仅当 style 为 BS_HATCHED 时有效。填充图案的颜色由函数 setfillcolor 设置,背景区域使用背景色还是保持透明由函数 setbkmode 设置。hatch 参数可以是以下宏或值:

HS_HORIZONTAL 0  
HS_VERTICAL 1  
HS_FDIAGONAL 2  
HS_BDIAGONAL 3  
HS_CROSS 4  
HS_DIAGCROSS 5  

ppattern

指定自定义填充图案或图像,仅当 style 为 BS_PATTERN 或 BS_DIBPATTERN 时有效。

当 style 为 BS_PATTERN 时,ppattern 指向的 IMAGE 对象表示自定义填充图案,IMAGE 中的黑色(BLACK)对应背景区域,非黑色对应图案区域。图案区域的颜色由函数 settextcolor 设置。

当 style 为 BS_DIBPATTERN 时,ppattern 指向的 IMAGE 对象表示自定义填充图像,以该图像为填充单元实施填充。

ppattern8x8

指定自定义填充图案,效果同 BS_PATTERN,该重载以 BYTE[8] 数组定义 8 x 8 区域的填充图案。数组中,每个元素表示一行的样式,BYTE 类型有 8 位,按位从高到低表示从左到右每个点的状态,由此组成 8 x 8 的填充单元,将填充单元平铺实现填充。对应的二进制位为 0 表示背景区域,为 1 表示图案区域。

返回值:

(无)

示例:

以下局部代码设置固实填充:

setfillstyle(BS_SOLID);

以下局部代码设置填充图案为斜线填充:

setfillstyle(BS_HATCHED, HS_BDIAGONAL);

以下局部代码设置自定义图像填充(由 res\\bk.jpg 指定填充图像):

IMAGE img;
loadimage(&img, _T("res\\bk.jpg"));
setfillstyle(BS_DIBPATTERN, NULL, &img);

以下完整代码设置自定义的填充图案(小矩形填充),并使用该图案填充一个三角形:

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

int main()
{
	// 创建绘图窗口
	initgraph(640, 480);

	// 定义填充单元
	IMAGE img(10, 8);

	// 绘制填充单元
	SetWorkingImage(&img);	// 设置绘图目标为 img 对象
	setbkcolor(BLACK);		// 黑色区域为背景色
	cleardevice();
	setfillcolor(WHITE);	// 白色区域为自定义图案
	solidrectangle(1, 1, 8, 5);
	SetWorkingImage(NULL);	// 恢复绘图目标为默认绘图窗口

	// 设置填充样式为自定义填充图案
	setfillstyle(BS_PATTERN, NULL, &img);

	// 设置自定义图案的填充颜色
	settextcolor(GREEN);

	// 绘制无边框填充三角形
	POINT pts[] = { {50, 50}, {50, 200}, {300, 50} };
	solidpolygon(pts, 3);

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

以下局部代码设置自定义的填充图案(圆形图案填充):

setfillstyle((BYTE*)"\x3e\x41\x80\x80\x80\x80\x80\x41");

以下局部代码设置自定义的填充图案(细斜线夹粗斜线图案填充):

setfillstyle((BYTE*)"\x5a\x2d\x96\x4b\xa5\xd2\x69\xb4");

十五、setlinecolor

这个函数用于设置当前画线颜色。

void setlinecolor(COLORREF color);

参数:

color

要设置的画线颜色。

返回值:

(无)

示例:

(无)

请参阅:

getlinecolor getlinestyle setlinestyle

十六、setlinestyle

这个函数用于设置当前画线样式。

void setlinestyle(
    const LINESTYLE* pstyle
);
void setlinestyle(
    int style,
    int thickness = 1,
    const DWORD *puserstyle = NULL,
    DWORD userstylecount = 0
);

参数:

pstyle

指向画线样式 LINESTYLE 的指针。

style

画线样式,由直线样式、端点样式、连接样式三类组成。可以是其中一类或多类的组合。同一类型中只能指定一个样式。

直线样式可以是以下值:

PS_SOLID 线形为实线。
PS_DASH 线形为:------------
PS_DOT 线形为:············
PS_DASHDOT 线形为:-·-·-·-·-·-·
PS_DASHDOTDOT 线形为:-··-··-··-··
PS_NULL 线形为不可见。
PS_USERSTYLE 线形样式为用户自定义,由参数 puserstyle 和 userstylecount 指定。

宏 PS_STYLE_MASK 是直线样式的掩码,可以通过该宏从画线样式中分离出直线样式。

端点样式可以是以下值:

PS_ENDCAP_ROUND 端点为圆形。
PS_ENDCAP_SQUARE 端点为方形。
PS_ENDCAP_FLAT 端点为平坦。

宏 PS_ENDCAP_MASK 是端点样式的掩码,可以通过该宏从画线样式中分离出端点样式。

连接样式可以是以下值:

PS_JOIN_BEVEL 连接处为斜面。
PS_JOIN_MITER 连接处为斜接。
PS_JOIN_ROUND 连接处为圆弧。

宏 PS_JOIN_MASK 是连接样式的掩码,可以通过该宏从画线样式中分离出连接样式。

thickness

线的宽度,以像素为单位。

puserstyle

用户自定义样式数组,仅当线型为 PS_USERSTYLE 时该参数有效。

数组第一个元素指定画线的长度,第二个元素指定空白的长度,第三个元素指定画线的长度,第四个元素指定空白的长度,以此类推。

userstylecount

用户自定义样式数组的元素数量。

返回值:

(无)

说明:

掩码宏表示对应样式组所占用的所有位。例如,对于一个已经混合了多种样式的 style 变量,如果希望仅将直线样式修改为点划线,可以这么做:

style = (style & ~PS_STYLE_MASK) | PS_DASHDOT;

示例:

以下局部代码设置画线样式为点划线:

setlinestyle(PS_DASHDOT);

以下局部代码设置画线样式为宽度 3 像素的虚线,端点为平坦的:

setlinestyle(PS_DASH | PS_ENDCAP_FLAT, 3);

以下局部代码设置画线样式为宽度 10 像素的实线,连接处为斜面:

setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 10);

以下局部代码设置画线样式为自定义样式(画 5 个像素,跳过 2 个像素,画 3 个像素,跳过 1 个像素……),端点为平坦的:

DWORD a[4] = {5, 2, 3, 1};
setlinestyle(PS_USERSTYLE | PS_ENDCAP_FLAT, 1, a, 4);

十七、setpolyfillmode

这个函数用于设置当前多边形填充模式。

void setpolyfillmode(int mode);

参数:

mode

指定多边形填充模式,可以是以下值:

ALTERNATE 交替填充模式(默认值)。
在该模式中,对于每条水平扫描线,从左向右逐像素扫描,当遇到多边形的奇数条边时,开始填充;当遇到偶数条边时,停止填充。
例如五角星,五条边多次相交,采用 ALTERNATE 模式填充时,中心的五边形不被填充。
WINDING 根据绘图方向填充的模式。
在该模式中,对于每条水平扫描线,从左向右逐像素扫描,当遇到多边形的奇数条边时,开始填充;当遇到偶数条边时,需要进一步根据穿过该扫描线的边的方向判断:如果从上向下穿越扫描线的边数和从下向上穿越扫描线的边数不同,则开始填充,边数相同,则停止填充。
例如五角星,五条边多次相交,采用 WINDING 模式填充时,中心的五边形会被填充。

返回值:

(无)

说明:

该设置影响 fillpolygonsolidpolygonclearpolygon 三个绘制多边形函数的执行效果。

示例:

请参见 solidpolygon 函数的示例。

十八、setrop2

这个函数用于设置前景的二元光栅操作模式。

void setrop2(int mode);

参数:

mode

二元光栅操作码。该函数支持全部的 16 种二元光栅操作码,罗列如下:

R2_BLACK 绘制出的像素颜色 = 黑色
R2_COPYPEN 绘制出的像素颜色 = 当前颜色(默认)
R2_MASKNOTPEN 绘制出的像素颜色 = 屏幕颜色 AND (NOT 当前颜色)
R2_MASKPEN 绘制出的像素颜色 = 屏幕颜色 AND 当前颜色
R2_MASKPENNOT 绘制出的像素颜色 = (NOT 屏幕颜色) AND 当前颜色
R2_MERGENOTPEN 绘制出的像素颜色 = 屏幕颜色 OR (NOT 当前颜色)
R2_MERGEPEN 绘制出的像素颜色 = 屏幕颜色 OR 当前颜色
R2_MERGEPENNOT 绘制出的像素颜色 = (NOT 屏幕颜色) OR 当前颜色
R2_NOP 绘制出的像素颜色 = 屏幕颜色
R2_NOT 绘制出的像素颜色 = NOT 屏幕颜色
R2_NOTCOPYPEN 绘制出的像素颜色 = NOT 当前颜色
R2_NOTMASKPEN 绘制出的像素颜色 = NOT (屏幕颜色 AND 当前颜色)
R2_NOTMERGEPEN 绘制出的像素颜色 = NOT (屏幕颜色 OR 当前颜色)
R2_NOTXORPEN 绘制出的像素颜色 = NOT (屏幕颜色 XOR 当前颜色)
R2_WHITE 绘制出的像素颜色 = 白色
R2_XORPEN 绘制出的像素颜色 = 屏幕颜色 XOR 当前颜色

注:
1. AND / OR / NOT / XOR 为布尔运算。
2. "屏幕颜色"指绘制所经过的屏幕像素点的颜色。
3. "当前颜色"是指将要绘制的颜色。

返回值:

(无)

说明:

该函数设置的二元光栅操作码仅影响线条和填充(包括 IMAGE 填充)的输出,不影响文字和 IMAGE 的输出。

示例:

(无)

  • 发表于 2021-10-06 16:38
  • 阅读 ( 3894 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小威
小威

64 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章