本帖最后由 seniors 于 2013-6-16 07:55 编辑
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);扩大路径的作用
二、选区
可以看作是封闭的路径,当然路径和选区是不同的
创建选区_WinAPI_CreateNullRgn;空选区
_WinAPI_CreateRectRgn;矩形选区
_WinAPI_CreateRoundRectRgn;圆角矩形选区
_WinAPI_CreatePolygonRgn;多边形选区
从路径转换为选区,路径必须是封闭的
_WinAPI_PathToRegion($hDC)
选区合并,有多个模式
_WinAPI_CombineRgn($hRgnDest, $hRgnSrc1, $hRgnSrc2, $iCombineMode)
当不再需要选区对象时,调用 _WinAPI_DeleteObject 函数删除它.
填充选区
_WinAPI_FillRgn
描边选区
_WinAPI_FrameRgn
时间关系选区就不做具体说明了
三、渐变填充
_WinAPI_GradientFill;水平或竖直渐变填充
_WinAPI_RadialGradientFill;径向渐变填充
这两个渐变填充,帮助例子说明的比较清晰了
另:下讲开始要让我们绘制的图案一直显示,GDI分部分到完全自绘一个地址控件为止吧,至于GDI+,等讲完了GDI再说吧
每天写比较累,自己实力也跟不上,以后不一定每天一讲
忘记布置作业了
用路径绘制一个我们发贴时引用的这个图案吧
本讲源码
#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
|