Есть форма, которая загружается около 3 секунд. Что бы пользователь не видел как она отрисовывается я накрыл всю форму элементом panel
и выключаю его когда форма загружена. На панель я добавил анимацию, но она появляется только за пол секунды до загрузки формы, пробовал просто фон изображением делать, происходит тоже самое. Вопрос, как сделать что бы загрузился panel
с изображением, а потом все остальное?
private void MyForm_Load(object sender, EventArgs e)
{
To do somthing...
preLoadPanel.Enabled = false;
preLoadPanel.Visible = false;
}
Грузите асинхронно
private async void MyForm_Load(object sender, EventArgs e)
{
await Task.Run(()=>{To do somthing...});
preLoadPanel.Enabled = false;
preLoadPanel.Visible = false;
}
Как вариант можно воспользоваться сплэш-окном пока нужное окно грузиться в скрытом режиме, когда оно прогрузиться сплэш-окошко убираем и показываем нужное окно.
Код примера и классов. Класс не мой, распространяю как есть.
Заставка.Активировать();
Заставка.ВывестиТекст("Ждите грузимся...","");
// Выполняем чтонибудь очень длительное
Заставка.Деактивировать();
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
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имеется вращающийся глобус, где при наведении на определенные страны, те подсвечиваютсяПроблема в том, что мне надо, чтобы на задней части...
При изучении ES-2015 я наткнулся на деструктуризацию и мой пытливый ум решил поэкспериментировать
Появилась необходимость поддерживать IEИ я хочу удобный способ использовать шаблоны html кода