API绘画入门教程 GDI及GDI+ 使用入门教程 GDI+实战篇

  勇芳 2018-6-4 9230

画画之前要先做准备工作,见上一篇说明

下面省略准备工作代码

{这里是 GDI 缓存 GDI+ 准备代码}

------ 这里是下面例题的代码 ----

{这里是 GDI+ 缓存 GDI 清理代码}

设置笔,画框线用 基本笔,颜色和笔粗

GdipCreatePen1 ARGB颜色, 宽度 , 2, @nGpPen

ARGB颜色:可以用 API 获取 GDIP_ARGB(透明率,R,G, B)   

透明率:=0 完全透明 =255完全不透明

@nGpPen:是GDI+ 笔的指针

设置刷子,用于填充颜色

GdipCreateSolidFill ARGB颜色, @nGpBrush

@nGpBrush 是GDI+ 刷子的句柄

渐变刷子

  '从 XY1 到 XY2 渐变,颜色是 Color1 到 Color2,当不够填充目标时,WrapMode 设置平铺方式
  'WrapMode 平铺
  'WrapModeTile        =0 平铺而不翻转
  'WrapModeTileFlipX   =1 平铺水平翻转
  'WrapModeTileFlipY   =2 平铺垂直翻转
  'WrapModeTileFlipXY  =3 平铺垂直翻转,平铺水平翻转
  'WrapModeClamp       =4 不进行平铺
  Dim As GpPointF point1, point2
  point1.x = x1 ‘开始渐变位置’
  point1.y = y1 
  point2.x = x2 ‘结束渐变位置’
  point2.y = y2 
  GdipCreateLineBrush  @point1, @point2, 开始颜色, 结束颜色, 平铺方式, @nGpBrush

画线

GdipDrawLine m_GpDC, nGpPen, X1 , Y1 , X2 , Y2

画圆弧

'x y w h 一个假象的圆,位置和宽度高度
'StartAngle  相对于x轴的起始角度(以度为单位)。0度为圆的右边中部,
'sweepAngle  指定弧线起始点和终点之间的角度。
GdipDrawArc m_GpDC, nGpPen, X *m_DpiX, Y *m_DpiY, W *m_DpiX, H *m_DpiY,StartAngle,sweepAngle

圆角矩形(GDI+ 没有直接的画圆角矩形,需要我们自己做)

'wC hC 是圆角半径,像素
---先填充------------
    '填充2个直角矩形  
      GdipFillRectangle m_GpDC, nGpBrush, X , (Y+hC) -1, W , (H-hC*2) +2
      GdipFillRectangle m_GpDC, nGpBrush, (X+wc) -1, Y , (W-wC*2) +2, H 
    '填充四个角上的扇形区  
    '填充左上角扇形  
    GdipFillPie m_GpDC, nGpBrush, X , Y , Wc*2 , hc*2 ,180,90
    '填充右下角的扇形  
    GdipFillPie m_GpDC, nGpBrush, (X+w-wC*2) , (Y+h-hc*2), Wc*2 , hc*2 ,360,90
    '填充右上角的扇形  
    GdipFillPie m_GpDC, nGpBrush, (X+w-wC*2) , Y , Wc*2 , hc*2 ,270,90
    '填充左下角的扇形  
    GdipFillPie m_GpDC, nGpBrush, X, (Y+h-hc*2) , Wc*2 , hc*2 ,90,90
----画轮廓---------
    '画矩形上面的边  
    GdipDrawLine (m_GpDC, nGpPen,x+wc,y,w-wc+x,y)  
    '画矩形下面的边  
    GdipDrawLine (m_GpDC, nGpPen,x+wC,y+h,W-wC+x,y+h)  
    '画矩形左面的边  
    GdipDrawLine (m_GpDC, nGpPen,x,y+hC,x,y+h-hC)  
    '画矩形右面的边  
    GdipDrawLine (m_GpDC, nGpPen,x+w,y+hc,x+w,y+h-hC)  
    '画矩形左上角的圆角  
    GdipDrawArc (m_GpDC, nGpPen, x,y,wC*2,hC*2,180,90)  
    '画矩形右下角的圆角  
    GdipDrawArc (m_GpDC, nGpPen, x+w-wC*2,y+h-hC*2,wC*2,hC*2,360,90)  
    '画矩形右上角的圆角  
    GdipDrawArc (m_GpDC, nGpPen, x+w-wC*2,y,wC*2,hC*2,270,90)  
    '画矩形左下角的圆角  
    GdipDrawArc (m_GpDC, nGpPen, x,y+h-hC*2,wC*2,hC*2,90,90)

