开发者

C# Winforms Panel with same style (shadow) as TabControl?

开发者 https://www.devze.com 2022-12-15 14:19 出处:网络
I want a panel to have some sort of dropshadow like the TabControl has, is开发者_如何学编程 this possible?BorderStyle = Fixed3D

I want a panel to have some sort of dropshadow like the TabControl has, is开发者_如何学编程 this possible?


BorderStyle = Fixed3D

take a look for the shadow in this example:

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

Finally, the custom panel could be like (in 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


yes, in the paint event of your panel, use something like this:

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

精彩评论

暂无评论...
验证码 换一张
取 消