IssueVision的PaneCaption控件源码分析

 今天看了看IssueVision的源代码,把学习中的东西记录下来,以免忘掉了。

None.gif '  Custom control that draws the caption for each pane. Contains an active 
None.gif'
 state and draws the caption different for each state. Caption is drawn
None.gif'
 with a gradient fill and antialias font.
None.gif

None.gif
None.gif
Imports  System.Drawing.Drawing2D  ' 使用GDI+绘制渐变背景和表面文字需要引用的类
None.gif
Imports  System.ComponentModel
None.gif
ExpandedBlockStart.gifContractedBlock.gif
Public   Class PaneCaption Class PaneCaption
InBlock.gif    
Inherits System.Windows.Forms.UserControl
InBlock.gif
InBlock.gif    
' const values
InBlock.gif
    '用来控制控件表面文字绘制的属性和控件默认的缺省属性
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Private Class ConstsClass Consts
InBlock.gif        
Public Const DefaultHeight As Integer = 26
InBlock.gif        
Public Const DefaultFontName As String = "Tahoma"
InBlock.gif
        Public Const DefaultFontSize As Integer = 12
InBlock.gif        
Public Const PosOffset As Integer = 4 '文字相对于容器的绘制坐标位移
ExpandedSubBlockEnd.gif
    End Class

InBlock.gif
InBlock.gif    
' internal members
InBlock.gif
    Private m_active As Boolean = False '控件激活和无效两种状态控制
InBlock.gif
    Private m_antiAlias As Boolean = True '用来控制控件表面文字的显示质量
InBlock.gif
    Private m_allowActive As Boolean = True
InBlock.gif    
Private m_text As String = ""
InBlock.gif

InBlock.gif
    '两种状态默认文字、背景渐变颜色
InBlock.gif
    Private m_colorActiveText As Color = Color.Black
InBlock.gif    
Private m_colorInactiveText As Color = Color.White
InBlock.gif
InBlock.gif    
Private m_colorActiveLow As Color = Color.FromArgb(25516578)
InBlock.gif    
Private m_colorActiveHigh As Color = Color.FromArgb(255225155)
InBlock.gif    
Private m_colorInactiveLow As Color = Color.FromArgb(355145)
InBlock.gif    
Private m_colorInactiveHigh As Color = Color.FromArgb(90135215)
InBlock.gif
InBlock.gif    
' gdi objects
InBlock.gif
    '绘制显示效果的笔刷
InBlock.gif
    Private m_brushActiveText As SolidBrush
InBlock.gif    
Private m_brushInactiveText As SolidBrush
InBlock.gif    
Private m_brushActive As LinearGradientBrush
InBlock.gif    
Private m_brushInactive As LinearGradientBrush
InBlock.gif    
Private m_format As StringFormat
InBlock.gif
InBlock.gif
InBlock.gif    
' public properties
InBlock.gif

InBlock.gif    
' the caption of the control
InBlock.gif
    '设置控件中的文本,并且在属性面板中可以选择
InBlock.gif
    <Description("Text displayed in the caption."), _
InBlock.gif    Category(
"Appearance"), DefaultValue("")> _
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Property Caption()Property Caption() As String
InBlock.gif        
Get
InBlock.gif            
Return m_text
InBlock.gif        
End Get
InBlock.gif
InBlock.gif        
Set(ByVal value As String)
InBlock.gif            m_text 
= value
InBlock.gif            Invalidate() 
'重会控件的显示
InBlock.gif
        End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
'两个同样的属性,但是在即使按照上边控制Caption属性的方式来控制Text属性,属性面板中也不显示Text属性,不知动为什么?
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Public Overrides Property Text()Property Text() As String
InBlock.gif        
Get
InBlock.gif            
Return Me.Caption
InBlock.gif        
End Get
InBlock.gif        
Set(ByVal Value As String)
InBlock.gif            Me.Caption 
= Value
InBlock.gif        
End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
' if the caption is active or not
InBlock.gif
    <Description("The active state of the caption, draws the caption with different gradient colors."), _
InBlock.gif    Category(
"Appearance"), DefaultValue(False)> _
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Property Active()Property Active() As Boolean
InBlock.gif        
Get
InBlock.gif            
Return m_active
InBlock.gif        
End Get
InBlock.gif        
Set(ByVal value As Boolean)
InBlock.gif            m_active 
= value
InBlock.gif            Invalidate()
InBlock.gif        
End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
' if should maintain an active and inactive state
InBlock.gif
    <Description("True always uses the inactive state colors, false maintains an active and inactive state."), _