描绘一个椭圆

  GdipFillEllipse m_GpDC, nGpBrush, X , Y , W , H   ‘填充’
  GdipDrawEllipse m_GpDC, nGpPen, X , Y , W , H     ‘描边’

加载资源图像到 nGpimage ,便于后面重复使用

hInst As HINSTANCE   ‘模块句柄’
ResName As String     ‘资源名称’
  Dim hRes As HRSRC, pResData As HRSRC, wID As WORD, dwID As DWord, imageSize As DWord
  Dim pImageStream As IStream Ptr, hGlobal As HGLOBAL, pGlobalBuffer As LPVOID
  '找资源
  If Left(ResName, 1) = "#" Then
      wID = Val(Mid(ResName, 2))
      dwID = MAKELONG(wID, 0)
      hRes = FindResource(hInst, MAKEINTRESOURCEW(dwID), Cast(LPCSTR, RT_RCDATA))
  Else
      hRes = FindResource(hInst, StrPtr(ResName), Cast(LPCSTR, RT_RCDATA)) '查找资源
  End If
  If hRes Then '检索图像的大小
      imageSize = SizeofResource(hInst, hRes) '获取长度
      If imageSize Then
          '加载资源并获取指向资源数据的指针。
          pResData = LockResource(LoadResource(hInst, hRes))
          If pResData Then
              hGlobal = GlobalAlloc(GMEM_MOVEABLE, imageSize) '分配内存以保存图像
              If hGlobal Then
                  pGlobalBuffer = GlobalLock(hGlobal) '锁定内存
                  If pGlobalBuffer Then
                      CopyMemory(pGlobalBuffer, pResData, imageSize) '将图像从二进制字符串文件复制到全局内存
                      If CreateStreamOnHGlobal(hGlobal, False, @pImageStream) = S_OK Then '在全局内存中创建一个流
                          If pImageStream Then
                              Function = GdipCreateBitmapFromStream(pImageStream, Cast(GpBitmap Ptr Ptr, @nGpimage)) '根据流中包含的数据创建一个位图
                              pImageStream->lpVtbl->Release(pImageStream)
                          End If
                      End If
                      GlobalUnlock pGlobalBuffer '解锁内存
                  End If
                  GlobalFree hGlobal '释放内存
              End If
          End If
      End If
  End If

描绘由LoadImg加载来的图

{加载资源图像到 nGpimage}
  GdipDrawImageRectRect m_GpDC,nGpimage,_
   xDest, yDest , wDest , hDest ,_
   xSrc , ySrc , wSrc , hSrc  ,_
   2,Null,Null,Null
'srcunit  [in]单位枚举的元素,用于指定图像的度量单位。默认值为UnitPixel.
'imageAttributes  [in]指向ImageAttributes结构的指针,用于指定要绘制的图像的颜色和大小属性。默认值为NULL。
' callback        [in]用于取消正在进行的绘图的回调函数。默认值为NULL。
' callbackData     [in]指向由回调参数指定的函数使用的附加数据的指针。默认值为NULL。

描绘带轮廓文本字符串

'hSize GDI+里的度量与 GDI的字体不同,9号字大概等于 12 emSize
  Dim nPath As GpPath Ptr
  Dim fontFamily As GpFontFamily Ptr
  Dim rc As Rect
  rc.Left = x 
  rc.top = y 
  rc.Right = x  + Width
  rc.bottom = y + Height
  GdipCreateFontFamilyFromName “字体名”, Null, @fontFamily '创建一个基于指定的字体系列的FontFamily对象
 
  GdipCreatePath FillModeAlternate, @nPath '创建路径

  '把文字植入路径里
  GdipAddPathStringi(nPath, @ww, Len(nText), fontFamily, FontStyleRegular, 字体尺寸, @rc, Null)
  
  GdipDrawPath(m_GpDC, nGpPen, nPath)
  If nGpBrush Then  GdipFillPath m_GpDC, nGpBrush, nPath

  GdipDeleteFontFamily(fontfamily) '销毁指定FontFamily对象,释放资源
  GdipDeletePath nPath


GDI+ API之多,功能之丰富,让人需要研究很久很久,只要理解了方法,学习来就轻松了。

这里入门就到此为止,常用就这些。

因国家互联网安全管理要求,关闭回帖功能。大家需要留言,请使用【勇芳软件客服】即时联系勇芳点此打开->>勇芳软件客服
返回
联系勇芳
发新帖 搜索 反馈 回顶部