原本會在(10,70) - (200, 70) 有一條水平線,但是,現在會發現線條僅在hRegion所指的區域中
出現,這個留給您Testing;如果單只這個功能還沒有什麼,不同的Region尚可以合併成
一個Region,而且可以選擇使用and、or、xor、diff、copy的方式來合併,(使用以下API)
Declare Function CombineRgn Lib "gdi32" Alias "CombineRgn" _
(ByVal hDestRgn As Long, _
ByVal hSrcRgn1 As Long, _
ByVal hSrcRgn2 As Long, _
ByVal nCombineMode As Long) As Long
Public Const RGN_AND = 1
Public Const RGN_COPY = 5
Public Const RGN_DIFF = 4
Public Const RGN_OR = 2
Public Const RGN_XOR = 3
另外,更可以用在不規則形Button的 模擬,怎麼做呢,首先,您需自行畫不規則的圖,
看您的Form需幾個這種Button就同時畫在同一張圖,並安排好其位置,因為這張圖等一下
要當作Form的底圖,如此,該Form就有表面上看來有不規則的Button了,而再來便是定義
該不規則區域的Region,產生hRegion,而後便可以在Form_MouseDown中來模擬Mouse按
下的效果了。
最後,我也用這個技術模擬Run Time中移動Line 物件,記不記得Line物件只能在Design Time
中來改變位置、大小,Run Time時只能乾瞪眼,這看一下Run Time 移動Line物件
Option Explicit
Const ALTERNATE = 1
Const WINDING = 2
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long, ByVal hBrush As Long) As Long
Private Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Dim hRegion As Long
Dim hBrush As Long
Dim pic1 As New StdPicture
Private Sub Command1_Click()
Call FillRgn(Me.hdc, hRegion, hBrush)
End Sub
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If PtInRegion(hRegion, X, Y) Then
Debug.Print "In 在多邊形區域"
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
DeleteObject hRegion
DeleteObject hBrush
End Sub