<<<上一篇—③:EasyX函数-颜色模型
①:安装及基本概念
②:EasyX函数-设备相关
③:EasyX函数-颜色模型
④:EasyX函数-图形样式
文章目录
- 系列文章
- 前言
- 五、图像对象 - IMAGE
- 六、填充样式对象 - FILLSTYLE
- 七、画线样式对象 - LINESTYLE
- 八、EasyX函数 之 图形样式
- Ⅰ.背景
- ⅰ.背景颜色
- α.设置背景颜色 - setbkcolor()
- β.获取背景颜色 - getbkcolor()
- α.设置背景颜色 - setbkcolor()
- ⅱ.背景模式
- α.设置背景模式 - setbkmode()
- β.获取背景模式 - getbkmode()
- α.设置背景模式 - setbkmode()
- ⅰ.背景颜色
- Ⅱ.绘图模式
- ⅰ.填充颜色
- α.设置填充颜色 - setfillcolor()
- β.获取填充颜色 - getfillcolor()
- α.设置填充颜色 - setfillcolor()
- ⅱ.填充样式
- α.设置填充样式 - setfillstyle()
- β.获取填充样式 - getfillstyle()
- α.设置填充样式 - setfillstyle()
- ⅲ.画线颜色
- α.设置画线颜色 - setlinecolor()
- β.获取画线颜色 - getlinecolor()
- α.设置画线颜色 - setlinecolor()
- ⅳ.画线样式
- α.设置画线样式 - setlinestyle()
- β.获取画线样式 - getlinestyle()
- α.设置画线样式 - setlinestyle()
- ⅴ.多边形样式
- α.设置多边形填充样式 - setpolyfillmode()
- β.获取多边形样式 - getpolyfillmode()
- α.设置多边形填充样式 - setpolyfillmode()
- ⅵ.二元光栅
- α.获取二元光栅操作模式 - getrop2()
- β.设置二元光栅操作模式 - setrop2()
- α.获取二元光栅操作模式 - getrop2()
- 结语
前言
作者也是个小白,本【教程】充其量算个学习笔记,若有写的不正确的地方还请指教。
- 类定义:
class IMAGE(int _width = 0, int _height = 0);
- 类原型:
//IMAGE在easyx.h中的定义 class IMAGE { public: int getwidth() const; // 获取对象的宽度 int getheight() const; // 获取对象的高度 private: ... public: IMAGE(int _width = 0, int _height = 0); // 创建图像 IMAGE(const IMAGE &img); // 拷贝构造函数 IMAGE& operator = (const IMAGE &img); // 赋值运算符重载函数 virtual ~IMAGE(); virtual void Resize(int _width, int _height); // 调整尺寸 }; - 公有成员:
- i n t g e t w i d t h ( ) ; intspace getwidth(); int getwidth(); - 获取 IMAGE 对象的宽度,以像素为单位:
public : int IMAGE::getwidth() const
- i n t g e t h e i g h t ( ) ; intspace getheight(); int getheight(); - 获取 IMAGE 对象的高度,以像素为单位:
public : int IMAGE::getheight() const
- o p e r a t o r = operator= operator= :重载运算符=,实现IMAGE赋值。该操作仅拷贝源图像的内容,不拷贝源图像的绘图窗口:
public : IMAGE & IMAGE::operator=(const IMAGE img)
-
类定义:
class FILLSTYLE();
-
类原型:
//FILLSTYLE在easyx.h中的定义 class FILLSTYLE { public: FILLSTYLE(); FILLSTYLE(const FILLSTYLE &style); FILLSTYLE& operator = (const FILLSTYLE &style); // 赋值运算符重载函数 virtual ~FILLSTYLE(); int style; // 填充形式 long hatch; // 填充图案样式 IMAGE* ppattern; // 填充图像 }; -
公有成员:
- int s t y l e style style - 填充形式。
- long h a t c h hatch hatch - 填充图案样式。仅当 s t y l e style style=BS_HATCHED时有效。
- IMAGE* p p a t t e r n ppattern ppattern - 填充图像或图案。仅当 s t y l e style style=BS_PATTERN或BS_DIBPATTERN时有效。
-
说明:
s t y l e style style可以是以下宏(值):宏 值 含义 BS_SOLID 0 固实填充。 BS_NULL 1 不填充。 BS_HATCHED 2 图案填充(见 h a t c h hatch hatch)。 BS_PATTERN 3 自定义图案填充(见 p p a t t e r n ppattern ppattern)。 BS_DIBPATTERN 5 自定义图像填充(见 p p a t t e r n ppattern ppattern)。 h a t c h hatch hatch可以是以下宏(值):
宏 值 含义 HS_HORIZONTAL 0 HS_VERTICAL 1 HS_FDIAGONAL 2 HS_BDIAGONAL 3 HS_CROSS 4 HS_DIAGCROSS 5 p p a t t e r n ppattern ppattern:
- 当 s t y l e style style=BS_PATTERN时, p p a t t e r n ppattern ppattern指向的IMAGE为填充图案,其中BLACK对于背景,非BLACK对于图案。
- 当
s
t
y
l
e
style
style=BS_DIBPATTERN时,
p
p
a
t
t
e
r
n
ppattern
ppattern指向的IMAGE为填充图像,以其为填充单元填充。
使用方法见下 setfillstyle()。
七、画线样式对象 - LINESTYLE
-
类定义:
class LINESTYLE();
-
类原型:
//LINESTYLE在easyx.h中的定义 class LINESTYLE { public: LINESTYLE(); LINESTYLE(const LINESTYLE &style); LINESTYLE& operator = (const LINESTYLE &style); // 赋值运算符重载函数 virtual ~LINESTYLE(); DWORD style; DWORD thickness; DWORD *puserstyle; DWORD userstylecount; }; -
公有成员:
- DWORD s t y l e space style style - 画线样式。
- DWORD t h i c k n e s s space thickness thickness - 线宽,以像素为单位。
- DWORD* p u s e r s t y l e puserstyle puserstyle - 自定义样式数组,仅当 s t y l e style style为PS_USERSTYLE时有效。
- DWORD u s e r s t y l e c o u n t userstylecount userstylecount - 自定义数组个数,仅当 s t y l e style style=PS_USERSTYLE时有效。
-
说明:
s t y l e style style,指定了画线样式,该样式由 **直线样式** 、 **端点样式** 、**连接样式** 三类组成。可以是其中一类或多类的组合。同一类型中只能指定一个样式。
直线样式 可为:
值 含义 PS_SOLID 线形为实线:— PS_DASH 线形为:------------ PS_DOT 线形为:············ PS_DASHDOT 线形为:-·-·-·-·-·-· PS_DASHDOTDOT 线形为:-··-··-··-·· PS_NULL 线形为不可见。 PS_USERSTYLE 线形样式为用户自定义,见 p u s e r s t y l e puserstyle puserstyle参数 宏 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 是连接样式的掩码,可以通过该宏从画线样式中分离出连接样式。
掩码宏表示对应样式组所占用的所有位。例如,对于一个已经混合了多种样式的 style 变量,如果想仅从其中将直线样式改为点划线,只需:style = (style & ~PS_STYLE_MASK) | PS_DASHDOT; ,,,,...};
-
实例:
DWORD a[5]={5,4,1,9,7}; LINESTYLE s; s.style=PS_USERSTYLE; s.thickness=1; s.puserstyle=a; s.userstylecount=5; setlinestyle(s);//总之就是设置样式 /* 这段代码会是线段样式为: * 粗细为1, * 画5(像素)留空 4 ,再画 1 空 9 ,再画 7 ,(重复)画 5 ... * / -
注:DWORD即unsigned long:
typedef unsigned long DWORD;
八、EasyX函数 之 图形样式
- Ⅰ.背景
- ⅰ.背景颜色
α.设置背景颜色 - setbkcolor()
作用:设置设备背景色。
函数原型:
void setbkcolor(COLORREF color);
参数:
- COLORREF c o l o r color color:设置的背景色。(COLORREF见①,EasyX中的颜色,即unsigned long:
typedef unsigned long DWORD; typedef DWORD COLORREF;
)
β.获取背景颜色 - getbkcolor()
返回值: /
注:setbkcolor()后不会改变背景色,只有在下一次执行绘图指令时才会改变,因此,使用cleardevice()【用背景色清空设备】在设置背景色后。
作用:获取当前设备背景色。
函数原型:
COLORREF getbkcolor();
参数: /
返回值:当前设备背景色。
- ⅱ.背景模式
α.设置背景模式 - setbkmode()
作用:设置当前设备图案填充和文字输出时的背景模式。
函数原型:
void setbkmode(int mode);
参数:
- int
m
o
d
e
mode
mode :指定图案填充和文字输出时的背景模式,可以是以下值:
值 描述 OPAQUE 背景用当前背景色填充(默认)。即使用特定填充颜色作为所绘物体背景。 TRANSPARENT 背景是透明的。即还是原来背景。
返回值: /
β.获取背景模式 - getbkmode()
作用:获取当前设备图案填充和文字输出时的背景模式。
函数原型:
int getbkmode();
参数: /
返回值: int,如果函数执行成功,返回值表示当前设备背景混合模式,值为 OPAQUE 或 TRANSPARENT。如果函数执行失败,返回值为 0。
- int
m
o
d
e
mode
mode :指定图案填充和文字输出时的背景模式,可以是以下值:
- ⅰ.背景颜色
- Ⅱ.绘图模式
- ⅰ.填充颜色 α.设置填充颜色 - setfillcolor()
作用:设置当前设备填充颜色。
函数原型:
void setfillcolor(COLORREF color);
参数:
- COLORREF
c
o
l
o
r
color
color:填充颜色。
返回值: /
实例:设置背景色为蓝色:
setfillcolor(BLUE);
β.获取填充颜色 - getfillcolor()
作用:获取当前设备填充颜色。
函数原型:
COLORREF getfillcolor();
参数: /
返回值: COLORREF,当前设备填充颜色。
- COLORREF
c
o
l
o
r
color
color:填充颜色。
- ⅱ.填充样式 α.设置填充样式 - setfillstyle()
作用:设置当前设备填充样式。
函数原型:
void setfillstyle( FILLSTYLE* pstyle );
void setfillstyle( int style, long hatch = NULL, IMAGE* ppattern = NULL );
void setfillstyle( BYTE* ppattern8x8 );
参数:
- FILLSTYLE*
p
s
t
y
l
e
pstyle
pstyle:指向填充样式的指针(见 <六>)
- { i n t s t y l e l o n g h a t c h I M A G E ∗ p p a t t e r n begin{cases} intspace style\ longspace hatch\ {rm{IMAGE*}}space ppattern end{cases} ⎩⎪⎨⎪⎧int stylelong hatchIMAGE∗ ppattern相当于将一个pstyle拆开写了,作用一致。
- BYTE* p p a t t e r n 8 x 8 ppattern8x8 ppattern8x8:指定自定义填充图案,效果同 BS_PATTERN,该重载以 BYTE[8] 数组定义 8 x 8 区域的填充图案。数组中,每个元素表示一行的样式,BYTE 类型有 8 位,按位从高到低表示从左到右每个点的状态,由此组成 8 x 8 的填充单元,将填充单元平铺实现填充。对应的二进制位为 0 表示背景区域,为 1 表示图案区域。
返回值: /
β.获取填充样式 - getfillstyle()
作用:获取当前设备填充样式。
函数原型:
void getfillstyle( FILLSTYLE* pstyle );
参数:
- FILLSTYLE*
p
s
t
y
l
e
pstyle
pstyle:返回填充样式
返回值: /
- FILLSTYLE*
p
s
t
y
l
e
pstyle
pstyle:指向填充样式的指针(见 <六>)
- ⅲ.画线颜色
α.设置画线颜色 - setlinecolor()
作用:设置当前设备画线颜色。
函数原型:
void setlinecolor(COLORREF color);
参数:
- COLORREF
c
o
l
o
r
color
color:要设置的画线颜色。
返回值: /
β.获取画线颜色 - getlinecolor()
作用:获取当前设备画线颜色。
函数原型:
COLORREF getlinecolor();
参数: /
返回值: COLORREF,当前设备画线颜色。
- COLORREF
c
o
l
o
r
color
color:要设置的画线颜色。
- ⅳ.画线样式
α.设置画线样式 - setlinestyle()
作用:设置当前设备画线样式。
函数原型:
void setlinestyle( const LINESTYLE* pstyle );
void setlinestyle( int style, int thickness = 1, const DWORD *puserstyle = NULL, DWORD userstylecount = 0 );
参数:
- const LINESTYLE*
p
s
t
y
l
e
pstyle
pstyle:指向画线样式的指针(见<七>)
- { i n t s t y l e i n t t h i c k n e s s c o n s t D W O R D ∗ p u s e r s t y l e D W O R D u s e r s t y l e c o u n t begin{cases} intspace style\ intspace thickness\ constspace{rm{DWORD*}}space puserstyle\ {rm DWORD}space userstylecount end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧int styleint thicknessconst DWORD∗ puserstyleDWORD userstylecount相当于将LINESTYLE分开写。(见<七>)
返回值: /
β.获取画线样式 - getlinestyle()
作用:获取当前设备画线样式。
函数原型:
void getlinestyle( LINESTYLE* pstyle );
参数:
- LINESTYLE*
p
s
t
y
l
e
pstyle
pstyle:指针,返回当前画线样式。
返回值: /
- const LINESTYLE*
p
s
t
y
l
e
pstyle
pstyle:指向画线样式的指针(见<七>)
- ⅴ.多边形样式
α.设置多边形填充样式 - setpolyfillmode()
作用:设置当前设备多边形填充模式。
函数原型:
void setpolyfillmode(int mode);
参数:
- int
m
o
d
e
mode
mode:多边形填充样式,可为:
A L T E R N A T E ALTERNATE ALTERNATE 交替填充模式(默认值)。在该模式中,对于每条水平扫描线,从左向右逐像素扫描,当遇到多边形的奇数条边时,开始填充;当遇到偶数条边时,停止填充。例如五角星,五条边多次相交,采用 ALTERNATE 模式填充时,中心的五边形不被填充。
W I N D I N G WINDING WINDING 根据绘图方向填充的模式。在该模式中,对于每条水平扫描线,从左向右逐像素扫描,当遇到多边形的奇数条边时,开始填充;当遇到偶数条边时,需要进一步根据穿过该扫描线的边的方向判断:如果从上向下穿越扫描线的边数和从下向上穿越扫描线的边数不同,则开始填充,边数相同,则停止填充。例如五角星,五条边多次相交,采用 WINDING 模式填充时,中心的五边形会被填充。
返回值: /
β.获取多边形样式 - getpolyfillmode()
注:该设置影响 fillpolygon、solidpolygon、clearpolygon 三个绘制多边形函数的执行效果。
作用:获取当前设备多边形填充模式。
函数原型:
int getpolyfillmode();
参数:/
返回值: int,如果函数执行成功,返回值表示当前设备多边形填充模式,值为 ALTERNATE 或 WINDING.如果函数执行失败,返回值为 0。
- int
m
o
d
e
mode
mode:多边形填充样式,可为:
- ⅵ.二元光栅
α.获取二元光栅操作模式 - getrop2()
作用:获取当前设备二元光栅操作模式。
函数原型:
int getrop2();
参数:/
返回值: int,当前设备二元光栅操作码,详见 setrop2 函数。
β.设置二元光栅操作模式 - setrop2()
作用:设置当前设备二元光栅操作模式。
函数原型:
void setrop2(int mode);
返回值: /
参数:
int m o d e mode mode:二元光栅操作码。该函数支持全部的 16 种二元光栅操作码,如下:1 , 2
值 描述 R2_BLACK 绘制出的像素颜色 = 黑色 R2_COPYPEN 绘制出的像素颜色 = 当前颜色(默认) R2_MASKNOTPEN 绘制出的像素颜色 = 屏幕颜色 & ( ! 当前颜色) R2_MASKPEN 绘制出的像素颜色 = 屏幕颜色 & 当前颜色 R2_MASKPENNOT 绘制出的像素颜色 = ( ! 屏幕颜色) & 当前颜色 R2_MERGENOTPEN 绘制出的像素颜色 = 屏幕颜色 | ( ! 当前颜色) R2_MERGEPEN 绘制出的像素颜色 = 屏幕颜色 | 当前颜色 R2_MERGEPENNOT 绘制出的像素颜色 = ( ! 屏幕颜色) | 当前颜色 R2_NOP 绘制出的像素颜色 = 屏幕颜色 R2_NOT 绘制出的像素颜色 = ! 屏幕颜色 R2_NOTCOPYPEN 绘制出的像素颜色 = ! 当前颜色 R2_NOTMASKPEN 绘制出的像素颜色 = ! (屏幕颜色 & 当前颜色) R2_NOTMERGEPEN 绘制出的像素颜色 = ! (屏幕颜色 | 当前颜色) R2_NOTXORPEN 绘制出的像素颜色 = ! (屏幕颜色 ^ 当前颜色) R2_WHITE 绘制出的像素颜色 = 白色 R2_XORPEN 绘制出的像素颜色 = 屏幕颜色 ^ 当前颜色 - ⅰ.填充颜色 α.设置填充颜色 - setfillcolor()
结语
精力、时间有限,先写到这,下期见!
@HaohaoCppDebuger|寻兰
2021/11/4
THANK YOU !
注:
1 . [ & ]表示与,[ | ]表示或,[ ! ]表示非,[ ^ ]表示异或
2 . [ 背景颜色 ] 指绘制时经过的像素点的颜色
3 . [ 当前颜色 ] 指将绘制的颜色(setfillcolor(),setlinecolor(),setpolyfillcolor()) ↩︎注:该函数设置的二元光栅操作码仅影响线条和填充(包括 IMAGE 填充)的输出,不影响文字和 IMAGE 的输出。 ↩︎



