Click here to Skip to main content
13,259,194 members (49,078 online)
Click here to Skip to main content
Add your own
alternative version


11 bookmarked
Posted 10 Dec 2009

Twinkle twinkle little star

, 8 Oct 2012
Rate this:
Please Sign up or sign in to vote.
How to make irregular shaped forms in VB.NET.


Once upon a time, I needed to impress my boss. We had to have our annual discussion about salary. So I wrote an application showing my "very advanced programming skills".


Now I have translated this fabulous application to VB.NET.

Using the code

Just run the code, and you will see all the magnificent results the code produces.

Points of interest

The basic APIs:

Structure RECT
    Public Left As Int32
    Public Top As Int32
    Public Right As Int32
    Public Bottom As Int32
End Structure
Public Structure POINTAPI
    Dim X As Int32
    Dim Y As Int32
End Structure
    Declare Function DeleteObject Lib "gdi32" (ByVal hObject As IntPtr) As Boolean
    Declare Function GetStockObject Lib "gdi32.dll" (ByVal nIndex As Int32) As IntPtr
    Declare Function GetWindowRgn Lib "user32" (ByVal hwnd As IntPtr,
        ByVal hRgn As IntPtr) As IntPtr
    Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As IntPtr,
        ByVal hRgn As IntPtr, ByVal bRedraw As Boolean) As Int32
    'for round form
    Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Int32, ByVal Y1 As Int32,
        ByVal X2 As Int32, ByVal Y2 As Int32, ByVal X3 As Int32, ByVal Y3 As Int32) As IntPtr
    'for star form
    Declare Function CreatePolygonRgn Lib "gdi32" (ByRef lpPoint As POINTAPI,
        ByVal nCount As Int32, ByVal nPolyFillMode As Int32) As IntPtr
    'for elliptic form
    Declare Function CreateEllipticRgn Lib "gdi32.dll" (ByVal X1 As Int32,
        ByVal Y1 As Int32, ByVal X2 As Int32, ByVal Y2 As Int32) As IntPtr
    Declare Function CreateRectRgn Lib "gdi32.dll" (ByVal X1 As Int32, ByVal Y1 As Int32,
        ByVal X2 As Int32, ByVal Y2 As Int32) As IntPtr
    Declare Function GetWindowDC Lib "user32" (ByVal hWnd As IntPtr) As IntPtr
    Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As IntPtr,
        ByVal hdc As IntPtr) As Int32
    'for frame of form
    Declare Function FrameRgn Lib "gdi32" (ByVal hdc As IntPtr, ByVal hRgn As IntPtr,
        ByVal hBrush As IntPtr, ByVal nWidth As Int32, ByVal nHeight As Int32) As IntPtr
    Private Const BLACK_BRUSH As Int32 = 4

(Note: POINTAPI is not in the framework.)

The making of the star:

Private Sub MakePolygonForm(ByVal InForm As Form, ByVal Offset As Single)
    Const WINDING As Int32 = 2
    Const RADIEKONVERT As Double = 3.1416 / 180
    Const GRADER As Int32 = 360
    Const MAXRADER As Int32 = 200
    'change this to 6 for a David star, try alsso 5,7,8,9,10
    Const SPETSAR As Int32 = 7
    Dim x, y As Int32
    Dim xCenter, yCenter, Radie, Punkter, I As Int32
    Dim Vinkel As Double
    Dim Rotation As Int32
    Dim arPoints(MAXRADER) As POINTAPI
    Dim RECT As RECT
    Dim rgn As IntPtr
    RECT.Right = 300
    RECT.Left = 0
    RECT.Top = 0
    RECT.Bottom = 300
    xCenter = CInt((RECT.Right - RECT.Left) / 2)
    yCenter = CInt((RECT.Bottom - RECT.Top) / 2)
    Rotation = CInt(GRADER / (2 * SPETSAR))
    Punkter = 2 * SPETSAR
    Radie = yCenter
    For I = 0 To Punkter - 1
        If (I Mod 2) = 0 Then
            Radie = CInt((Radie / 2))
            Radie = yCenter
        End If
        'remove Offset to make it stay put: Vinkel = I * Rotation * RADIEKONVERT
        Vinkel = I * Rotation * RADIEKONVERT + Offset
        x = CInt(xCenter + (System.Math.Cos(Vinkel) * Radie))
        y = CInt(yCenter + (System.Math.Sin(Vinkel) * Radie))
        arPoints(I).X = x
        arPoints(I).Y = y
    rgn = CreatePolygonRgn(arPoints(0), Punkter, WINDING)
    Call SetWindowRgn(Me.Handle, rgn, True)
    If CInt(rgn) <> 0 Then DeleteObject(rgn)