InBlock.gif    Category(
"Appearance"), DefaultValue(True)> _
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Property AllowActive()Property AllowActive() As Boolean
InBlock.gif        
Get
InBlock.gif            
Return m_allowActive
InBlock.gif        
End Get
InBlock.gif        
Set(ByVal value As Boolean)
InBlock.gif            m_allowActive 
= value
InBlock.gif            Invalidate()
InBlock.gif        
End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
' if the caption is active or not
InBlock.gif
    <Description("If should draw the text as antialiased."), _
InBlock.gif     Category(
"Appearance"), DefaultValue(True)> _
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Property AntiAlias()Property AntiAlias() As Boolean
InBlock.gif        
Get
InBlock.gif            
Return m_antiAlias
InBlock.gif        
End Get
InBlock.gif        
Set(ByVal value As Boolean)
InBlock.gif            m_antiAlias 
= value
InBlock.gif            Invalidate()
InBlock.gif        
End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif#Region 
" color properties "
InBlock.gif

InBlock.gif
    <Description("Color of the text when active."), _
InBlock.gif    Category(
"Appearance"), DefaultValue(GetType(Color), "Black")> 
_
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Property ActiveTextColor()Property ActiveTextColor() As Color
InBlock.gif        
Get
InBlock.gif            
Return m_colorActiveText
InBlock.gif        
End Get
InBlock.gif        
Set(ByVal Value As Color)
InBlock.gif            
If Value.Equals(Color.Empty) Then Value = Color.Black
InBlock.gif            m_colorActiveText 
= Value
InBlock.gif            m_brushActiveText 
= New SolidBrush(m_colorActiveText)
InBlock.gif            Invalidate()
InBlock.gif        
End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
<Description("Color of the text when inactive."), _
InBlock.gif    Category(
"Appearance"), DefaultValue(GetType(Color), "White")> _
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Property InactiveTextColor()Property InactiveTextColor() As Color
InBlock.gif        
Get
InBlock.gif            
Return m_colorInactiveText
InBlock.gif        
End Get
InBlock.gif        
Set(ByVal Value As Color)
InBlock.gif            
If Value.Equals(Color.Empty) Then Value = Color.White
InBlock.gif            m_colorInactiveText 
= Value
InBlock.gif            m_brushInactiveText 
= New SolidBrush(m_colorInactiveText)
InBlock.gif            Invalidate()
InBlock.gif        
End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
<Description("Low color of the active gradient."), _
InBlock.gif    Category(
"Appearance"), DefaultValue(GetType(Color), "255, 165, 78")> _
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Property ActiveGradientLowColor()Property ActiveGradientLowColor() As Color
InBlock.gif        
Get
InBlock.gif            
Return m_colorActiveLow
InBlock.gif        
End Get
InBlock.gif        
Set(ByVal Value As Color)
InBlock.gif            
If Value.Equals(Color.Empty) Then Value = Color.FromArgb(25516578)
InBlock.gif            m_colorActiveLow 
= Value
InBlock.gif            CreateGradientBrushes()
InBlock.gif            Invalidate()
InBlock.gif        
End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
<Description("High color of the active gradient."), _
InBlock.gif    Category(
"Appearance"), DefaultValue(GetType(Color), "255, 225, 155")> _
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Property ActiveGradientHighColor()Property ActiveGradientHighColor() As Color
InBlock.gif        
Get
InBlock.gif            
Return m_colorActiveHigh
InBlock.gif        
End Get
InBlock.gif        
Set(ByVal Value As Color)
InBlock.gif            
If Value.Equals(Color.Empty) Then Value = Color.FromArgb(255225155)
InBlock.gif            m_colorActiveHigh 
= Value
InBlock.gif            CreateGradientBrushes()
InBlock.gif            Invalidate()
InBlock.gif        
End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
<Description("Low color of the inactive gradient."), _
InBlock.gif      Category(
"Appearance"), DefaultValue(GetType(Color), "3, 55, 145")> _
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Public Property InactiveGradientLowColor()Property InactiveGradientLowColor() As Color
InBlock.gif        
Get
InBlock.gif            
Return m_colorInactiveLow
InBlock.gif        
End Get
InBlock.gif        
Set(ByVal Value As Color)
InBlock.gif            
If Value.Equals(Color.Empty) Then Value = Color.FromArgb(355145)
InBlock.gif            m_colorInactiveLow 
= Value
InBlock.gif            CreateGradientBrushes()
InBlock.gif            Invalidate()
InBlock.gif        
End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
<Description("High color of the inactive gradient."), _
InBlock.gif      Category(
"Appearance"), DefaultValue(GetType(Color), "90, 135, 215")> _
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Public Property InactiveGradientHighColor()Property InactiveGradientHighColor() As Color
InBlock.gif        
Get
InBlock.gif            
Return m_colorInactiveHigh
InBlock.gif        
End Get
InBlock.gif        
Set(ByVal Value As Color)
InBlock.gif            
If Value.Equals(Color.Empty) Then Value = Color.FromArgb(90135215)
InBlock.gif            m_colorInactiveHigh 
= Value
InBlock.gif            CreateGradientBrushes()
InBlock.gif            Invalidate()
InBlock.gif        
End Set
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif#
End Region
InBlock.gif
InBlock.gif    
' internal properties
InBlock.gif

