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

[教程]第三讲 GDI画笔、线型

作者:绿色风   发布:2014-12-2 13:04 Tuesday   分类:   阅读:6435次   评论:0条  

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

GDI之画笔pen
本讲要用到的函数
_WinAPI_DrawLine两点间画线
_WinAPI_MoveTo移动当前位置到某点
_WinAPI_LineTo从当前位置画线到某点
_WinAPI_LineDDA;确切的说这不是画线函数,它是从某点到另一点的过程中,每经过一个点调用指定的函数

_WinAPI_Rectangle 在一个矩形区域画矩形
_WinAPI_RoundRect 在矩形区域画圆角矩形
_WinAPI_AngleArc 画弧线从角度到角度
_WinAPI_Arc 画弧线从点到点
_WinAPI_ArcTo 画弧线从点到点,改变当前位置
_WinAPI_Ellipse  在矩形区域画椭圆
上面这些函数都要用到画笔来绘制线条,有些封闭区域的,还会用画刷填充,画刷下一讲再讲。
画笔建立有二种方式
一是用系统画笔:如$hPen = _WinAPI_GetStockObject($BLACK_PEN);黑画笔,$NULL_PEN是空画笔,也就是不会绘制线条
系统定义好的画笔只有黑白空三种,要更多样的就要用第二种方式。有没有记得上次我们用_WinAPI_GetStockObject设置字体。
二是用_WinAPI_CreatePen,它可以指定类型、指定画笔宽度、指定颜色BGR格式
线宽只适用于实心纯色和空画笔(PS_NULL),其它类型即便你设置了也当做宽度是1

实心纯色有两种方式PS_SOLID和PS_INSIDEFRAME
PS_SOLID画线时,是以线宽的早间为准
PS_INSIDEFRAME画封闭图形时,线宽是全部画在图形内;如果不是封闭图形则和PS_SOLID相同

画笔使用也要_WinAPI_SelectObject选择,用好后再_WinAPI_SelectObject换回,如果不用了再_WinAPI_DeleteObject释放

本讲例子中,还讲到了一个不填充封闭矩形的方法

布置作业,画出一个简单的刻度尺,其中刻度线用_WinAPI_LineDDA函数
如果lineDDA看不懂,我隐藏了画刻度线的代码,回复看一下

未命名.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()
        $hDC = _WinAPI_GetDC($hWnd)

        $hPen_PS_SOLID = _WinAPI_CreatePen($PS_SOLID, 10, 0x0000FF);红色实线画笔宽度为10
        $hPen_PS_INSIDEFRAME = _WinAPI_CreatePen($PS_INSIDEFRAME, 10, 0x0000FF);红色实线向内画笔宽度为10
        $hPen_PS_DASH0 = _WinAPI_CreatePen($PS_DASH, 0, 0x000000);黑色虚线宽度为0的画笔,实际宽度还是1,如果大于1,则变为实线画笔,宽度大于1只对实线画笔和空画笔
        $hPen_PS_DASH1 = _WinAPI_CreatePen($PS_DASH, 1, 0x000000);黑色虚线宽度为1的画笔
        $hBrush = _WinAPI_GetStockObject($NULL_BRUSH);空画刷
        ;一、和三去对照看
        $oldPen = _WinAPI_SelectObject($hDC, $hPen_PS_SOLID);选择红色实线画笔宽度为10
        $oldBrush = _WinAPI_SelectObject($hDC, $hBrush);选择空画刷,作用是画矩形框时中间不填充,和三、中的矩形框看
        $tRECT = _WinAPI_CreateRect(10, 10, 90, 90);
        _WinAPI_Rectangle($hDC, $tRECT);画矩形框,因为画刷是空的所以中间没有填充颜色
        _WinAPI_DrawLine($hDC, 120, 10, 220, 10);画一条直线和三、画的直线对比看看
        _WinAPI_SelectObject($hDC, $oldPen);
        _WinAPI_SelectObject($hDC, $oldBrush);
        ;二、在一、的基础上画一条宽度为1的虚线,看看一中的宽度10的画笔是怎么画的
        $oldPen = _WinAPI_SelectObject($hDC, $hPen_PS_DASH0);选择宽度为0的虚线
        $oldBrush = _WinAPI_SelectObject($hDC, $hBrush);选择空画刷
        $tRECT = _WinAPI_CreateRect(10, 10, 90, 90);
        _WinAPI_Rectangle($hDC, $tRECT);画矩形
        _WinAPI_DrawLine($hDC, 120, 10, 220, 10);画直线
        _WinAPI_SelectObject($hDC, $oldPen);
        _WinAPI_SelectObject($hDC, $oldBrush);
        ;三、和一的对照看
        $oldPen = _WinAPI_SelectObject($hDC, $hPen_PS_INSIDEFRAME);选择红色实线向内画笔宽度为10
        $tRECT = _WinAPI_CreateRect(10, 110, 90, 190);
        _WinAPI_Rectangle($hDC, $tRECT);
        _WinAPI_DrawLine($hDC, 120, 110, 220, 110);
        _WinAPI_SelectObject($hDC, $oldPen);
        ;四在三的基础上画虚线,看三中的宽度10的画笔是怎么画的
        $oldPen = _WinAPI_SelectObject($hDC, $hPen_PS_DASH1);选择宽度为1的虚线
        $oldBrush = _WinAPI_SelectObject($hDC, $hBrush);
        $tRECT = _WinAPI_CreateRect(10, 110, 90, 190);
        _WinAPI_Rectangle($hDC, $tRECT);
        _WinAPI_DrawLine($hDC, 120, 110, 220, 110);
        _WinAPI_SelectObject($hDC, $oldPen);
        _WinAPI_SelectObject($hDC, $oldBrush);
        ;释放建立的对象
        _WinAPI_DeleteObject($hPen_PS_SOLID)
        _WinAPI_DeleteObject($hPen_PS_INSIDEFRAME)
        _WinAPI_DeleteObject($hPen_PS_DASH0)
        _WinAPI_DeleteObject($hPen_PS_DASH1)
        _WinAPI_DeleteObject($hBrush)

        ;画讲解文字
        $hPen = _WinAPI_CreatePen($PS_SOLID, 2, 0x00FFFF)
        $oldPen = _WinAPI_SelectObject($hDC, $hPen)
        _WinAPI_MoveTo($hDC, 90, 10)
        _WinAPI_LineTo($hDC, 110, 50)
        _WinAPI_MoveTo($hDC, 120, 10)
        _WinAPI_LineTo($hDC, 110, 50)
        _WinAPI_MoveTo($hDC, 90, 110)
        _WinAPI_LineTo($hDC, 110, 150)
        _WinAPI_MoveTo($hDC, 120, 110)
        _WinAPI_LineTo($hDC, 110, 150)
        _WinAPI_SelectObject($hDC, $oldPen)
        _WinAPI_DeleteObject($hPen)

        $hFont = _WinAPI_GetStockObject($DEFAULT_GUI_FONT)
        _WinAPI_SelectObject($hDC, $hFont)
        _WinAPI_SetBkColor($hDC, 0x339933)
        $tRECT = _WinAPI_CreateRect(110, 50, 290, 90)
        _WinAPI_DrawText($hDC, "PS_SOLID"&@CR&"画笔以中间为准", $tRECT, $DT_EDITCONTROL)
        _WinAPI_SetBkColor($hDC, 0x3399FF)
        $tRECT = _WinAPI_CreateRect(110, 150, 290, 190)
        _WinAPI_DrawText($hDC, "PS_INSIDEFRAME画笔"&@CR&"画直线以中间为准"&@CR&"画封闭图形向内画线", $tRECT, $DT_EDITCONTROL)

        _WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc   ;==>gditest
