图像按钮基础

介绍 Image_Button/Form1_2011-11-18_18-10-14.pngImage_Button/Image_Button_Demo_2011-11-18_10-28-53.png ImageButton演示 ImageButtonBase是使用图像作为设计的自定义按钮。 背景 使用图像作为按钮设计,我们不能使用常规绘制方法,如果使用常规绘制方法的问题是,当控制尺寸大于正常尺寸时,图像会模糊。 左:正常图像调整前,右:图像调整后大尺寸。 为了使图像不模糊,解决办法是将图像切成9个部分,然后在控件上绘制这些部分。 9段按钮图像。 原始图像 切片图像 切片图像放置说明。 描述:图片上左上中,上右中,左中,中,右下,左下,中,右 切片图像 要将图像切成9个部分,我们必须剪裁图像。我使用下面的功能来裁剪图像: 隐藏,复制Code

''' <summary>
''' Crop image
''' </summary>
''' <paramname="sImage">Source bitmap</param>
''' <paramname="x">X location</param>
''' <paramname="y">Y location</param>
''' <paramname="w">Width</param>
''' <paramname="h">Height</param>
''' <returns>Cropped image</returns>
''' <remarks></remarks>
Private Function CropImage(ByVal sImage As Bitmap, _
                ByVal x As Integer, ByVal y As Integer, _
                ByVal w As Integer, ByVal h As Integer)
    If w <= 0 Or h <= 0 Then
    Return New Bitmap(1, 1)
    End If
    Dim bmp As New Bitmap(w, h)
    bmp.SetResolution(96, 96)
    Using g As Graphics = Graphics.FromImage(bmp)
        g.DrawImageUnscaled(sImage, -x, -y)
    End Using
    Return bmp
End Function