End Sub

If you want another form of the form, use:




You can adjust the thickness of the frame in FrameRgn:

Private Function FrameWindowRgn(ByVal hwnd As IntPtr) As IntPtr
Dim hRgn,hDC As IntPtr
hDC = GetWindowDC(hwnd)   ' Get a DC for non-client area
If CInt(hDC) <>   0 Then
hRgn = CreateRectRgn(0, 0, 0, 0) ' Create empty region
If CInt(hRgn) <>      0 Then
If CInt(GetWindowRgn(hwnd, hRgn)) <> 0 Then
' to make border thicker, adjust the 2:s to something else
FrameWindowRgn = FrameRgn(hDC,hRgn, GetStockObject(BLACK_BRUSH), 2, 2) ' Draw the frame
End If
End If
End If
If CInt(hRgn)  <>  0 Then DeleteObject(hRgn) 'release resources
If CInt(hDC)  <>  0 Then  ReleaseDC(hwnd, hDC) 'release resources
End Function


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Michael Rosqvist
Web Developer
Sweden Sweden
No Biography provided

You may also be interested in...

Comments and Discussions

GeneralMy vote of 2 Pin
Mr.PoorEnglish11-Jan-10 0:07
memberMr.PoorEnglish11-Jan-10 0:07 
GeneralIf you want to move the star Pin
Michael Rosqvist4-Jan-10 10:17
memberMichael Rosqvist4-Jan-10 10:17 
GeneralA more NETtish way of drawing the star [modified] Pin
Michael Rosqvist16-Dec-09 6:45
memberMichael Rosqvist16-Dec-09 6:45 
GeneralMy vote of 2 Pin
PSU Steve15-Dec-09 4:25
memberPSU Steve15-Dec-09 4:25 
GeneralMy vote of 1 Pin
Richard MacCutchan13-Dec-09 11:19
memberRichard MacCutchan13-Dec-09 11:19 
Generalcool Pin
Christ Kennedy10-Dec-09 20:27
memberChrist Kennedy10-Dec-09 20:27 
GeneralRe: cool [modified] Pin
Michael Rosqvist10-Dec-09 20:30
memberMichael Rosqvist10-Dec-09 20:30 
GeneralMy vote of 1 Pin
xliqz10-Dec-09 8:40
memberxliqz10-Dec-09 8:40 
GeneralRe: My vote of 1 [No you are a troll] Pin
TheArchitectmc30-Dec-09 7:54
memberTheArchitectmc30-Dec-09 7:54 
GeneralAll Right, Then Pin
sam.hill10-Dec-09 6:58
membersam.hill10-Dec-09 6:58 
GeneralMy vote of 1 Pin
William John Adam Trindade10-Dec-09 6:41
memberWilliam John Adam Trindade10-Dec-09 6:41 
GeneralRe: My vote of 1 Pin
Michael Rosqvist10-Dec-09 7:32
memberMichael Rosqvist10-Dec-09 7:32 
GeneralRe: My vote of 4 Pin
NightJammer10-Dec-09 18:48
memberNightJammer10-Dec-09 18:48 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.171114.1 | Last Updated 8 Oct 2012
Article Copyright 2009 by Michael Rosqvist
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid