Back to Devexpress

How to: Show an Image as a Splash Screen and Draw Custom Information Over this Image

windowsforms-11112-controls-and-libraries-forms-and-user-controls-splash-screen-manager-examples-how-to-show-an-image-as-a-splash-screen-and-draw-custom-information-over-this-image.md

latest12.7 KB
Original Source

How to: Show an Image as a Splash Screen and Draw Custom Information Over this Image

  • Nov 13, 2018
  • 6 minutes to read

In this example, an image is displayed as a splash screen via the SplashScreenManager.ShowImage method.Custom information is painted over this image via a custom class (SplashImagePainter), whose instance is passed as a parameter to the ShowImage method. The SplashImagePainter draws text labels with custom progress information.

View Example

csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraSplashScreen;

namespace SplashScreenManagerSample01 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            LongInitialization();
        }
        protected void LongInitialization() {
            BaseInitialization();
            LoadFonts();
            LoadTextures();
        }

        void BaseInitialization() {
            // Set progress stage to be displayed by SplashImagePainter
            SplashImagePainter.Painter.ViewInfo.Stage = "Initialization";
            for(int i = 1; i <= 100; i++) {
                System.Threading.Thread.Sleep(20);

                // Change progress to be displayed by SplashImagePainter
                SplashImagePainter.Painter.ViewInfo.Counter = i;
                //Force SplashImagePainter to repaint information
                SplashScreenManager.Default.Invalidate();
            }
        }
        void LoadFonts() {
            // Set progress stage to be displayed by SplashImagePainter
            SplashImagePainter.Painter.ViewInfo.Stage = "Loading Fonts";
            for(int i = 1; i <= 100; i++) {
                System.Threading.Thread.Sleep(20);

                // Change progress to be displayed by SplashImagePainter
                SplashImagePainter.Painter.ViewInfo.Counter = i;
                //Force SplashImagePainter to repaint information
                SplashScreenManager.Default.Invalidate();
            }
        }
        void LoadTextures() {
            // Set progress stage to be displayed by SplashImagePainter
            SplashImagePainter.Painter.ViewInfo.Stage = "Loading Textures";
            for(int i = 1; i <= 100; i++) {
                System.Threading.Thread.Sleep(20);

                // Change progress to be displayed by SplashImagePainter
                SplashImagePainter.Painter.ViewInfo.Counter = i;
                //Force SplashImagePainter to repaint information
                SplashScreenManager.Default.Invalidate();
            }
        }
        //

        protected override void OnLoad(EventArgs e) {
            base.OnLoad(e);
            // Close splash image
            SplashScreenManager.HideImage();
        }
    }
}
csharp
using System;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using DevExpress.XtraSplashScreen;

namespace SplashScreenManagerSample01 {
    static class Program {
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Image image = GetImage();
            // Show splash image
            SplashScreenManager.ShowImage(image, true, true, SplashImagePainter.Painter);

            Application.Run(new Form1());
        }
        static Image GetImage() {
            Assembly asm = typeof(Program).Assembly;
            return new Bitmap(asm.GetManifestResourceStream("SplashScreenManagerSample01.Images.DefSplashImage.png"));
        }
    }
}
csharp
using System.Drawing;
using DevExpress.Utils.Drawing;
using DevExpress.Utils.Text;
using DevExpress.XtraSplashScreen;

namespace SplashScreenManagerSample01 {
    class SplashImagePainter : ICustomImagePainter {
        static SplashImagePainter() {
            Painter = new SplashImagePainter();
        }
        protected SplashImagePainter() { }
        public static SplashImagePainter Painter { get; private set; }

        ViewInfo info = null;
        public ViewInfo ViewInfo {
            get {
                if(this.info == null) this.info = new ViewInfo();
                return this.info;
            }
        }

        #region Drawing
        public void Draw(GraphicsCache cache, Rectangle bounds) {
            PointF pt = ViewInfo.CalcProgressLabelPoint(cache, bounds);
            cache.Graphics.DrawString(ViewInfo.Text, ViewInfo.ProgressLabelFont, ViewInfo.Brush, pt);
        }
        #endregion
    }

    class ViewInfo {
        public ViewInfo() {
            Counter = 1;
            Stage = string.Empty;
        }

        public int Counter { get; set; }
        public string Stage { get; set; }

        public PointF CalcProgressLabelPoint(GraphicsCache cache, Rectangle bounds) {
            const int yOffset = 40;
            Size size = TextUtils.GetStringSize(cache.Graphics, Text, ProgressLabelFont);
            return new Point(bounds.Width / 2 - size.Width / 2, yOffset);
        }
        Font progressFont = null;
        public Font ProgressLabelFont {
            get {
                if(this.progressFont == null) this.progressFont = new Font("Consolas", 10);
                return this.progressFont;
            }
        }
        Brush brush = null;
        public Brush Brush {
            get {
                if(this.brush == null) this.brush = new SolidBrush(Color.Black);
                return this.brush;
            }
        }
        public string Text { get { return string.Format("{0} - ({1}%)", Stage, Counter.ToString("D2")); } }
    }
}
vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Drawing
Imports System.Reflection
Imports System.Windows.Forms
Imports DevExpress.XtraSplashScreen