InBlock.gif    
' brush used to draw the caption
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Private ReadOnly Property TextBrush()Property TextBrush() As SolidBrush
InBlock.gif        
Get
InBlock.gif            
Return CType(IIf(m_active AndAlso m_allowActive, _
InBlock.gif             m_brushActiveText, m_brushInactiveText), SolidBrush)
InBlock.gif        
End Get
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
' gradient brush for the background
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Private ReadOnly Property BackBrush()Property BackBrush() As LinearGradientBrush
InBlock.gif        
Get
InBlock.gif            
Return CType(IIf(m_active AndAlso m_allowActive, _
InBlock.gif             m_brushActive, m_brushInactive), LinearGradientBrush)
InBlock.gif        
End Get
ExpandedSubBlockEnd.gif    
End Property

InBlock.gif
InBlock.gif    
' ctor
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Public Sub New()Sub New()
InBlock.gif        
MyBase.New()
InBlock.gif
InBlock.gif        
' this call is required by the Windows Form Designer
InBlock.gif
        InitializeComponent()
InBlock.gif
InBlock.gif        
' set double buffer styles
InBlock.gif
        '设置双重缓冲,以改善控件的显示效果
InBlock.gif
        Me.SetStyle(ControlStyles.DoubleBuffer Or ControlStyles.UserPaint Or _
InBlock.gif         ControlStyles.AllPaintingInWmPaint 
Or ControlStyles.ResizeRedraw, True)
InBlock.gif
InBlock.gif        
' init the height
InBlock.gif
        Me.Height = Consts.DefaultHeight
InBlock.gif
InBlock.gif        
' format used when drawing the text
InBlock.gif
        m_format = New StringFormat
InBlock.gif        m_format.FormatFlags 
= StringFormatFlags.NoWrap
InBlock.gif        m_format.LineAlignment = StringAlignment.Center '保证控件中文字的垂直对齐效果

InBlock.gif
        '在不完全适合布局形状的字符串中修整字符,指定将文本修整成最接近的字符,并在被修整的行的末尾插入一个省略号
InBlock.gif
        m_format.Trimming = StringTrimming.EllipsisCharacter
InBlock.gif
InBlock.gif        
' init the font
InBlock.gif
        Me.Font = New Font(Consts.DefaultFontName, Consts.DefaultFontSize, FontStyle.Bold)
InBlock.gif
InBlock.gif        
' create gdi objects
InBlock.gif
        Me.ActiveTextColor = m_colorActiveText
InBlock.gif        Me.InactiveTextColor 
= m_colorInactiveText
InBlock.gif
InBlock.gif        
' setting the height above actually does this, but leave
InBlock.gif
        ' in incase change the code (and forget to init the 
InBlock.gif
        ' gradient brushes)
InBlock.gif
        CreateGradientBrushes()
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif    
' internal methods
InBlock.gif

InBlock.gif    
' the caption needs to be drawn
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Protected Overrides Sub OnPaint()Sub OnPaint(ByVal e As PaintEventArgs)
InBlock.gif
InBlock.gif        
MyBase.OnPaint(e)
InBlock.gif        DrawCaption(e.Graphics)
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif    
' draw the caption
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Private Sub DrawCaption()Sub DrawCaption(ByVal g As Graphics)
InBlock.gif        
' background
InBlock.gif
        g.FillRectangle(Me.BackBrush, Me.DisplayRectangle)
InBlock.gif
InBlock.gif        
' caption
InBlock.gif
        If m_antiAlias Then
InBlock.gif            
'控制文本呈现模式,指定在无提示的情况下使用每个字符的 AntiAlias
InBlock.gif
            '标志符号位图来绘制字符。由于采用了 AntiAlias,质量会得到改善。
