vb6 如何畫多邊形shape

Home Home
引用 | 編輯 troy_liaw106
2011-02-08 22:29
樓主
推文 x0
如題,可以的 ..

訪客只能看到部份內容,免費 加入會員



獻花 x0
引用 | 編輯 ebolaman
2011-02-09 03:43
1樓
  
如果是 中空的 Shape,直接用 VB6 內建的函數 : PSet, Line 即可達成

不知道你的意思是 頂點與線 上色,還是要連點連起來的多邊形內部也要上色


如果 內部需要上色,可以用幾個 API 來達成

網路查了一下才發現有許多種方法可以達成,甚至有人都做好了模組可以直接套用

我以別人的程式碼為基礎,作了一個 "畫出任意 正多邊形" 的專案,可以參考看看


主要是參考 http://tw.knowledge.yahoo.com/question/question?qid=1610020405915 的回答內容

只是座標方面 (P().X = ....  P().Y = .....) 要修改一下




這是我做的一個小程式:






主要的程式碼如下: (Sub DrawRegularShape)

DrawRegularShape 的參數: 圖片物件, 幾正邊形, 圓形的長度, 初始的角度, 圓形中心的 X, 圓形中心的 Y, 顏色


複製程式
Public Sub DrawRegularShape(ByRef Pic As Object, ByVal EdgesCt As Long, ByVal CircleR As Long, ByVal IntAngle As Double, _
  ByVal CenterX As Long, ByVal CenterY As Long, ByVal FilledColor As Long)


    Dim P(100) As POINTAPI, hBrush As Long, hRgn As Long
    Dim i As Long
    Dim tempX As Long, tempY As Long, Angle As Double
    
    
    'Convert Angle Into 'Rad'
    IntAngle = IntAngle / 180 * Pi
    
    
    '----------- Specify Points ----------
    
    For i = 0 To EdgesCt - 1

      Angle = ((Pi * 2 / EdgesCt) * i) + IntAngle + (Pi / 2)
      tempX = CenterX + (CircleR * Cos(Angle))
      tempY = CenterY - (CircleR * Sin(Angle))

      P(i).X = tempX
      P(i).Y = tempY
      
'      '[Debug - Draw Pien Point]
'      Pic.DrawWidth = 3
'      Pic.PSet (tempX, tempY)

    Next i
    
    Do While i <= UBound(P)
      P(i).X = P(i - 1).X
      P(i).Y = P(i - 1).Y
      i = i + 1
    Loop

    
    '--------------------------------------
    
    hBrush = CreateSolidBrush(FilledColor)
    hRgn = CreatePolygonRgn(P(0), UBound(P), ALTERNATE)
    If hRgn Then FillRgn Pic.hdc, hRgn, hBrush
    DeleteObject hRgn
    
    
'    '[Debug - Draw Central Point]
'    Pic.DrawWidth = 5
'    Pic.PSet (CenterX, CenterY)


End Sub




這是座標的解析,如果搞不懂以上程式碼運作原理的話,看這張圖容易了解:








這是 "正" 多邊形 的示範,如果要不規則形

只需將以上的 For ... Next 區塊移除,改成 指定 座標 各是多少,或許用 文字檔來載入 等方式.....



此 VB6 專案 "Draw A Polygon" + 程式 下載:

本帖包含附件
檔名: zip Example - Draw A Polygon.rar   (2022-06-09 14:17 / 39 KB)  
FileType : RAR
下載次數:15


獻花 x1
引用 | 編輯 troy_liaw106
2011-02-12 08:31
2樓
  
內部上色的部份,顏色可以調透明度嗎?

獻花 x0
引用 | 編輯 ebolaman
2011-02-12 16:29
3樓
  
下面是引用 troy_liaw106 於 2011-02-12 08:31 發表的 : 到引言文
內部上色的部份,顏色可以調透明度嗎?


有點不懂 "透明度" 的意思

是指


(1) 圖片交錯,某物件有透明度 與 其他物件重疊,混色,例如:




(2) 還是單純一個物件的透明度 ?



第一種我沒去研究,看起來似乎比較困難

第二種我作了,是利用顏色的 HSB (維基百科連結數位男女連結)  來調色




HSB 其中的 S 為 "濃度" 的意思,我發現這可以來替代 "透明度",如果我沒錯的話

HSB 與 RGB 的轉換公式是參考 http://www.easyrgb.com/index.php?X=MATH 的設計



這次把上次的專案稍加修改,加上能調配 HSV 的功能 (HSV 等同 HSB)

介面部分模擬 軟體:色胚子 (ColorBase) 的設計,有興趣可以去下載研究

但是有個小缺點就是,不是全部的顏色範圍都能調整,可能是 Pixel 單位的緣故吧

看這張圖大概能知道,但是我還是不了解詳細原理:






這次還加上了 "Enable Details" 的勾選,可以直接了解繪圖的原理 (長度部分單位為 Pixel)








專案的程式碼稍顯複雜,如果不知道各方的用途,請告訴我

我會再來解析



VB6 專案+程式 下載 :

本帖包含附件
檔名: zip Example - Draw A Polygon.rar   (2022-06-09 14:17 / 44 KB)  
FileType : RAR ; CRC-32 : 70E4E23C
下載次數:7


獻花 x1
引用 | 編輯 ebolaman
2011-02-12 16:35
4樓
  
對了,剛才發現 有時候調配 HSV 的那三條 PictureBox 會變成完全白色

可能是 屬性 AutoRedraw 沒設成 True 吧,請改正,我懶得重新上傳

獻花 x0
引用 | 編輯 troy_liaw106
2011-02-12 18:55
5樓
  
我指的是第一個用alpha調透明度
沒關係,我有想到替代方案了
謝謝

獻花 x0
引用 | 編輯 ebolaman
2011-02-13 00:49
6樓
  
有找到 有人作好的 兩張不同圖片 不同 alpha 度 混合在一起

請參考:

http://www.a1vbcode.com/app-2829.asp


還蠻厲害的

獻花 x0