在这个项目中,我使用类TileImages来生成切片图像:收缩,复制Code

     Public Class TileImages
        Implements IDisposable

        Public Sub New(ByVal img As Bitmap, ByVal column As Integer, ByVal row As Integer)
            Me._SpritImage = img
            _SpritImage.SetResolution(96, 96)
            Me._Column = column
            Me._Row = row
            BuildList()
        End Sub

        Private lst As New List(Of Bitmap)
        Private Sub BuildList()
            lst.Clear()
            If IsNothing(_SpritImage) Then
                Return
            End If
            _ItemWidth = _SpritImage.Width / _Column
            _ItemHeight = _SpritImage.Height / _Row
            If _ItemWidth * _Column < _SpritImage.Width Then
                _ItemWidth += 1
            End If
            If _ItemHeight * _Row < _SpritImage.Height Then
                _ItemHeight += 1
            End If
            For r As Integer = 0 To _Row - 1
                For c As Integer = 0 To _Column - 1
                    lst.Add(CropImage(_SpritImage, c * _ItemWidth, _
                                    r * _ItemHeight, _ItemWidth, _ItemHeight))
                Next
            Next
        End Sub

        ''' <summary>
        ''' Zero base index
        ''' </summary>
        ''' <paramname="row">Row of image with zero based index</param>
        ''' <paramname="column">Column of image with zero based index</param>
        ''' <returns>Bitmap</returns>
        ''' <remarks></remarks>
        Public Function GetImage(ByVal row As Integer, _
                                Optional ByVal column As Integer = 0) As Bitmap
            If row < 0 Or column < 0 Then
                Return Nothing
            End If
            Return lst(row * _Column + column)
        End Function

        Private _SpritImage As Bitmap
        Public Property SpritImage() As Bitmap
            Get
                Return _SpritImage
            End Get
            Set(ByVal value As Bitmap)
                _SpritImage = value
		If Not IsNothing(_spritImage)
			_SpritImage.SetResolution(96, 96)
		End If
                BuildList()
                Me.OnSpritImageChanged(EventArgs.Empty)
            End Set
        End Property

        Public Event SpritImageChanged _
    (ByVal sender As Object, ByVal e As System.EventArgs)
        Protected Overridable Sub OnSpritImageChanged(ByVal e As System.EventArgs)
            RaiseEvent SpritImageChanged(Me, e)
        End Sub

        Private _Column As Integer = 1
        Public Property Column() As Integer
            Get
                Return _Column
            End Get
            Set(ByVal value As Integer)
                _Column = value
                BuildList()
                Me.OnColumnChanged(EventArgs.Empty)
            End Set
        End Property

        Public Event ColumnChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        Protected Overridable Sub OnColumnChanged(ByVal e As System.EventArgs)
            RaiseEvent ColumnChanged(Me, e)
        End Sub

        Private _Row As Integer = 1
        Public Property Row() As Integer
            Get
                Return _Row
            End Get
            Set(ByVal value As Integer)
                _Row = value
                BuildList()
                Me.OnRowChanged(EventArgs.Empty)
            End Set
        End Property

        Public Event RowChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        Protected Overridable Sub OnRowChanged(ByVal e As System.EventArgs)
            RaiseEvent RowChanged(Me, e)
        End Sub

        Private _ItemWidth As Integer
        Public ReadOnly Property ItemWidth() As Integer
            Get
                Return _ItemWidth
            End Get
        End Property

        Private _ItemHeight As Integer
        Public ReadOnly Property ItemHeight() As Integer
            Get
                Return _ItemHeight
            End Get
        End Property

        ''' <summary>
        ''' Crop image
        ''' </summary>
        ''' <paramname="sImage">Source bitmap</param>
        ''' <paramname="x">X location</param>
        ''' <paramname="y">Y location</param>
        ''' <paramname="w">Width</param>
        ''' <paramname="h">Height</param>
        ''' <returns>Cropped image</returns>
        ''' <remarks></remarks>
        Private Function CropImage(ByVal sImage As Bitmap, _
                                    ByVal x As Integer, ByVal y As Integer, _
                                    ByVal w As Integer, ByVal h As Integer)
            If w <= 0 Or h <= 0 Then
                Return New Bitmap(1, 1)
            End If
            Dim bmp As New Bitmap(w, h)
            bmp.SetResolution(96, 96)
            Using g As Graphics = Graphics.FromImage(bmp)
                g.DrawImageUnscaled(sImage, -x, -y)
            End Using
            Return bmp
        End Function


#Region " IDisposable Support "
        Private disposedValue As Boolean = False        ' To detect redundant calls

        ' IDisposable
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    ' TODO: free unmanaged resources when explicitly called
                End If
                lst.Clear()
                ' TODO: free shared unmanaged resources
            End If
            Me.disposedValue = True
        End Sub

        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  
            ' Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region

    End Class      

画的图片 这个控件有4个按钮状态,每个状态都有一个图像: 美国: State  Image  Normal  HoverPressedActive 为了在控件上绘制图像,首先我在方法OnSizeChanged中调用方法GenenerateStrechedImage(你可以在类RipsWareImageButtonBase中找到这个方法)的控件调整大小后在位图上绘制一个切片图像,然后我使用该位图在控件上绘制。 使用的代码 使用RipsWareButtonBase RipsWareImageButtonBase是RipsWareButtonBase类的继承,我为多功能按钮创建了类RipsWareButtonBase,所以你可以使用这个类来创建你自己的按钮与你自己的绘制方法。 RipsWareButtonBase的使用: 隐藏,收缩,复制Code

Public Class TestButton
    Inherits RipsWareButtonBase

    Protected Overrides Sub DrawNormalState(ByRef g As System.Drawing.Graphics)
        MyBase.DrawNormalState(g)
        'Draw the normal image state here
    End Sub

    Protected Overrides Sub DrawHoverState(ByRef g As System.Drawing.Graphics)
        MyBase.DrawHoverState(g)
        'Draw the hover image state here
    End Sub

    Protected Overrides Sub DrawPressedState(ByRef g As System.Drawing.Graphics)
        MyBase.DrawPressedState(g)
        'Draw the pressed state here
    End Sub

    Protected Overrides Sub DrawActiveState(ByRef g As System.Drawing.Graphics)
        MyBase.DrawActiveState(g)
        'Draw the active or focused state here
    End Sub

    Protected Overrides Sub DrawDisabledState(ByRef g As System.Drawing.Graphics)
        MyBase.DrawDisabledState(g)
        'Draw the disable state here
    End Sub

End Class

使用RipsWareImageButtonBase 要使用此控件,只需像上图那样将该控件拖放到窗体设计器中。 项目结构 ImageButton.sln 包含imagebuttondesigner的imagebuttonbase设计器。 ImageButtonDemo.sln vb -测试类 历史 01/11/2011第一次创建 参考文献 SSDiver2112使用UITypeEditors (VB.NET)进行丰富的设计时编辑。 本文转载于:http://www.diyabc.com/frontweb/news788.html

原文地址:https://www.cnblogs.com/Dincat/p/13456113.html