```

示例

#include <APIConstants.au3>
#include <WinAPIEx.au3>
Global $hLineProc = DllCallbackRegister('_LineProc', 'none', 'int;int;lparam')
Global $pLineProc = DllCallBackGetPtr($hLineProc)

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
DllCallbackFree($hLineProc)
GUIDelete()
Exit

Func gditest()
        Local $sText = '这是我输出的字符串'
        $hDC = _WinAPI_GetDC($hWnd)
        $hPen_PS_SOLID = _WinAPI_CreatePen($PS_SOLID, 1, 0x0000FF);
        $oldPen = _WinAPI_SelectObject($hDC, $hPen_PS_SOLID)
        _WinAPI_LineDDA(10, 50, 290, 50, $pLineProc, $hDC)
        _WinAPI_SelectObject($hDC, $oldPen);
        _WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc   ;==>gditest

Func _LineProc($iX, $iY, $hDC)
        If Not Mod($iX, 5) Then
                If Not Mod($iX, 10) Then
                        _WinAPI_DrawLine($hDC, $iX, $iY, $iX, $iY -10)
                Else
                        _WinAPI_DrawLine($hDC, $iX, $iY, $iX, $iY -5)
                EndIf
        EndIf
EndFunc   ;==>_LineProc
```





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

blogger
该日志由 绿色风 于2014-12-2 13:04 Tuesday发表在 分类下。
版权所有:《绿色风's Blog》 → 《[教程]第三讲 GDI画笔、线型》;
除特别标注,本博客很多文章均为原创. 互联分享,尊重版权,转载请以链接形式标明本文地址;
本文标签:

扫描二维码,在手机上阅读
上一篇::[教程] 第四讲 GDI画刷
下一篇:2015春运火车票购票攻略

热门文章

相关文章

  • AU3音频波谱图
  • [教程]第十八讲 GDI+窗口自绘无控件
  • [教程]第二讲 GDI文字DrawText
  • [教程] 第十六讲 GDI+图像之图像属性项读取EXIF信息及缩略图读取
  • [教程] 第五讲 GDI路径和选区
取消回复

发表评论

亲,头像对么?

75 + 14 =

提交中,请稍候……


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


    站点统计
    • 运行时间: 20254 天
    • 日志总数: 365 篇
    • 评论数量: 7238 条
    • 微语数量: 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