InBlock.gif
            '由于关闭了提示,主干宽度差可能会比较明显。
InBlock.gif
            g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
InBlock.gif        End If
InBlock.gif
InBlock.gif        
' need a rectangle when want to use ellipsis
InBlock.gif
        '绘制区域相对于控件有一定的位移
InBlock.gif
        Dim bounds As RectangleF = New RectangleF(Consts.PosOffset, 0, _
InBlock.gif         Me.DisplayRectangle.Width 
- Consts.PosOffset, Me.DisplayRectangle.Height)
InBlock.gif
InBlock.gif        g.DrawString(m_text, Me.Font, Me.TextBrush, bounds, m_format)
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif    
' clicking on the caption does not give focus,
InBlock.gif
    ' handle the mouse down event and set focus to self
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Protected Overrides Sub OnMouseDown()Sub OnMouseDown(ByVal e As MouseEventArgs)
InBlock.gif        
MyBase.OnMouseDown(e)
InBlock.gif        
If Me.m_allowActive Then Me.Focus()
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Protected Overrides Sub OnSizeChanged()Sub OnSizeChanged(ByVal e As System.EventArgs)
InBlock.gif        
MyBase.OnSizeChanged(e)
InBlock.gif
InBlock.gif        
' create the gradient brushes based on the new size
InBlock.gif
        CreateGradientBrushes()
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Private Sub CreateGradientBrushes()Sub CreateGradientBrushes()
InBlock.gif        
' can only create brushes when have a width and height
InBlock.gif
        If Me.Width > 0 AndAlso Me.Height > 0 Then
InBlock.gif            
If Not (m_brushActive Is NothingThen m_brushActive.Dispose()
InBlock.gif            m_brushActive 
= New LinearGradientBrush(Me.DisplayRectangle, _
InBlock.gif             m_colorActiveHigh, m_colorActiveLow, LinearGradientMode.Vertical)
InBlock.gif
InBlock.gif            
If Not (m_brushInactive Is NothingThen m_brushInactive.Dispose()
InBlock.gif            m_brushInactive 
= New LinearGradientBrush(Me.DisplayRectangle, _
InBlock.gif              m_colorInactiveHigh, m_colorInactiveLow, LinearGradientMode.Vertical)
InBlock.gif        
End If
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif
InBlock.gif#Region 
" Windows Form Designer generated code "
InBlock.gif

InBlock.gif
    'UserControl overrides dispose to clean up the component list.
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Protected Overloads Overrides Sub Dispose()Sub Dispose(ByVal disposing As Boolean)
InBlock.gif        
If disposing Then
InBlock.gif            
If Not (components Is NothingThen
InBlock.gif                components.Dispose()
InBlock.gif            
End If
InBlock.gif        
End If
InBlock.gif        
MyBase.Dispose(disposing)
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif    
'Required by the Windows Form Designer
InBlock.gif
    Private components As System.ComponentModel.IContainer
InBlock.gif
InBlock.gif    
'NOTE: The following procedure is required by the Windows Form Designer
InBlock.gif
    'It can be modified using the Windows Form Designer.  
InBlock.gif
    'Do not modify it using the code editor.
ExpandedSubBlockStart.gifContractedSubBlock.gif
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()Sub InitializeComponent()
InBlock.gif        
'
InBlock.gif
        'PaneCaption
InBlock.gif
        '
InBlock.gif
        Me.Name = "PaneCaption"
InBlock.gif
        Me.Size = New System.Drawing.Size(15030)
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif#
End Region
InBlock.gif
ExpandedBlockEnd.gif
End Class

None.gif


这是个很简单的控件,但是我想对初学者应该是有帮助的,主要体现在以下几点:

背景的渐变绘制

表面文字质量的控制

设计过程中的控件绘制控制

文字与控件调整的关系

属性面板的控制

总结一下:
由于是第一次学习制作控件,看看这个源代码对自己的帮助是很大的,在.Net中制作控件相对于VB可能略微复杂一点,但是效果要好很多,在我们现有的项目中原先的Panel控件完全是结合图片+Label来制作的,灵活性和资源利用率要差很多,采用GDI+来绘制控件,效果和质量要好很多。看这段代码应该对组件的制作和GDI+能有更好的理解和认识。

在自己仿照的编写过程中,基本上是看代码和帮助来完成的,发生了两个很笨的事情,一个是设计完组件,没有编译便想使用,结果控件无法使用,所有如果在项目中控件修改了,至少要编译一次在使用。另一个是设计完的控件找不到,后来在工具箱中找到我得用户控件才找到,笨呀.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值