Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Текст программы.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
102.68 Кб
Скачать

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

    }

}