65.9K
CodeProject is changing. Read more.
Home

Glass Message Box in .NET

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (5 votes)

Jul 11, 2012

CPOL
viewsIcon

27814

downloadIcon

566

Custom glass message box for WinForms development.

Introduction

In my software development career, I have seen many types of message boxes. In VB 6.0: MsgBox(“ ……”). In .NET: MessageBox.Show(“……”). But all message boxes are dull looking. This article demonstrates a smooth, glass effect message box for Windows based development.

Using the Code

The following is the main part of this control. The MakeMessage function generates a message box according to the string size.

Private Shared Function MakeMessage(ByVal WinText As String, _
                                    ByVal WinHeader As String, _
                                    ByVal WinIcon As MessageBoxIcon, _
                                    ByVal WinButtons As MessageBoxButtons, _
                                    ByVal WinDefault As MessageBoxDefaultButton) As DialogResult

    ObjWinMessage = Nothing
    ObjWinMessage = New Glass()

    MessageText = "" : MessageText = WinText
    HeaderText = "" : HeaderText = WinHeader

    FormWidth = 0 : FormHeight = 0
    HeaderWidth = 0
    MsgWidth = 0 : MsgHeight = 0
    WinReturn = 0

    REM Check Message And Header Text Length When Equal To Zero
    If MessageText.Trim().Length = 0 And HeaderText.Trim().Length = 0 Then

        FormSize = New Size(305, 135)
        FormWidth = 305 : FormHeight = 135
        WinMsg.Size = New Size(FormSize.Width, FormSize.Height)

        GoTo Mess

    End If

    HeaderWidth = StringSize(HeaderText.Trim(), MaxWidth, WinFnt).Width
    MessageSize = StringSize(MessageText.Trim(), MaxWidth, WinFnt)
    MsgWidth = MessageSize.Width : MsgHeight = MessageSize.Height

    If HeaderText.Trim().Length > 0 And MessageText.Trim().Length = 0 Then

        HeaderWidth = HeaderWidth + 80
        WinReturn = Math.Max(HeaderWidth, 305)
        FormSize = New Size(WinReturn, 135)
        FormWidth = FormSize.Width : FormHeight = FormSize.Height

        GoTo Mess

    End If

    HeaderWidth = HeaderWidth + 80
    FormWidth = MsgWidth + 60
    FormHeight = MsgHeight + 120

    If HeaderText.Trim().Length = 0 And MessageText.Trim().Length > 0 Then

        FormWidth = Math.Max(FormWidth, 305)
        FormHeight = Math.Max(FormHeight, 135)
        FormSize = New Size(FormWidth, FormHeight)
        FormWidth = FormSize.Width : FormHeight = FormSize.Height

        GoTo Mess

    End If

    If HeaderText.Trim().Length > 0 And MessageText.Trim().Length > 0 Then

        WinReturn = Math.Max(HeaderWidth, FormWidth)
        FormWidth = Math.Max(WinReturn, 305)
        FormHeight = Math.Max(FormHeight, 135)
        FormSize = New Size(FormWidth, FormHeight)
        FormWidth = FormSize.Width : FormHeight = FormSize.Height

        GoTo Mess

    End If

Mess:
    Call CreateBaseScreen()

    Call CreateHeader()
    Call CreateMessageIcon()
    Call CreateMeaasge()

    Call AddToBaseScreen()

    WinMessage.Text = WinText
    LblHeader.Text = WinHeader

    Select Case WinIcon

        Case MessageBoxIcon.Asterisk
            PicIcon.Image = Drawing.SystemIcons.Asterisk.ToBitmap()
        Case MessageBoxIcon.Error
            PicIcon.Image = Drawing.SystemIcons.Error.ToBitmap()
        Case MessageBoxIcon.Exclamation
            PicIcon.Image = Drawing.SystemIcons.Exclamation.ToBitmap()
        Case MessageBoxIcon.Hand
            PicIcon.Image = Drawing.SystemIcons.Hand.ToBitmap()
        Case MessageBoxIcon.Information
            PicIcon.Image = Drawing.SystemIcons.Information.ToBitmap()
        Case MessageBoxIcon.None
            PicIcon.Image = Nothing
        Case MessageBoxIcon.Question
            PicIcon.Image = Drawing.SystemIcons.Question.ToBitmap()
        Case MessageBoxIcon.Stop
            PicIcon.Image = Drawing.SystemIcons.Error.ToBitmap()
        Case MessageBoxIcon.Warning
            PicIcon.Image = Drawing.SystemIcons.Warning.ToBitmap()

    End Select

    Call CreateMessageButtons(WinButtons)

    Select Case WinButtons

        Case MessageBoxButtons.AbortRetryIgnore

            Select Case WinDefault
                Case MessageBoxDefaultButton.Button1
                    CmdAbort.Select()
                    CmdAbort.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button2
                    CmdRetry.Select()
                    CmdRetry.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button3
                    CmdIgnore.Select()
                    CmdIgnore.Focus() : Exit Select

            End Select

        Case MessageBoxButtons.OK

            Select Case WinDefault
                Case MessageBoxDefaultButton.Button1
                    CmdOk.Select()
                    CmdOk.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button2
                    CmdOk.Select()
                    CmdOk.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button3
                    CmdOk.Select()
                    CmdOk.Focus() : Exit Select

            End Select

        Case MessageBoxButtons.OKCancel

            Select Case WinDefault
                Case MessageBoxDefaultButton.Button1
                    CmdOk.Select()
                    CmdOk.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button2
                    CmdCancel.Select()
                    CmdCancel.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button3
                    CmdCancel.Select()
                    CmdCancel.Focus() : Exit Select

            End Select

        Case MessageBoxButtons.RetryCancel

            Select Case WinDefault
                Case MessageBoxDefaultButton.Button1
                    CmdRetry.Select()
                    CmdRetry.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button2
                    CmdCancel.Select()
                    CmdCancel.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button3
                    CmdCancel.Select()
                    CmdCancel.Focus() : Exit Select

            End Select

        Case MessageBoxButtons.YesNo

            Select Case WinDefault
                Case MessageBoxDefaultButton.Button1
                    CmdYes.Select()
                    CmdYes.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button2
                    CmdNo.Select()
                    CmdNo.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button3
                    CmdNo.Select()
                    CmdNo.Focus() : Exit Select

            End Select

        Case MessageBoxButtons.YesNoCancel

            Select Case WinDefault
                Case MessageBoxDefaultButton.Button1
                    CmdYes.Select()
                    CmdYes.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button2
                    CmdNo.Select()
                    CmdNo.Focus() : Exit Select
                Case MessageBoxDefaultButton.Button3
                    CmdCancel.Select()
                    CmdCancel.Focus() : Exit Select

            End Select

    End Select

    WinMsg.Refresh()
    WinMsg.ShowDialog()

    Return WinMake

