2010-01-07 54 views

回答

2

邊框= Fixed3D

採取在這個例子中的樣子的陰影:

http://www.onteorasoftware.com/downloads/panelwithshadow.zip

最後,自定義的面板也能像(在VB):

Imports System.Drawing.Drawing2D 

Public Class ShadowPanel 
    Inherits Panel 

    Declare Function GetWindowDC Lib "user32" Alias "GetWindowDC" (ByVal hwnd As IntPtr) _ 
       As IntPtr 
    Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As IntPtr, _ 
     ByVal hdc As IntPtr) As Integer 

    Public Sub New() 
    Me.BorderStyle = BorderStyle.Fixed3D 
    End Sub 

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
    Const WM_NCPAINT As Integer = &H85 

    If m.Msg = WM_NCPAINT Then 
     Dim hdc As IntPtr = GetWindowDC(m.HWnd) 
     Dim g As Graphics = Graphics.FromHdc(hdc) 
     Dim rDraw As Rectangle = New Rectangle(0, 0, Me.Width - 1, Me.Height - 1) 

     Dim pBottom As Pen = New Pen(Color.Gray, 3) 
     Dim pTop As Pen = New Pen(Color.White, 3) 

     g.DrawRectangle(pBottom, rDraw) 

     Dim pts(2) As Point 

     pts(0) = New Point(0, Me.Height - 1) 
     pts(1) = New Point(0, 0) 
     pts(2) = New Point(Me.Width - 1, 0) 

     g.DrawLines(pTop, pts) 
     ReleaseDC(Me.Handle, hdc) 
    Else 
     MyBase.WndProc(m) 
    End If 
    End Sub 

    Private Sub ParentPaint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint 
    Dim g As Graphics = Me.Parent.CreateGraphics 

    'this matrix zooms the text out to 1/4 size and offsets it by a little right and down 
    Dim mx As New Matrix(1.0F, 0, 0, 1.0F, 4, 4) 
    Dim rdraw As New Rectangle(Me.Left, Me.Top, Me.Width, Me.Height) 

    g.Transform = mx 

    g.FillRectangle(New SolidBrush(Color.FromArgb(128, Color.Black)), rdraw) 
    g.Dispose() 
    End Sub 
End Class 
+0

+1,簡單>油漆! – Pondidum 2010-01-07 14:52:43

+0

這給了面板一個內嵌的外觀,我希望它能夠投下陰影...... – MysticEarth 2010-01-07 15:10:32

+0

@Earth:看我的編輯。 – serhio 2010-01-07 15:31:05

0

是的,在你的面板的繪畫事件中,使用這樣的東西:

void Paint(object sender, PaintEventArgs e) { 
    TabRenderer.DrawTabPage(e.Graphics, e.Bounds); 
} 
+0

例外聲明視覺樣式未啓用...(this.Bounds) – serhio 2010-01-07 15:05:17

+0

與panel.Bounds一起使用。 e不包含邊界 – MysticEarth 2010-01-07 15:11:05

+0

@MysticEarth:Pondidum意在創建一個自定義的'myPanel:Panel'並覆蓋OnPaint,不是嗎? – serhio 2010-01-07 15:28:00