win32 7.5 区域和路径

本文介绍了Windows GDI中的区域和路径概念及其使用。创建区域可通过CreateRectRgn等函数实现,合并区域则使用CombineRgn函数,区域可应用于定制窗口形状和裁剪绘画区域。路径使用BeginPath和EndPath创建,可转换为区域用于复杂形状的绘制和填充。通过这些技术,开发者能更灵活地处理图形和窗口的显示。
摘要由CSDN通过智能技术生成
  1. 前言:
    如果勇敢PhotoShop绘图软件,就一定记得它有“选择区域”,以及“路径”的概念,区域用来选定一个范围,以便对指定的范围进行某种操作;而路径相当于用虚拟的线条进行 “圈地运动”,虽然路径圈出来的看上去也是一个区域,但路径记录的是“圈地”用的线条而不是圈出来的地。

  2. 使用区域:

    1. 创建区域:

      1. GDI 中可以用下列区域建立函数来创建区域:
        在这里插入图片描述

        1. CreateRectRgn 函数的参数指定了 左上和右下两个对角的坐标。
        2. CreateEllipticRgn 的参数指定了一个矩形,产生的矩形区域是相切的。
        3. CreateRllipiticRgnIndrect 函数同样建立椭圆区域,但指定与椭圆相切的矩形是由一个 RECT 结构定义的。
        4. CreatePolygonRgn 建立一个多边形区域。lpPoint 指向了一系列的 POINT 结构, iCount 指定了点的数量,iPolyFillMode参数就是 SetPolyFillMode 函数使用的参数:ALTERNATE 或 WINDING,结果的不同之处相当于表 7.4中 Polygon 函数的两种区别
      2. 如果创建区域成功的话,这些函数返回一个区域句柄 hRgn,区域和画笔,画刷等一样的,都是GDI对象。如果不再使用一个区域,需要用 DeleteObject将它删除。

    2. 合并区域

      1. 仅仅上面的函数可能用途不是很大,但是将不同形状的区域按照各种方式合并在一起,用处就大了,可以因此定义出很复杂的区域。
      2. 要合并区域可以使用函数:
        在这里插入图片描述
        1. 该函数将 hScrRgn1 和 hSrcRgn2 两个区域合并起来放入 hDestRgn 指定的区域句柄中,但 hDestRgn 并不是新生成的,它必须是一个已经存在的区域句柄,当函数执行后,hDestRgn中原来的区域会被破坏并替换成合并的区域,但可以对 hDestRgn 和 hSrcRgn1 使用同一个句柄,相当于把2合并到1进去。
        2. 合并的方式:dwCombine 指定了合并的方式,它可以是以下取值
          在这里插入图片描述
    3. 区域的用途:

      区域主要可以用在两个地方:建立特殊形状的窗口和对绘画区域进行裁剪。

      1. 建立特殊窗口图形:
        使用SetWindowRgn 函数可以使窗口的形状由区域指定,如BmpClock 时钟程序是椭圆形的,当把时钟移动到其他窗口上面的时候,它的四角并不覆盖住下层窗口,这就是因为程序中有下面代码:
        在这里插入图片描述
        1. SetWindowRgn 最后一个参数为 TRUE,表示设置窗口形状后 WIndows 要发送一个WM_PAINT 消息将窗口 重画。
        2. 由于 Windows对使用的区域保存一个拷贝,所以程序在调用 SetWindowRgn 函数后就可以用 DeleteObject 删掉,并不需要退出时再删除掉。
      2. 另外,区域可以用来对绘画区域进行裁剪,任意使用以下两条语句之一:
        在这里插入图片描述
        那么以后在 hDC上绘制函数的话,只有 hRgn 指定的区域中的点才会被绘画,对裁剪区区域外的绘画将会被忽略。同样,Windows 会对选入DC的区域建立一个拷贝,如果以后不需要这个区域了,那么在函数执行后,可以马上用 DeleteObject函数将其删除掉。
  3. 使用路径

    1. 创建路径

      1. 路径不是GDI对象,它并没有一个句柄,WIndows对每个DC在内部保存一个路径,每次新开始建立一个路径,原有的路径就会被破坏掉。如果要建立一个陆行,可以使用 BeginPath函数:
        在这里插入图片描述

      2. 调用了这个函数以后,对 hDC 使用画线函数所画的线条都被会当做路径记录,使用画线函数画出来的线条可能是不连续的,比如多次调用的 LineTo函数,最后一点和开始一点不同,这时需要使用 CloseFigure 函数将路径封闭起来:
        在这里插入图片描述
        CloseFigure 函数从 最后一点到第一个点画一条直线把路径封闭起来。Windows允许创建多个子路径,封闭前面一条路径以后,可以继续“圈”出和前面路径不相连的另一条路径。

      3. 最后,使用 EndPath 函数结束创建路径:
        在这里插入图片描述

      4. 举例:

        如图,示范了一次创建路径的过程,在第1步调用BeginPath 和 第11步调用 EndPath之间,用 lineTo 函数和 Rectangle 画出了包含两个三角形和一个矩形区域,其中两个三角形用 CloseFigure去封闭:
        在这里插入图片描述

    2. 使用路径:

      创建了路径以后,我们可以进行下面操作:

      1. 首先,对路径进行画线操作,或者对路径围起来的区域进行填充操作:
        在这里插入图片描述
        1. 函数介绍:
          1. 第一个函数沿着路径用当前画笔描绘线条。
          2. 第二个函数使用当前画刷填充路径围起来的区域。
          3. 第三个函数既使用当前画笔绘画边线也使用当前画刷填充中间区域。
        2. 说明:当执行了任何一个函数的时候,路径都会被破坏掉。实际上,这些函数的功能就相当于 7.2.3节中的画线和填充函数,那么为什么要这样大动干戈呢?唯一的好处就是用这种方法可以操作很复杂的形状,因为定义路径时可以使用任何画线函数,包括画弧与画贝塞尔曲线函数等,而用普通的填充函数是无法填充出一个由贝塞尔曲线围成的区域的。
      2. 路径的另一个用途是定义一个复杂形状的区域,可以使用下面的函数将路径转换为区域:
        在这里插入图片描述
        这个可以用来定义形状复杂的多的区域。同样,执行了PathToRegion函数以后,原有的路径定义就会被破坏掉。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值