API繪畫入門教程 GDI及GDI+ 使用入門教程 GDI+實戰篇

  勇芳 2018-6-4 6528

畫畫之前要先做準備工作,見上一篇說明

下面省略準備工作代碼

{這里是 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之多,功能之豐富,讓人需要研究很久很久,只要理解了方法,學習來就輕松了。

這里入門就到此為止,常用就這些。

因國家互聯網安全管理要求,關閉回帖功能。大家需要留言,請使用【勇芳軟件客服】即時聯系勇芳點此打開->>勇芳軟件客服
返回
聯系勇芳
一个人看的www视频播放中文_2012中文字幕电影_亚洲国产成人高清在线观看_中文字幕天堂最新版在线网