End Function

Measure String

This function helps to size the message box according to the font size:

Private Shared Function StringSize(ByVal WinMsgText As String, _
                                       ByVal WinWdth As Integer, _
                                       ByVal WinFnt As Font) As Size

    Dim GRA As Graphics = WinMsg.CreateGraphics()
    Dim SZF As SizeF = GRA.MeasureString(WinMsgText, WinFnt, WinWdth)

    GRA.Dispose()

    Dim SZ As New Size(DirectCast(Convert.ToInt16(SZF.Width + 100), Int16), _
                       DirectCast(Convert.ToInt16(SZF.Height), Int16))

    Return SZ

End Function

The Painting Part of the Message Box

Private Shared Sub WinMsg_Paint(ByVal sender As Object, _
              ByVal e As System.Windows.Forms.PaintEventArgs) Handles WinMsg.Paint

    Dim MGraphics As Graphics = e.Graphics
    Dim MPen As New Pen(Color.FromArgb(96, 155, 173), 1)

    Dim Area As New Rectangle(0, 0, WinMsg.Width - 1, WinMsg.Height - 1)
    Dim LGradient As New LinearGradientBrush(Area, Color.FromArgb(166, 197, 227), _
                                             Color.FromArgb(245, 251, 251), _
                                             LinearGradientMode.BackwardDiagonal)

    With MGraphics

        .CompositingMode = CompositingMode.SourceOver
        .CompositingQuality = CompositingQuality.HighQuality
        .InterpolationMode = InterpolationMode.HighQualityBicubic
        .PixelOffsetMode = PixelOffsetMode.HighSpeed

        .FillRectangle(LGradient, Area)
        .DrawRectangle(MPen, Area)

    End With

    LGradient.Dispose()
    MPen.Dispose()

End Sub

Private Shared Sub LblHeader_Paint(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.PaintEventArgs) Handles LblHeader.Paint

    Dim MGraphics As Graphics = e.Graphics
    Dim MPen As New Pen(Color.FromArgb(96, 155, 173), 1)

    Dim Area As New Rectangle(0, 0, LblHeader.Width - 1, LblHeader.Height - 1)
    Dim LGradient As New LinearGradientBrush(Area, Color.FromArgb(166, 197, 227), _
                                             Color.FromArgb(245, 251, 251), _
                                             LinearGradientMode.BackwardDiagonal)

    With MGraphics

        .CompositingMode = CompositingMode.SourceOver
        .CompositingQuality = CompositingQuality.HighQuality
        .InterpolationMode = InterpolationMode.HighQualityBicubic
        .PixelOffsetMode = PixelOffsetMode.HighSpeed

        .FillRectangle(LGradient, Area)
        .DrawRectangle(MPen, Area)

    End With

    Dim DrawBrush As New SolidBrush(Color.Black)
    Dim DrawPoint As New PointF(2.0F, 4.0F)

    With e.Graphics

        .CompositingMode = CompositingMode.SourceOver
        .CompositingQuality = CompositingQuality.HighQuality
        .TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
        .DrawString(HeaderText.ToString(), WinFnt, DrawBrush, DrawPoint)

    End With

    LGradient.Dispose()
    MPen.Dispose()

End Sub