C 语言学习 第十章 文件与图形(二)

easyx 库的安装教程: CLion、Dev-C++ 或 Code::Blocks 安装vscode 安装(别问我,VS 怎么安装)

上章入口:【C 语言学习 第十章 文件与图形(一)】

练习入口:【C 语言天罡三十六题】

  • 5. C 语言的图形程序设计

  •        用 C 语言来开发各种图形软件,是 C 语言的重要应用之一。无论多么复杂的图形,最终都归结为对诸如点、线、矩形和圆等简单图形的处理上。掌握了这些基本处理方法,就为进一步深入研究更复杂的图形处理打下了一定的基础。本节使用 easyx 库来介绍使用 C 语言开发基本图形软件的方法。(当然,easyx 库是 for C++ 的,您仅需要把 .c 文件改成 .cpp 文件,就可以正常使用了。如果您觉得别扭的话,可以使用 BC++3.1 for Dos 编译系统。函数有些类似,但和本文章讲的有所区别)
  •        C 语言中的图形的坐标与平时有所区别。如图 1,y轴是向下的。如果您想改变这种状态可以用 setorigin 和 setaspectratio 来改变。
    图 1
  • 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 指定了画线样式,该样式由直线样式、端点样式、连接样式三类组成。可以是其中一类或多类的组合。同一类型中只能指定一个样式。

    表 2:直线样式

    含义
    PS_SOLID线形为实线。
    PS_DASH线形为:------------
    PS_DOT线形为:············
    PS_DASHDOT线形为:-·-·-·-·-·-·
    PS_DASHDOTDOT线形为:-··-··-··-··
    PS_NULL线形为不可见。
    PS_USERSTYLE线形样式为用户自定义,由参数 puserstyle 和 userstylecount 指定。
    (宏 PS_STYLE_MASK 是直线样式的掩码,可以通过该宏从画线样式中分离出直线样式。)

    表 3:端点样式

    含义
    PS_ENDCAP_ROUND端点为圆形。
    PS_ENDCAP_SQUARE端点为方形。
    PS_ENDCAP_FLAT端点为平坦。
    (宏 PS_ENDCAP_MASK 是端点样式的掩码,可以通过该宏从画线样式中分离出端点样式。)

    表 4:连接样式

    含义
    PS_JOIN_BEVEL连接处为斜面。
    PS_JOIN_MITER连接处为斜接。
    PS_JOIN_ROUND连接处为圆弧。
    (宏 PS_JOIN_MASK 是连接样式的掩码,可以通过该宏从画线样式中分离出连接样式。)
  • 画直线相关函数:
    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_SOLID0固实填充。
    BS_NULL1不填充。
    BS_HATCHED2图案填充。
    BS_PATTERN3自定义图案填充。
    BS_DIBPATTERN5自定义图像填充。
     

    表 6:hatch

    含义
    HS_HORIZONTAL0 

    HS_VERTICAL1 

    HS_FDIAGONAL2 

    HS_BDIAGONAL3 

    HS_CROSS4 

    HS_DIAGCROSS5 

  • void floodfill(
    	int x,
    	int y,
    	COLORREF color,
    	int filltype = FLOODFILLBORDER
    );

           x——待填充区域内任意点的 x 坐标;
           y——待填充区域内任意点的 y 坐标;
           color——待填充的边界或区域的颜色。具体解释取决于参数 filltype 的值。
           filltype——要执行的填充操作的类型。

    表 7:filltype

    含义
    FLOODFILLBORDER0填充动作在颜色参数 color 围成的封闭区域内填充。
    FLOODFILLSURFACE1填充动作在颜色参数 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++ 语言编程》 周纯杰 何顶新 周凯波 彭刚 张惕远 编著 

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值