1. 程式人生 > 實用技巧 >一閃一閃小星星

一閃一閃小星星

介紹 很久以前,我需要給我的老闆留下深刻印象。我們不得不年度討論薪水。所以我寫了一個應用程式顯示“非常先進的程式設計技能”。 背景 現在我有翻譯這個令人難以置信的VB.NET應用程式。 使用的程式碼 執行程式碼,您將看到所有的結果產生的程式碼。 的興趣點 基本api: 隱藏,收縮,複製Code

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

(注意:POINTAPI不在框架。) 恆星的製作: 隱藏,收縮,複製Code

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))
        Else
            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
    Next
    rgn = CreatePolygonRgn(arPoints(0), Punkter, WINDING)
    Call SetWindowRgn(Me.Handle, rgn, True)
    If CInt(rgn) <> 0 Then DeleteObject(rgn)
End Sub

如果你想要另一種形式的表單,使用: 隱藏,複製Code

MakeRoundForm(Me)

或者: 隱藏,複製Code

MakeEllipticForm(Me)

你可以調整FrameRgn框架的厚度: 隱藏,複製Code

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

本文轉載於:http://www.diyabc.com/frontweb/news8438.html