A megvalósításhoz készítünk tehát egy új kontrolt a Control osztályból származtatva. E kontrol három új property-t tartalmaz.
- Hole: itt határozhatjuk meg, hogy a „bélyeg” szélén mekkorák legyenek a lyukak.
- Margin: a kontrol széle és a kép közötti margó méretét adja meg.
- Bitmap: itt adhatjuk meg a megjelenítendő képet.
Felülírva a kontrol OnPaint függvényét elvégezhetjük a kirajzolást, mely igen egyszerű: ha lett betöltve kép a Bitmap property-be, akkor a Graphics osztály DrawImage függvényével kirajzoljuk, figyelembe véve a kontrol méretét és a megadott margót.
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
If Not (fbitmap Is Nothing) Then
e.Graphics.DrawImage(fbitmap, Rectangle.Inflate(ClientRectangle, -fmargin, -fmargin))
End If
End Sub 'OnPaint
Kissé bonyolultabb feladat a „bélyeg” szélének elkészítése. Ahhoz, hogy a kontrol széle „lyukas” legyen, egy olyan régiót kell készítenünk, mely pontosan megfelel a bélyeg kinézetének.
Private Sub UpdateRegion()
Dim i As Integer
Dim s2 As Integer = fhole / 2
Dim inc As Integer = fhole + fhole / 3
Ezt a kinézetet egy GraphicsPath osztállyal írjuk le.
Dim gp As New GraphicsPath()
Szükségünk lesz két ciklusra, mely végigmegy a kontrol vízszintes és függőleges élein. Mindkét ciklusban két-két AddEllipse függvényhívást végzünk, mely a GrahphicsPath-hoz köröket ad hozzá. Ezek a körök lesznek a kontrol szélein látható lyukak. Ha ügyesen pozícionáljuk ezeket a köröket, akkor a kontrol szélén mindig csak a körök fele jelenik meg, és így egy igazi bélyeg kinézetét adják majd.
For i = 0 To Width - inc Step inc
gp.AddEllipse(i, -s2, fhole, fhole)
gp.AddEllipse(i, Height - s2, fhole, fhole)
Next i
For i = 0 To Height - inc Step inc
gp.AddEllipse(-s2, i, fhole, fhole)
gp.AddEllipse(Width - s2, i, fhole, fhole)
Next i
Adott tehát egy GraphicsPath, melyben egy téglalap élein elhelyezett körök vannak. Létrehozunk most egy régiót, mely teljesen lefedi a kontrolkliens területét. Ezt követően a Region osztály Exclude függvényét meghívva kizárjuk e régióból azt a területet, melyet a GraphicsPath osztályunk példánya ír le, vagyis a kontrol szélén lévő körök kiesnek a régióból.
Dim r As New [Region](Me.ClientRectangle)
r.Exclude(gp)
Most már a régió megfelelő alakú egy bélyeghez képest, így nincs más teendőnk, mint ezt a régiót beállítani a kontrol régiójának.
Me.Region = r
End Sub 'UpdateRegion