绿色风's Blog
专注AutoIT(Au3)
  • 首页
  • 流●年
  • 笔●记
    • 学习随记
    • 源码示例
  • 脚●本
    • UDF(收集)
    • 工作室UDF
    • 工具●教程
    • 教程之GDI
  • 作●品
  • 下●载
  • 情怀ExcelTip
12月52014

[教程] 第五讲 GDI路径和选区

作者:绿色风   发布:2014-12-5 11:31 Friday   分类:   阅读:7422次   评论:0条  

ACN论坛.讲师:seniors   转载请说明此文出处所在:<<简易工作室>>,谢谢!

 GDI路径和选区

一、路径

使用_WinAPI_BeginPath($hDC)开始绘制路径

最后使用_WinAPI_EndPath($hDC)结束绘制路径



路径绘制使用改变当前位置的函数,绘制路径时,在DC上没有图形

绘制路径函数有

_WinAPI_MoveTo

_WinAPI_MoveToEx

_WinAPI_LineTo

_WinAPI_ArcTo

_WinAPI_PolyBezierTo

等

如果绘制封闭路径

其它的绘图函数都可以

如果绘制的图形不封闭,要路径封闭还可以用

_WinAPI_CloseFigure来封闭路径

路径可以用画笔描边,使用_WinAPI_StrokePath($hDC)

封闭的路径还可以填充,使用_WinAPI_FillPath($hDC)

路径描边和填充同时进行的,使用_WinAPI_StrokeAndFillPath($hDC)

以上帮助中基本都有例子

本讲源码中用没有例子的_WinAPI_PolyDraw来绘制路径,以及看看

_WinAPI_FlattenPath($hDC);使路径平滑的作用

_WinAPI_WidenPath($hDC);扩大路径的作用


二、选区
可以看作是封闭的路径,当然路径和选区是不同的
创建选区

  1. _WinAPI_CreateNullRgn;空选区
  2. _WinAPI_CreateRectRgn;矩形选区
  3. _WinAPI_CreateRoundRectRgn;圆角矩形选区
  4. _WinAPI_CreatePolygonRgn;多边形选区

从路径转换为选区,路径必须是封闭的

_WinAPI_PathToRegion($hDC)

选区合并,有多个模式

_WinAPI_CombineRgn($hRgnDest, $hRgnSrc1, $hRgnSrc2, $iCombineMode)

当不再需要选区对象时,调用 _WinAPI_DeleteObject 函数删除它.

填充选区

_WinAPI_FillRgn

描边选区

_WinAPI_FrameRgn

时间关系选区就不做具体说明了

三、渐变填充

_WinAPI_GradientFill;水平或竖直渐变填充

_WinAPI_RadialGradientFill;径向渐变填充

这两个渐变填充,帮助例子说明的比较清晰了


未命名.JPG

另:下讲开始要让我们绘制的图案一直显示,GDI分部分到完全自绘一个地址控件为止吧,至于GDI+,等讲完了GDI再说吧
每天写比较累,自己实力也跟不上,以后不一定每天一讲
忘记布置作业了
用路径绘制一个我们发贴时引用的这个图案吧

1.JPG

本讲源码


#include <APIConstants.au3>
#include <WinAPIEx.au3>

GUICreate("第五讲", 300, 200)
$ctrlId = GUICtrlCreatePic("", 0, 0, 300, 200)
$hWnd = GUICtrlGetHandle($ctrlId)
GUISetState()
gditest()

While 1
        $Msg = GUIGetMsg()
        Switch $Msg
                Case -3
                        ExitLoop
        EndSwitch
WEnd
GUIDelete()
Exit

