easyx 库的安装教程: CLion、Dev-C++ 或 Code::Blocks 安装、vscode 安装
(别问我,VS 怎么安装)练习入口:【C 语言天罡三十六题】
-
5. C 语言的图形程序设计
- 用 C 语言来开发各种图形软件,是 C 语言的重要应用之一。无论多么复杂的图形,最终都归结为对诸如点、线、矩形和圆等简单图形的处理上。掌握了这些基本处理方法,就为进一步深入研究更复杂的图形处理打下了一定的基础。本节使用 easyx 库来介绍使用 C 语言开发基本图形软件的方法。(当然,easyx 库是 for C++ 的,您仅需要把 .c 文件改成 .cpp 文件,就可以正常使用了。如果您觉得别扭的话,可以使用 BC++3.1 for Dos 编译系统。函数有些类似,但和本文章讲的有所区别)
- C 语言中的图形的坐标与平时有所区别。如图 1,y轴是向下的。如果您想改变这种状态可以用 setorigin 和 setaspectratio 来改变。
-
6. C 语言的图形函数
- 在使用图形函数时,需要包含头文件 graphics.h 。
-
6.1 初始化图形系统:initgraph 函数
-
HWND initgraph( int width, int height, int flag = NULL );
初始化图形系统。
width——绘图窗口的宽度;height——绘图窗口的高度;flag——绘图窗口的样式,默认为 NULL。表 1:flag
值 含义 EX_DBLCLKS 在绘图窗口中支持鼠标双击事件。 EX_NOCLOSE 禁用绘图窗口的关闭按钮。 EX_NOMINIMIZE 禁用绘图窗口的最小化按钮。 EX_SHOWCONSOLE 显示控制台窗口。 -
6.2 关闭图形系统:closegraph 函数
-
void closegraph();
关闭图形系统。
-
6.3 设置画笔当前颜色及屏幕背景色
-
void setcolor(COLORREF color);
设置画笔当前颜色。
color——画笔颜色。
设置画笔当前颜色。等效于连续执行 easyx.h 中的 setlinecolor 和 settextcolor 函数。 -
void setbkcolor(COLORREF color);
设置背景当前颜色。
color——背景颜色。
在设置背景色之后,并不会改变现有背景色,而是只改变背景色的值,之后再执行绘图语句,例如 outtextxy,会使用新设置的背景色值。如果需要修改全部背景色,可以在设置背景色后执行 cleardevice() 函数。 -
6.4 画点及获取屏幕屏幕点的颜色
-
void putpixel( int x, int y, COLORREF color );
画点。
x——点的 x 坐标;y——点的 y 坐标;color——画点的颜色。 -
COLORREF getpixel( int x, int y );
获取点的颜色。
x——点的 x 坐标;y——点的 y 坐标。 -
6.5 设置线型及画直线
-
void setlinestyle( const LINESTYLE* pstyle ); void setlinestyle( int style, int thickness = 1, const DWORD *puserstyle = NULL, DWORD userstylecount = 0 );
设置线型。
pstyle——指向画线样式 LINESTYLE 的指针;
style——画线样式(详见备注);
thickness——线的宽度,以像素为单位;
puserstyle——用户自定义样式数组,仅当线型为 PS_USERSTYLE 时该参数有效。数组第一个元素指定画线的长度,第二个元素指定空白的长度,第三个元素指定画线的长度,第四个元素指定空白的长度,以此类推。
userstylecount——用户自定义样式数组的元素数量。 -
备注:
参数 style 指定了画线样式,该样式由直线样式、端点样式、连接样式三类组成。可以是其中一类或多类的组合。同一类型中只能指定一个样式。
(宏 PS_STYLE_MASK 是直线样式的掩码,可以通过该宏从画线样式中分离出直线样式。)表 2:直线样式
值 含义 PS_SOLID 线形为实线。 PS_DASH 线形为:------------ PS_DOT 线形为:············ PS_DASHDOT 线形为:-·-·-·-·-·-· PS_DASHDOTDOT 线形为:-··-··-··-·· PS_NULL 线形为不可见。 PS_USERSTYLE 线形样式为用户自定义,由参数 puserstyle 和 userstylecount 指定。
(宏 PS_ENDCAP_MASK 是端点样式的掩码,可以通过该宏从画线样式中分离出端点样式。)表 3:端点样式
值 含义 PS_ENDCAP_ROUND 端点为圆形。 PS_ENDCAP_SQUARE 端点为方形。 PS_ENDCAP_FLAT 端点为平坦。
(宏 PS_JOIN_MASK 是连接样式的掩码,可以通过该宏从画线样式中分离出连接样式。)表 4:连接样式
值 含义 PS_JOIN_BEVEL 连接处为斜面。 PS_JOIN_MITER 连接处为斜接。 PS_JOIN_ROUND 连接处为圆弧。 - 画直线相关函数:
void line( int x1, int y1, int x2, int y2 );
画直线。
x1——直线的起始点的 x 坐标;y1——直线的起始点的 y 坐标;x2——直线的终止点的 x 坐标;y2——直线的终止点的 y 坐标。void moveto( int x, int y );
移动当前点。 有些绘图操作会从“当前点”开始,这个函数可以设置该点。还可以用 moverel 设置当前点。(不画直线)
x——新的当前点 x 坐标;y——新的当前点 y 坐标。void lineto( int x, int y );
画直线。还可以用 line 和 linerel 画直线。
x——目标点的 x 坐标(从“当前点”开始画直线);y——目标点的 y 坐标(从“当前点”开始画直线)。 -
6.6 画园、椭圆、矩形及多边形
-
void circle( int x, int y, int radius );
使用当前画线样式绘制无填充的圆。
x——圆心 x 坐标;y——圆心 y 坐标;radius——圆的半径。void ellipse( int left, int top, int right, int bottom );
使用当前画线样式绘制无填充的椭圆。
left——椭圆外切矩形的左上角 x 坐标;
top——椭圆外切矩形的左上角 y 坐标;
right——椭圆外切矩形的右下角 x 坐标;
bottom——椭圆外切矩形的右下角 y 坐标。void rectangle( int left, int top, int right, int bottom );
使用当前画线样式绘制无填充的矩形。
left——矩形左部 x 坐标;
top——矩形顶部 y 坐标;
right——矩形右部 x 坐标;
bottom——矩形底部 y 坐标。void drawpoly( int numpoints, const int *polypoints );
使用当前画线样式绘制无填充的多边形。
numpoints——多边形顶点的个数;
polypoints——每个点的坐标,数组元素个数为 numpoints * 2。该函数会自动连接多边形首尾。
(该函数已废弃,仅在 graphics.h 中声明,推荐使用 polygon 替代该函数。) -
6.7 填充图形函数
-
void setfillcolor(COLORREF color);
设置当前设备填充颜色。
color——填充颜色。void setfillstyle( FILLSTYLE* pstyle ); void setfillstyle( int style, long hatch = NULL, IMAGE* ppattern = NULL ); void setfillstyle( BYTE* ppattern8x8 );
设置当前设备填充样式。
pstyle——指向填充样式 FILLSTYLE 的指针;
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 对象表示自定义填充图像,以该图像为填充单元实施填充。
ppattern8x8——指定自定义填充图案,效果同 BS_PATTERN,该重载以 BYTE[8] 数组定义 8 x 8 区域的填充图案。数组中,每个元素表示一行的样式,BYTE 类型有 8 位,按位从高到低表示从左到右每个点的状态,由此组成 8 x 8 的填充单元,将填充单元平铺实现填充。对应的二进制位为 0 表示背景区域,为 1 表示图案区域。表 5:style
宏 值 含义 BS_SOLID 0 固实填充。 BS_NULL 1 不填充。 BS_HATCHED 2 图案填充。 BS_PATTERN 3 自定义图案填充。 BS_DIBPATTERN 5 自定义图像填充。 表 6:hatch
宏 值 含义 HS_HORIZONTAL 0 HS_VERTICAL 1 HS_FDIAGONAL 2 HS_BDIAGONAL 3 HS_CROSS 4 HS_DIAGCROSS 5 -
void floodfill( int x, int y, COLORREF color, int filltype = FLOODFILLBORDER );
x——待填充区域内任意点的 x 坐标;
y——待填充区域内任意点的 y 坐标;
color——待填充的边界或区域的颜色。具体解释取决于参数 filltype 的值。
filltype——要执行的填充操作的类型。表 7:filltype
宏 值 含义 FLOODFILLBORDER 0 填充动作在颜色参数 color 围成的封闭区域内填充。 FLOODFILLSURFACE 1 填充动作在颜色参数 color 指定的连续颜色表面填充。 - 其他相关函数:
不水文字了,这里给每个函数的链接。
bar 填充矩形。
fillpoly 填充多边形。
fillellipse 填充椭圆。
pie 圆形扇形。
arc 椭圆扇形。 -
7. 图形方式下的文本存在函数
-
7.1 图形方式下的文字输出
-
void settextcolor(COLORREF color);
设置当前文字颜色。
color——要设置的文字颜色。void settextstyle( int nHeight, int nWidth, LPCTSTR lpszFace );
设置当前文字样式。
nHeight——指定高度(逻辑单位);nWidth——字符的平均宽度(逻辑单位)。如果为 0,则比例自适应;lpszFace——字体名称。
当然,这只是重载中的一个。若想要看其他重载可以点击这里。(绝对不是我懒,我只是怕您感到疲倦) -
7.2 屏幕图形的保存和恢复
-
void getimage( IMAGE* pDstImg, // 保存图像的 IMAGE 对象指针 int srcX, // 要获取图像区域左上角 x 坐标 int srcY, // 要获取图像区域的左上角 y 坐标 int srcWidth, // 要获取图像区域的宽度 int srcHeight // 要获取图像区域的高度 );
从当前绘图设备获取图像
pDstImg——保存图像的 IMAGE 对象指针;
srcX——要获取图像区域的左上角 x 坐标;
srcY——要获取图像区域的左上角 y 坐标;
srcWidth——要获取图像区域的宽度;
srcHeight——要获取图像区域的高度。void putimage( int dstX, // 绘制位置的 x 坐标 int dstY, // 绘制位置的 y 坐标 IMAGE *pSrcImg, // 要绘制的 IMAGE 对象指针 DWORD dwRop = SRCCOPY // 三元光栅操作码 ); // 绘制图像(指定宽高和起始位置) void putimage( int dstX, // 绘制位置的 x 坐标 int dstY, // 绘制位置的 y 坐标 int dstWidth, // 绘制的宽度 int dstHeight, // 绘制的高度 IMAGE *pSrcImg, // 要绘制的 IMAGE 对象指针 int srcX, // 绘制内容在 IMAGE 对象中的左上角 x 坐标 int srcY, // 绘制内容在 IMAGE 对象中的左上角 y 坐标 DWORD dwRop = SRCCOPY // 三元光栅操作码
表 8:三元光栅操作码(常用)
值 含义 DSTINVERT 目标图像 = NOT 目标图像 MERGECOPY 目标图像 = 源图像 AND 当前填充颜色 MERGEPAINT 目标图像 = 目标图像 OR (NOT 源图像) NOTSRCCOPY 目标图像 = NOT 源图像 NOTSRCERASE 目标图像 = NOT (目标图像 OR 源图像) PATCOPY 目标图像 = 当前填充颜色 PATINVERT 目标图像 = 目标图像 XOR 当前填充颜色 PATPAINT 目标图像 = 目标图像 OR ((NOT 源图像) OR 当前填充颜色) SRCAND 目标图像 = 目标图像 AND 源图像 SRCCOPY 目标图像 = 源图像 SRCERASE 目标图像 = (NOT 目标图像) AND 源图像 SRCINVERT 目标图像 = 目标图像 XOR 源图像 SRCPAINT 目标图像 = 目标图像 OR 源图像
参考书籍:《C Primer Plus》【美】 Stephen Prata 著
《程序设计教程 用 C/C++ 语言编程》 周纯杰 何顶新 周凯波 彭刚 张惕远 编著