Пред загрузка формы

257
13 декабря 2017, 20:27

Есть форма, которая загружается около 3 секунд. Что бы пользователь не видел как она отрисовывается я накрыл всю форму элементом panel и выключаю его когда форма загружена. На панель я добавил анимацию, но она появляется только за пол секунды до загрузки формы, пробовал просто фон изображением делать, происходит тоже самое. Вопрос, как сделать что бы загрузился panel с изображением, а потом все остальное?

    private void MyForm_Load(object sender, EventArgs e)
    { 
        To do somthing...
        preLoadPanel.Enabled = false;
        preLoadPanel.Visible = false;
    }
Answer 1

Грузите асинхронно

private async void MyForm_Load(object sender, EventArgs e)
{ 
    await Task.Run(()=>{To do somthing...});
    preLoadPanel.Enabled = false;
    preLoadPanel.Visible = false;
}
Answer 2

Как вариант можно воспользоваться сплэш-окном пока нужное окно грузиться в скрытом режиме, когда оно прогрузиться сплэш-окошко убираем и показываем нужное окно.

Код примера и классов. Класс не мой, распространяю как есть.

Заставка.Активировать();
Заставка.ВывестиТекст("Ждите грузимся...","");
// Выполняем чтонибудь очень длительное
Заставка.Деактивировать();      

public static class Заставка
{
    public static void Активировать()
    {
        //задали шрифт по умолчанию
        SplashScreen.Instance.Font = new System.Drawing.Font("Tahoma", 12, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(0)));
        //задали фон. Фон задавать только так
        SplashScreen.SetBackgroundImage(ОсновныеРесурсы.Logo);
        //задали эффект
        SplashScreen.SetFadeIn(true);
        //показали форму
        SplashScreen.BeginDisplay();
    }
    public static void Деактивировать()
    {
        SplashScreen.EndDisplay();
    }
    public static void ВывестиТекст(string Строка1,string Строка2)
    {
        SplashScreen.SetTitle(Строка1);
        SplashScreen.SetCurrentTitle(Строка2);          
    }
}

/*
 * Template SplashScreen
 * Автор: Евгений Потребенко
 * Версия 1.1
 * История версий:
 * [1.1] 5.04.2010
 *       Исправлен баг с утечкой памяти
 *       Исправлен баг с утечкой памяти
 * [1.0] 11.11.2009
 *       Первая рабочая версия
 * Распространяется по лицензии GPL       
 */
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;
namespace Управление_контрактами
{
    class SplashScreen : Form
    {
        #region Настройки
        private bool _ifShowFadeIn = false;
        private string _title = string.Empty;
        private string _currenttitle = string.Empty;
        private string _productname = Application.ProductName;
        private string _productversion = Application.ProductVersion;
        private string _copyrights = "Все права защищены © AnyKey Software 2010";
        private void WriteText(Graphics g)
        {
            g.TextRenderingHint = TextRenderingHint.SystemDefault;
            SolidBrush brushFont = new SolidBrush(Color.White);
            //пишем текст            
            g.TextRenderingHint = TextRenderingHint.AntiAlias;
            DrawText(g, _productname, 25, 30, new Font(Instance.Font.FontFamily, 20, FontStyle.Bold), brushFont);
            g.TextRenderingHint = TextRenderingHint.SystemDefault;
            DrawText(g, _productversion, 265, 72, Instance.Font, brushFont);
            DrawText(g, _title, 25, 135, new Font(Instance.Font.FontFamily, Instance.Font.SizeInPoints, FontStyle.Bold), brushFont);
            DrawText(g, _currenttitle, 25, 150, Font, brushFont);
            DrawText(g, _copyrights, 25, 185, Font, brushFont);
            brushFont.Dispose();
            g.Dispose();
        }
        #endregion
        private static SplashScreen _instance = null;
        private static object _lockObject = new object();
        private static byte alphaBlend;
        private const int WS_EX_TOPMOST = unchecked((int)0x00000008L);
        private const int WS_EX_TOOLWINDOW = unchecked((int)0x00000080);
        private const uint SWP_NOSIZE = 0x0001;
        private const uint SWP_NOMOVE = 0x0002;
        private const int HWND_TOPMOST = -1;
        private const int CS_DROPSHADOW = 0x00020000;
        private StringFormat _stringFormat;
        #region WIN32
        public enum Bool
        {
            False = 0,
            True
        };
        [StructLayout(LayoutKind.Sequential)]
        public new struct Size
        {
            public Int32 cx;
            public Int32 cy;
            public Size(Int32 cx, Int32 cy) { this.cx = cx; this.cy = cy; }
        }

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct ARGB
        {
            public byte Blue;
            public byte Green;
            public byte Red;
            public byte Alpha;
        }

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct BLENDFUNCTION
        {
            public byte BlendOp;
            public byte BlendFlags;
            public byte SourceConstantAlpha;
            public byte AlphaFormat;
        }