Func gditest()
        Local $aPoint[7][3] = [[90, 20, $PT_MOVETO],[50, 10, $PT_BEZIERTO],[10, 20, $PT_BEZIERTO],[50, 30, $PT_BEZIERTO],[90, 40, $PT_BEZIERTO],[50, 50, $PT_BEZIERTO],[10, 40, $PT_BEZIERTO]]
        Local $bPoint[7][3] = [[10, 50, $PT_MOVETO],[10, 10, $PT_LINETO],[50, 10, $PT_LINETO],[90, 20, $PT_BEZIERTO],[90, 40, $PT_BEZIERTO],[50, 50, $PT_BEZIERTO],[10, 50, $PT_LINETO + $PT_CLOSEFIGURE]]
        ;$PT_BEZIERTO的点至少要有3个才能绘制贝塞尔曲线
        $hDC = _WinAPI_GetDC($hWnd)
        ;设置画笔。画刷
        $hOldBrush = _WinAPI_SelectObject($hDC, _WinAPI_GetStockObject($DC_BRUSH));DC_BRUSH帮助中没看到,是在例子中看到的,晕
        $hOldPen = _WinAPI_SelectObject($hDC, _WinAPI_GetStockObject($DC_PEN));DC_PEN帮助中没看到,是在例子中看到的,晕
        _WinAPI_SelectObject($hDC, _WinAPI_GetStockObject($DEFAULT_GUI_FONT))
        _WinAPI_SetDCPenColor($hDC, 0xFF0000)
        _WinAPI_SetDCBrushColor($hDC, 0xFFFF00)
        ;不封闭路径
        _WinAPI_BeginPath($hDC)
        _WinAPI_PolyDraw($hDC, $aPoint)
        _WinAPI_EndPath($hDC)
        _WinAPI_StrokePath($hDC)

        ;路径平直化,效果不明显,应该是路径还不够复杂,平直化后路径点数会变少
        _WinAPI_BeginPath($hDC)
        _WinAPI_OffsetPoints($aPoint, 100, 0);数组各点右移100
        _WinAPI_PolyDraw($hDC, $aPoint)
        _WinAPI_EndPath($hDC)
        _WinAPI_FlattenPath($hDC);平滑路径
        _WinAPI_StrokePath($hDC)

        ;路径扩大,画的线变粗了
        _WinAPI_BeginPath($hDC)
        _WinAPI_OffsetPoints($aPoint, 100, 0);数组各点右移100
        _WinAPI_PolyDraw($hDC, $aPoint)
        _WinAPI_EndPath($hDC)
        _WinAPI_WidenPath($hDC);扩大路径
        _WinAPI_StrokePath($hDC)

        ;封闭路径
        _WinAPI_BeginPath($hDC)
        _WinAPI_OffsetPoints($bPoint, 0, 100);数组各点下移100
        _WinAPI_PolyDraw($hDC, $bPoint)
        _WinAPI_EndPath($hDC)
        _WinAPI_StrokeAndFillPath($hDC)

        ;路径平直化,效果不明显,应该是路径还不够复杂,平直化后路径点数会变少
        _WinAPI_BeginPath($hDC)
        _WinAPI_OffsetPoints($bPoint, 100, 0);数组各点左移100
        _WinAPI_PolyDraw($hDC, $bPoint)
        _WinAPI_EndPath($hDC)
        _WinAPI_FlattenPath($hDC);平滑路径
        _WinAPI_StrokeAndFillPath($hDC)

        ;对封闭路径,扩大后。只有路径不能填充
        _WinAPI_BeginPath($hDC)
        _WinAPI_OffsetPoints($bPoint, 100, 0);数组各点左移100
        _WinAPI_PolyDraw($hDC, $bPoint)
        _WinAPI_EndPath($hDC)
        _WinAPI_WidenPath($hDC);扩大路径
        _WinAPI_WidenPath($hDC);扩大路径
        _WinAPI_WidenPath($hDC);扩大路径
        _WinAPI_WidenPath($hDC);扩大路径
        _WinAPI_WidenPath($hDC);扩大路径
        _WinAPI_StrokeAndFillPath($hDC)

        $tRECT = _WinAPI_CreateRect(10, 70, 290, 90)
        _WinAPI_SetBkMode($hDC, $TRANSPARENT);设置文字背景透明
        _WinAPI_DrawText($hDC, "原始路径        平滑路径           扩大路径", $tRECT, $DT_LEFT);如果不哆输出省略号
        _WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc   ;==>gditest
```






本文固定链接: http://www.jianyiit.com/post-41.html

blogger
该日志由 绿色风 于2014-12-5 11:31 Friday发表在 分类下。
版权所有:《绿色风's Blog》 → 《[教程] 第五讲 GDI路径和选区》;
除特别标注,本博客很多文章均为原创. 互联分享,尊重版权,转载请以链接形式标明本文地址;
本文标签:

扫描二维码,在手机上阅读
上一篇::[教程] 第六讲 GDI设置图像到控件
下一篇:手机低头族们要注意的了

热门文章

相关文章

  • [教程]第十讲之分解2-多色渐变画刷
  • [教程] 第十讲之分解3-纹理画刷
  • [教程] 第五讲 GDI路径和选区
  • [教程] 第十六讲 GDI+图像之图像属性项读取EXIF信息及缩略图读取
  • [教程]第二讲 GDI文字DrawText
取消回复

发表评论

亲,头像对么?

45 + 24 =

提交中,请稍候……


木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!


    站点统计
    • 运行时间: 20254 天
    • 日志总数: 365 篇
    • 评论数量: 7237 条
    • 微语数量: 6 条
    • 附件总量: 388 件
  • 逝出的青春

  • 打赏"绿色风"



      扫码关注本站公众号 可搜本站内容

  • Autoit V3 脚本交流群

      常驻群1:905774875
      常驻群2:40672266


  • 链接

    • AU3中文论坛
    • Excel资料库
    • 完美者博客
    • 顺网小哥'S Blog
    • 猛牛哥的博客
    • 网吧系统下载
  • 分类

    • 流●年(66)
    • 笔●记(0)
    • 脚●本(0)
    • 作品(21)
    • 学习随记(51)
    • 源码示例(68)
    • UDF(收集)(26)
    • 工作室UDF(30)
    • 工具●教程(62)
    • 教程之GDI(24)
Copyright © 2013 绿色风's Blog. Powered by emlog. Theme by 射雕天龙. 鄂ICP备2021011689号-1 鄂公网安备42102302000078号 sitemap