
- •VStepanov.CourseWork.First Common.Cs
- •VStepanov.CourseWork.First.Binary BmpInfo.Cs
- •ByteMixer.Cs
- •Relocator.Cs
- •VStepanov.CourseWork.First.Cryptography
- •XorCodec.Cs
- •VStepanov.CourseWork.First.Steganography Steganogram.Cs
- •SteganogramBmp.Cs
- •SteganogramInfo.Cs
- •SteganogramMessage.Cs
- •VStepanov.CourseWork.First.Gui AnimatedForm.Cs
- •FileAddForm.Cs
- •GuiMethods.Cs
- •PasswordRequest.Cs
- •Program.Cs
- •SplashForm.Cs
- •TextAddForm.Cs
- •TextReadForm.Cs
- •Лист регистрации изменений
GuiMethods.Cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Integration;
using WpfControls = System.Windows.Controls;
[assembly: CLSCompliant(true)]
namespace VStepanov.CourseWork.First.Gui
{
/// <summary>
/// Статический класс, содержащий различные методы для работы с пользовательским интерфейсом.
/// </summary>
public static class GuiMethods
{
#region Расширения, добавляющие возможность анимации различных
#region Анимация размеров
/// <summary>
/// Анимирует изменение размеров элемента System.Windows.Forms.Control.
/// </summary>
/// <typeparam name="T">Тип элемента, наследуемый от System.Windows.Forms.Control.</typeparam>
/// <param name="control">Контрол, размеры которого будут меняться.</param>
/// <param name="newSize">Новый необходимый размер.</param>
/// <param name="duration">Длительность анимации.</param>
public static void AnimateControlSize<T>(this T control, Size newSize, TimeSpan duration)
where T : System.Windows.Forms.Control
{
Timer timer = new Timer();
timer.Interval = 1000 / CommonConstants.InterfaceFps;
double steps = duration.TotalSeconds * CommonConstants.InterfaceFps;
double widthDelta = ((newSize.Width - control.Width) / steps);
double heightDelta = ((newSize.Height - control.Height) / steps);
double currentWidth = control.Width;
double currentHeigth = control.Height;
int stepsRemained = (int)steps;
timer.Tick += (o, e) =>
{
if (stepsRemained > 0)
{
currentHeigth += heightDelta;
currentWidth += widthDelta;
control.Width = (int)currentWidth;
control.Height = (int)currentHeigth;
stepsRemained--;
}
else
{
control.Size = newSize;
timer.Stop();
}
};
timer.Start();
}
#endregion
#region Анимация прозрачности
/// <summary>
/// Плавно уменьшает непрозрачность данного элемента до 0%.
/// </summary>
/// <param name="elementHost">Элемент, прозрачность которого будет меняться.</param>
/// <param name="duration">Длительность анимации.</param>
public static void FadeOut(this ElementHost elementHost, TimeSpan duration)
{
Timer timer = new Timer();
timer.Interval = 1000 / CommonConstants.InterfaceFps;
double steps = duration.TotalSeconds * CommonConstants.InterfaceFps;
int stepsRemained = (int)steps;
double opacityDelta = elementHost.Child.Opacity / steps;
timer.Tick += (o, e) =>
{
if (stepsRemained > 0)
{
elementHost.Child.Opacity -= opacityDelta;
stepsRemained--;
}
else
{
elementHost.Visible = false;
timer.Stop();
}
};
timer.Start();
}
/// <summary>
/// Плавно уменьшает непрозрачность данного элемента до 0%.
/// </summary>
/// <param name="form">Элемент, прозрачность которого будет меняться.</param>
/// <param name="duration">Длительность анимации.</param>
public static void FadeOut(this Form form, TimeSpan duration)
{
Timer timer = new Timer();
timer.Interval = 1000 / CommonConstants.InterfaceFps;
double steps = duration.TotalSeconds * CommonConstants.InterfaceFps;
int stepsRemained = (int)steps;
double opacityDelta = form.Opacity / steps;
timer.Tick += (o, e) =>
{
if (stepsRemained > 0)
{
form.Opacity -= opacityDelta;
stepsRemained--;
}
else
{
form.Visible = false;
timer.Stop();
}
};
timer.Start();
}
/// <summary>
/// Плавно увеличивает непрозрачность данного элемента до 100%.
/// </summary>
/// <param name="elementHost">Элемент, прозрачность которого будет меняться.</param>
/// <param name="duration">Длительность анимации.</param>
public static void FadeIn(this ElementHost elementHost, TimeSpan duration)
{
Timer timer = new Timer();
timer.Interval = 1000 / CommonConstants.InterfaceFps;
double steps = duration.TotalSeconds * CommonConstants.InterfaceFps;
int stepsRemained = (int)steps;
if (!elementHost.Visible)
{
elementHost.Child.Opacity = 0.0;
elementHost.Visible = true;
}
double opacityDelta = (1.0 - elementHost.Child.Opacity) / steps;
timer.Tick += (o, e) =>
{
if (stepsRemained > 0)
{
elementHost.Child.Opacity += opacityDelta;
stepsRemained--;
}
else
{
elementHost.Child.Opacity = 1.0;
timer.Stop();
}
};
timer.Start();
}
/// <summary>
/// Плавно увеличивает непрозрачность данного элемента до 100%.
/// </summary>
/// <param name="form">Элемент, прозрачность которого будет меняться.</param>
/// <param name="duration">Длительность анимации.</param>
public static void FadeIn(this Form form, TimeSpan duration)
{
Timer timer = new Timer();
timer.Interval = 1000 / CommonConstants.InterfaceFps;
double steps = duration.TotalSeconds * CommonConstants.InterfaceFps;
int stepsRemained = (int)steps;
double opacityDelta = (1.0 - form.Opacity) / steps;
timer.Tick += (o, e) =>
{
if (stepsRemained > 0)
{
form.Opacity += opacityDelta;
stepsRemained--;
}
else
{
form.Opacity = 1.0;
timer.Stop();
}
};
timer.Start();
}
/// <summary>
/// Плавно увеличивает непрозрачность всех элементов панели, поддерживающих это свойство, до 100%.
/// Перед началом анимации происходит заданная задержка.
/// </summary>
/// <param name="panel">Панель, прозрачность элементов которой будет анимироваться.</param>
/// <param name="duration">Длительность анимации.</param>
/// <param name="delay">Задержка, после которой производится анимация.</param>
public static void FadeInAll(this Panel panel, TimeSpan duration, TimeSpan delay)
{
Timer timer = new Timer();
timer.Interval = (int)delay.TotalMilliseconds;
timer.Tick += (o, e) =>
{
foreach (var control in panel.Controls)
{
ElementHost c = control as ElementHost;
if (c != null)
{
c.FadeIn(duration);
}
}
timer.Dispose();
};
timer.Start();
}
/// <summary>
/// Плавно уменьшает непрозрачность всех элементов панели, поддерживающих это свойство, до 0%.
/// </summary>
/// <param name="panel">Панель, прозрачность элементов которой будет анимироваться.</param>
/// <param name="duration">Длительность анимации.</param>
public static void FadeOutAll(this Panel panel, TimeSpan duration)
{
foreach (Control control in panel.Controls)
{
ElementHost c = control as ElementHost;
if (c != null)
{
control.Enabled = false;
c.FadeOut(duration);
}
}
}
#endregion
#endregion
#region Создание гостевых элементов управления WPF
/// <summary>
/// Создаёт гостевой элемент управления WPF - Label.
/// </summary>
/// <param name="labelText">Изначальный текст в Label.</param>
/// <returns>Гостевой элемент управления WPF - Label, с указанным текстом.</returns>
public static ElementHost CreateWpfLabel(string labelText)
{
ElementHost elementHost = new ElementHost();
WpfControls.Label label = new WpfControls.Label();
WpfControls.TextBlock text = new WpfControls.TextBlock();
text.TextAlignment = System.Windows.TextAlignment.Left;
text.FontSize = 12;
text.Text = labelText;
label.Content = text;
elementHost.Child = label;
elementHost.Visible = false;
return elementHost;
}
/// <summary>
/// Создаёт гостевой элемент управления WPF - Button с текстом.
/// </summary>
/// <param name="buttonText">Текст на кнопке.</param>
/// <returns>Гостевой элемент управления WPF - Button с указанным текстом.</returns>
public static ElementHost CreateWpfButton(string buttonText)
{
ElementHost elementHost = new ElementHost();
WpfControls.TextBlock text = new WpfControls.TextBlock();
text.TextAlignment = System.Windows.TextAlignment.Center;
text.FontSize = 12;
text.Text = buttonText;
WpfControls.Button button = new WpfControls.Button();
button.Content = text;
elementHost.Child = button;
elementHost.Visible = false;
elementHost.BackColor = Color.White;
return elementHost;
}
#region Создание WPF-кнопки с изображением и текстом
/// <summary>
/// Создаёт гостевой элемент управления WPF - Button с изображением и текстом.
/// </summary>
/// <param name="buttonText">Текст на кнопке.</param>
/// <param name="bitmap">Изображение, отображаемое на кнопке.</param>
/// <returns>Гостевой элемент управления WPF - Button с указанными текстом и изображением.</returns>
public static ElementHost CreateWpfButton(string buttonText, Bitmap bitmap)
{
ElementHost elementHost = new ElementHost();
WpfControls.Image im = CreateImageFromBitmap(bitmap);
WpfControls.TextBlock text = new WpfControls.TextBlock();
text.TextAlignment = System.Windows.TextAlignment.Center;
text.FontSize = 15;
text.Text = buttonText;
WpfControls.StackPanel sp = new WpfControls.StackPanel();
sp.Orientation = WpfControls.Orientation.Vertical;
sp.Children.Add(im);
sp.Children.Add(text);
WpfControls.Button button = new WpfControls.Button();
button.Content = sp;
elementHost.Child = button;
elementHost.Visible = false;
elementHost.BackColor = Color.White;
return elementHost;
}
/// <summary>
/// Создаёт WPF Image из предоставленного Bitmap.
/// </summary>
/// <param name="bitmap">Bitmap для встраивания.</param>
/// <returns>WPF Image, сгенерированный из предоставленного Bitmap.</returns>
private static WpfControls.Image CreateImageFromBitmap(Bitmap bitmap)
{
var bmi = GetBitmapImageFromBitmap(bitmap);
WpfControls.Image im = new WpfControls.Image();
im.Source = bmi;
im.Width = 240;
return im;
}
/// <summary>
/// Создаёт WPF BitmapImage из предоставленного Bitmap.
/// </summary>
/// <param name="bitmap">Bitmap для встраивания.</param>
/// <returns>WPF BitmapImage, сгенерированный из предоставленного Bitmap.</returns>
private static System.Windows.Media.Imaging.BitmapImage GetBitmapImageFromBitmap(Bitmap bitmap)
{
var bitmapImage = new System.Windows.Media.Imaging.BitmapImage();
using (MemoryStream memory = new MemoryStream())
{
bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
memory.Position = 0;
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
}
return bitmapImage;
}
#endregion
#endregion
#region Прочие методы
/// <summary>
/// Составляет информационный текст о стеганографическом контейнере, на основе его содержимого.
/// </summary>
/// <param name="steganogram">Контейнер для описания.</param>
/// <returns>Текст с информацией о контейнере.</returns>
public static string ComposeInfoText(VStepanov.CourseWork.First.Steganography.Steganogram steganogram)
{
if (!steganogram.Info.HasValue)
{
return "Изображение не содержит в себе стеганограммы.";
}
Steganography.SteganogramInfo info = steganogram.Info.Value;
if (info.MessageType == (Steganography.MessageType.Text | Steganography.MessageType.Encrypted))
{
return "Изображение-контейнер содержит зашифрованный текст.";
}
if (info.MessageType == Steganography.MessageType.Text)
{
return "Изображение-контейнер содержит текст.";
}
if (info.MessageType == (Steganography.MessageType.File | Steganography.MessageType.Encrypted))
{
return "Изображение-контейнер содержит зашифрованниый файл.";
}
if (info.MessageType == Steganography.MessageType.File)
{
return "Изображение-контейнер содержит файл.";
}
throw new ArgumentException("steganogram");
}
#endregion
}
}