        public const Int32 ULW_COLORKEY = 0x00000001;
        public const Int32 ULW_ALPHA = 0x00000002;
        public const Int32 ULW_OPAQUE = 0x00000004;
        public const byte AC_SRC_OVER = 0x00;
        public const byte AC_SRC_ALPHA = 0x01;

        [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern Bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);
        [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern IntPtr GetDC(IntPtr hWnd);
        [DllImport("user32.dll", ExactSpelling = true)]
        public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern Bool DeleteDC(IntPtr hdc);
        [DllImport("gdi32.dll", ExactSpelling = true)]
        public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern Bool DeleteObject(IntPtr hObject);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static public extern IntPtr GetDesktopWindow();
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public extern static IntPtr SetParent(IntPtr hChild, IntPtr hParent);
        [DllImport("user32.dll", EntryPoint = "SetWindowPos", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
        #endregion
        #region Реализации прозрачности
        Timer _RefreshFormTimer = new Timer();
        private Bitmap _FormBitmap;
        private byte _FormOpacity;
        private void RefreshFormTimer_Tick(object sender, EventArgs e)
        {
            if (_FormBitmap != null)
                SetBitmap(_FormBitmap, _FormOpacity);
        }
        public void SetBitmap(Bitmap bitmap)
        {
            SetBitmap(bitmap, 255);
        }
        public void SetBitmap(Bitmap bitmap, byte opacity)
        {
//            if (bitmap.PixelFormat != PixelFormat.Format32bppArgb)
//                throw new ApplicationException("Картинка должна иметь 32-битный альфа-канал");
            _FormBitmap = bitmap;
            _FormOpacity = opacity;
            IntPtr screenDc = GetDC(IntPtr.Zero);
            IntPtr memDc = CreateCompatibleDC(screenDc);
            IntPtr hBitmap = IntPtr.Zero;
            IntPtr oldBitmap = IntPtr.Zero;
            try
            {
                Bitmap temp_bmp = new Bitmap(bitmap);
                foreach (Control ctrl in this.Controls)
                    ctrl.DrawToBitmap(temp_bmp, ctrl.Bounds);
                if (Bounds.Width > 0 && Bounds.Height > 0 && Visible)
                {
                    Graphics g;
                    try
                    {
                        g = Graphics.FromImage(temp_bmp);
                        g.SetClip(new Rectangle(0, 0, this.Width, this.Height));                        
                        //Пишем текст на форме
                        WriteText(g);                        
                    }
                    catch (Exception exception)
                    {
                        System.Diagnostics.StackFrame stackFrame = new System.Diagnostics.StackFrame(true);
                        Console.WriteLine("\nОшибка: {0}, \n\t{1}, \n\t{2}, \n\t{3}\n", this.GetType().ToString(), stackFrame.GetMethod().ToString(), stackFrame.GetFileLineNumber(), exception.Message);
                    }
                }
                hBitmap = temp_bmp.GetHbitmap(Color.FromArgb(0));
                temp_bmp.Dispose();
                oldBitmap = SelectObject(memDc, hBitmap);
                Size size = new Size(bitmap.Width, bitmap.Height);
                Point pointSource = new Point(0, 0);
                Rectangle screenArea = SystemInformation.WorkingArea;
                int nX = (screenArea.Width - Width) / 2;
                int nY = (screenArea.Height - Height) / 2;
                Point topPos = new Point(nX, nY);
                BLENDFUNCTION blend = new BLENDFUNCTION();
                blend.BlendOp = AC_SRC_OVER;
                blend.BlendFlags = 0;
                blend.SourceConstantAlpha = opacity;
                blend.AlphaFormat = AC_SRC_ALPHA;
                UpdateLayeredWindow(Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, ULW_ALPHA);
            }
            finally
            {
                ReleaseDC(IntPtr.Zero, screenDc);
                if (hBitmap != IntPtr.Zero)
                {
                    SelectObject(memDc, oldBitmap);
                    //DeleteObject(hBitmap);
                    DeleteObject(hBitmap);
                }
                DeleteDC(memDc);
            }
        }        
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00080000;
                return cp;
            }
        }
        #endregion
        #region Конструктор
        public SplashScreen()
        {            
            FormBorderStyle = FormBorderStyle.None;
            //задаем форма текста
            _stringFormat = new StringFormat();
            _stringFormat.FormatFlags |= StringFormatFlags.NoWrap;
            _stringFormat.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
            //таймер для отрисовки окна. Вместо OnPaint
            _RefreshFormTimer.Interval = 10;
            _RefreshFormTimer.Tick += new EventHandler(RefreshFormTimer_Tick);
            _RefreshFormTimer.Enabled = true;
            ShowInTaskbar = false;            
        }
        public static SplashScreen Instance
        {
            get
            {
                lock (_lockObject)
                {
                    if (_instance == null || _instance.IsDisposed)
                    {
                        _instance = new SplashScreen();
                    }
                    return _instance;
                }
            }
        }
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
        }
        protected override void OnHandleCreated(EventArgs e)
        {
            if (Handle != IntPtr.Zero)
            {
                IntPtr hWndDeskTop = GetDesktopWindow();
                SetParent(Handle, hWndDeskTop);
            }
            base.OnHandleCreated(e);
        }
        #endregion
        #region Показывать/скрыть
        /// <summary>
        /// Показать окно
        /// </summary>
        public static void BeginDisplay()
        {
            Instance.Visible = true;
            if (!Instance.Created)
            {
                Instance.CreateControl();
            }
            SetWindowPos(Instance.Handle, (System.IntPtr)HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
            alphaBlend = 255; //Instance.FadeIn ? (byte)15 : (byte)255;
            Instance.SetBitmap((Bitmap)Instance.BackgroundImage, alphaBlend);
            if (Instance.FadeIn)
            {
                Timer tmrFade = new Timer();
                tmrFade.Interval = 10;
                tmrFade.Tick += new EventHandler(_fadeTick);
                tmrFade.Start();
            }
            Instance.Show();
        }
        /// <summary>
        /// Эффект мягкого возникновения
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        protected static void _fadeTick(object sender, EventArgs args)
        {
            if (alphaBlend >= 255)
            {
                ((Timer)sender).Stop();
                Instance.SetBitmap((Bitmap)Instance.BackgroundImage);
                return;
            }
            Instance.SetBitmap((Bitmap)Instance.BackgroundImage, alphaBlend);
            alphaBlend += 10;            
            Instance.Refresh();
        }
        /// <summary>
        /// Закрыть окно
        /// </summary>
        public static void EndDisplay()
        {
            Instance.Visible = false;
        }
        #endregion
        #region Свойства
        /// <summary>
        /// Установить заголовок комментария
        /// </summary>
        /// <param name="text"></param>
        public static void SetTitle(string text)
        {
            Instance.Title = text;
        }
        /// <summary>
        /// Фон формы
        /// </summary>
        /// <param name="image"></param>
        public static void SetBackgroundImage(Image image)
        {
            Instance.BackgroundImage = image;
            Instance.Width = image.Width;
            Instance.Height = image.Height;
        }
        /// <summary>
        /// Установить текущий комментарий
        /// </summary>
        /// <param name="text"></param>
        public static void SetCurrentTitle(string text)
        {
            Instance.CurrentTitle = text;
        }
        /// <summary>
        /// Установить эффект возникновения
        /// </summary>
        /// <param name="iffadein"></param>
        public static void SetFadeIn(bool iffadein)
        {
            Instance.FadeIn = iffadein;
        }
        #region Private
        private string Title
        {
            get
            {
                return _title;
            }
            set
            {
                _title = value;
                Refresh();
            }
        }
        private string CurrentTitle
        {
            get
            {
                return _currenttitle;
            }
            set
            {
                _currenttitle = value;
                Refresh();
            }
        }
        private bool FadeIn
        {
            get
            {
                return _ifShowFadeIn;
            }
            set
            {
                _ifShowFadeIn = value;
                Refresh();
            }
        }
        #endregion
        #endregion
        #region Прорисовка элементов
        private static void DrawText(Graphics g, string text, int x, int y, Font font, Brush brush)
        {
            int _nTextOffsetY = 0;
            int _nTextOffsetX = 0;
            //изменяем строку
            SizeF sizeF = g.MeasureString(text, font, Instance.Width, StringFormat.GenericDefault);
            _nTextOffsetX += Convert.ToInt32(Math.Ceiling(sizeF.Width));
            _nTextOffsetY += Convert.ToInt32(Math.Ceiling(sizeF.Height));
            RectangleF rectangleF = new RectangleF(x, y, _nTextOffsetX, _nTextOffsetY);
            g.DrawString(text, font, brush, rectangleF, StringFormat.GenericDefault);
        }        
        #endregion 
    }
}
READ ALSO
Сравнение строк в C#

Сравнение строк в C#

У меня есть две строки

222
SVG глобус, невидимая часть

SVG глобус, невидимая часть

Имеется вращающийся глобус, где при наведении на определенные страны, те подсвечиваютсяПроблема в том, что мне надо, чтобы на задней части...

278
Деструктурирующее присваивание

Деструктурирующее присваивание

При изучении ES-2015 я наткнулся на деструктуризацию и мой пытливый ум решил поэкспериментировать

281
Как использовать &lt;template&gt; в Internet explorer 11?

Как использовать <template> в Internet explorer 11?

Появилась необходимость поддерживать IEИ я хочу удобный способ использовать шаблоны html кода

317