Namespace SplashScreenManagerSample01
    Friend NotInheritable Class Program
        Private Sub New()
        End Sub
        <STAThread> _
        Shared Sub Main()
            Application.EnableVisualStyles()
            Application.SetCompatibleTextRenderingDefault(False)

            Dim image As Image = GetImage()
            ' Show splash image
            SplashScreenManager.ShowImage(image, True, True, SplashImagePainter.Painter)

            Application.Run(New Form1())
        End Sub
        Private Shared Function GetImage() As Image
            Dim asm As System.Reflection.Assembly = GetType(Program).Assembly
            Return New Bitmap(asm.GetManifestResourceStream("DefSplashImage.png"))
        End Function
    End Class
End Namespace
vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports DevExpress.XtraSplashScreen

Namespace SplashScreenManagerSample01
    Partial Public Class Form1
        Inherits Form
        Public Sub New()
            InitializeComponent()
            LongInitialization()
        End Sub
        Protected Sub LongInitialization()
            BaseInitialization()
            LoadFonts()
            LoadTextures()
        End Sub

        Private Sub BaseInitialization()
            ' Set progress stage to be displayed by SplashImagePainter
            SplashImagePainter.Painter.ViewInfo.Stage = "Initialization"
            For i As Integer = 1 To 100
                System.Threading.Thread.Sleep(20)

                ' Change progress to be displayed by SplashImagePainter
                SplashImagePainter.Painter.ViewInfo.Counter = i
                'Force SplashImagePainter to repaint information
                SplashScreenManager.Default.Invalidate()
            Next i
        End Sub
        Private Sub LoadFonts()
            ' Set progress stage to be displayed by SplashImagePainter
            SplashImagePainter.Painter.ViewInfo.Stage = "Loading Fonts"
            For i As Integer = 1 To 100
                System.Threading.Thread.Sleep(20)

                ' Change progress to be displayed by SplashImagePainter
                SplashImagePainter.Painter.ViewInfo.Counter = i
                'Force SplashImagePainter to repaint information
                SplashScreenManager.Default.Invalidate()
            Next i
        End Sub
        Private Sub LoadTextures()
            ' Set progress stage to be displayed by SplashImagePainter
            SplashImagePainter.Painter.ViewInfo.Stage = "Loading Textures"
            For i As Integer = 1 To 100
                System.Threading.Thread.Sleep(20)

                ' Change progress to be displayed by SplashImagePainter
                SplashImagePainter.Painter.ViewInfo.Counter = i
                'Force SplashImagePainter to repaint information
                SplashScreenManager.Default.Invalidate()
            Next i
        End Sub
        '

        Protected Overrides Sub OnLoad(ByVal e As EventArgs)
            MyBase.OnLoad(e)
            ' Close splash image
            SplashScreenManager.HideImage()
        End Sub
    End Class
End Namespace
vb
Imports Microsoft.VisualBasic
Imports System.Drawing
Imports DevExpress.Utils.Drawing
Imports DevExpress.Utils.Text
Imports DevExpress.XtraSplashScreen

Namespace SplashScreenManagerSample01
    Friend Class SplashImagePainter
        Implements ICustomImagePainter
        Shared Sub New()
            Painter = New SplashImagePainter()
        End Sub
        Protected Sub New()
        End Sub
        Private Shared privatePainter As SplashImagePainter
        Public Shared Property Painter() As SplashImagePainter
            Get
                Return privatePainter
            End Get
            Private Set(ByVal value As SplashImagePainter)
                privatePainter = value
            End Set
        End Property

        Private info As ViewInfo = Nothing
        Public ReadOnly Property ViewInfo() As ViewInfo
            Get
                If Me.info Is Nothing Then
                    Me.info = New ViewInfo()
                End If
                Return Me.info
            End Get
        End Property

        #Region "Drawing"
        Public Sub Draw(ByVal cache As GraphicsCache, ByVal bounds As Rectangle) Implements ICustomImagePainter.Draw
            Dim pt As PointF = ViewInfo.CalcProgressLabelPoint(cache, bounds)
            cache.Graphics.DrawString(ViewInfo.Text, ViewInfo.ProgressLabelFont, ViewInfo.Brush, pt)
        End Sub
        #End Region
    End Class

    Friend Class ViewInfo
        Public Sub New()
            Counter = 1
            Stage = String.Empty
        End Sub

        Private privateCounter As Integer
        Public Property Counter() As Integer
            Get
                Return privateCounter
            End Get
            Set(ByVal value As Integer)
                privateCounter = value
            End Set
        End Property
        Private privateStage As String
        Public Property Stage() As String
            Get
                Return privateStage
            End Get
            Set(ByVal value As String)
                privateStage = value
            End Set
        End Property

        Public Function CalcProgressLabelPoint(ByVal cache As GraphicsCache, ByVal bounds As Rectangle) As PointF
            Const yOffset As Integer = 40
            Dim size As Size = TextUtils.GetStringSize(cache.Graphics, Text, ProgressLabelFont)
            Return New Point(bounds.Width / 2 - size.Width / 2, yOffset)
        End Function
        Private progressFont As Font = Nothing
        Public ReadOnly Property ProgressLabelFont() As Font
            Get
                If Me.progressFont Is Nothing Then
                    Me.progressFont = New Font("Consolas", 10)
                End If
                Return Me.progressFont
            End Get
        End Property
        Private brush_Renamed As Brush = Nothing
        Public ReadOnly Property Brush() As Brush
            Get
                If Me.brush_Renamed Is Nothing Then
                    Me.brush_Renamed = New SolidBrush(Color.Black)
                End If
                Return Me.brush_Renamed
            End Get
        End Property
        Public ReadOnly Property Text() As String
            Get
                Return String.Format("{0} - ({1}%)", Stage, Counter.ToString("D2"))
            End Get
        End Property
    End Class
End Namespace