win32 7.2 绘制图形 - 绘制图形

GDI图形绘制函数主要由绘制线条和填充区域两大类。绘制线条函数以当前画笔绘制线条;绘制填充区域函数以
当前画笔绘制边线,并以当前画刷填充中间的区域。
  1. 绘制线条
    1. 函数大体了解:
      绘制线条的函数有画直线的LineTo,画多条直线的 Polyline 和 Polylineto,画贝塞尔曲线的PolyBezier 和 PolyBezerto,画弧线的 Arc 和 ArcTo。
    2. 当前点:
      1. 介绍:DC的数据结构中有一个“当前点”,LineTo函数就是从当前点画一条直线到参数中指定的一点,并把参数中指定的点设置为新的当前点。画线函数中所有以To结尾的函数都是从当前点来绘制的。而其余函数则和当前点没有关系,也不会影响当前点的位置。
      2. 设置当前点:可以用 MoveToEx 函数设置当前点
        在这里插入图片描述
        lpPoint 指向一个空的 POINT 结构体,用来返回原来的当前点设置,如果不需要,这个参数可以设置成NULL。
      3. 获取当前点坐标:
        在这里插入图片描述
    3. 绘制一条线的方法:
      要绘制一条线,必须配合 MoveToEx 和 LineTo 函数(注意,画线没有 Line 这个函数,必须用当 当前点),用 MoveToex 函数设置一个当前点的启示坐标,然后用 LineTo 会绘画到结束标作。
      win32 7.2 绘制图形 - 绘制图形_第1张图片
    4. 绘制多条线的方法:
      如果绘制多条线,可以用 PolyLine 和 PolyLineto 函数:
      win32 7.2 绘制图形 - 绘制图形_第2张图片
      lpPoint 指向一个包含一系列POINT结构的缓冲区,由于POINT结构只有x和y字段,相当于"x1,y1,x2,y2,x3,y3···"。cPoints 指向了 参数的数目,注意,PolyLine 中 cPoint 有 n,则只能画n-1个线段(并不从 起始点开始,而是从 (x1,y1) 开始)
    5. 各个 绘制线条函数 实例:
      win32 7.2 绘制图形 - 绘制图形_第3张图片
      1. Arc 函数:
        其(x1,y1)和(x2,y2)画出一个矩形,默认是逆时针方向画出。不过绘画方向可以使用 SetArcDirection 函数重新规定:
        在这里插入图片描述
    6. “虚线颜色“的定义:
      在画线的时候,如果当前的画笔颜色是虚线的话,虚线的不连续部分实际上是白色组成的,当虚线画在非白色背景上的时候这部分更加明显。实际上这些虚线的不连续部分是可以自定义的:
      在这里插入图片描述
      调用后不连续的部分将用 dwColor 制定的颜色绘画。
      1. “透明”与“非透明”模式的切换:
        但是改变颜色也并不是唯一的选择,GDI允许这部分并不绘画任何颜色,也就是可以是“透明”的,用下面的调用可以将模式在透明与非透明之间切换:
        win32 7.2 绘制图形 - 绘制图形_第4张图片
        两种模式以及绘画呀呢不但影响虚线的空隙部分,同样也影响 CreateHatchBrush 函数创建的画刷,因为这种话刷使用几种由线条构成的图案,当用这种画刷填充一个区域的时候,线条图案的间隙部分同样受 SetBkColor 函数 和 SetBkMode 函数的影响。
  2. 绘制图形框和填充区域
    1. 画笔画刷的选择:
      绘制边界框和填充区域其实是同一件事情。如果当前画笔是NULL_PEN的话,画出来的是没有边线的填充区域;如果当前画刷是 NULL_BRUSH 的话,那么只有边线而不会填充;如果当前画刷既不是 NULL_PEN 也不是 NULL_BRUSH,那么画出来的图形既有边,也是有填充的。
    2. 绘制区域函数介绍:
      绘制区域的函数有画举行的 Rectangle,画圆角矩形的 RoundRect,画多边形的 Polygon,画弦的 Chord,画圆饼的 Pie 和画椭圆的 Ellipse,这些函数效果如下图所示。
      win32 7.2 绘制图形 - 绘制图形_第5张图片
      win32 7.2 绘制图形 - 绘制图形_第6张图片
      1. 与画线的区别:
        在这些函数中,Polygon 的调用方式和 Polyline 很相似,只不过如果最后一点和第一点不同,函数会自动画一条直线与起始点相连,将整个区域闭合起来。用 Polygon 绘画的多边形中各条直线可能相交。
      2. 自行选择填充模式:
        在这里插入图片描述
        其效果图:
        win32 7.2 绘制图形 - 绘制图形_第7张图片
    3. 与矩形有关的填充函数: FillRect,FrameRect 和 InvertRect,这些函数不适用当前画笔画边线,也不用画刷填充,其中 FillRect 函数用制定的画刷 hBrush 填充一个lpRect 指定的矩形区域,lpRect 指向一个 RECT 结构;FrameRect函数用指定画刷 hBrush 绘画边线,InvertRect 函数将 LpRect 指定的矩形区域中的颜色值取反。
      win32 7.2 绘制图形 - 绘制图形_第8张图片
      效果:
      win32 7.2 绘制图形 - 绘制图形_第9张图片
  3. 绘图模式:
    1. “绘图模式”介绍:
      在“绘图模式”下,我们并不是覆盖,而是画笔(画刷)的像素点与原本的像素点进行一些列运算得出新的像素点,通过这样你就能很好的理解。
    2. “光栅运算”:
      这个计算的过程就叫做“光栅运算”,光栅运算的方法是用“光栅运算符”来定义 – 英文缩写是 ROP(Raster Operation),ROP 码是一些取反,抑或,拷贝,或及与等位运算方法的组合。
    3. ROP码的介绍:
      Windows定义了16种ROP码:
      win32 7.2 绘制图形 - 绘制图形_第10张图片
      1. 表中的“像素”指DC中要绘画位置原来的像素值,画笔指要画上去的颜色值,当然ROP码影响的并不单是画笔画出的线条,同样影响画刷的填充区域,所以不要被表中的“PEN”搞混淆了,这个“PEN”指的是"Pen and Brush"!
      2. ROP码的优点:
        ROP为一些应用提供了方便,比如需要在背景上拖动一个图形,如果用普通的绘画绘画,那么在会花钱必须保存原来的背景数据,在图形拖动后恢复,然后在新的位置再保存,再绘画,重复如此。但如果是用 R2_XORPEN 或者 R2_NOTXORPEN 的绘画模式,因为 xor 操作两边就是原来的数值,所以无需保存原来的像素,在同一个地方绘画一遍相当于恢复原来的图形。而用 R2_BLACK 和 R2_WHITE 就相当于不管画笔和画刷是什么颜色,画出来的全部是黑色或白色。
      3. 默认模式:
        对于一个DC来说,默认的绘图模式是 R2_COPYPEN,就是用画笔或画刷的颜色替换掉原来的绘图颜色。
      4. 获取当前模式和设置当前模式:
        设置当前模式:
        在这里插入图片描述
        获取当前模式:
        在这里插入图片描述

你可能感兴趣的:(知识汇总)