Pull to refresh

Дизайнерский подход к WinForms

Вступление: Часто встречаются приложения которые не блестят особым дизайном UI, так же в них нет вкуса и все в сером цвете. С помощью не хитрых действий можно сделать современное приложение которая не будет уступать монстру WPF, к которому очень не легко сразу научится писать ПО, эта статья скорей для тех кто пишет под WinForms и боится начать WPF, так как они вроде бы похожи но все же отличаются сложностью и крутостью.
Итак. Для простого примера создадим наш собственный браузер на движке webkit с помощью платформы .Net Framework на языке программировании c#
Глава 1: Цвет залог успешной дружелюбности, чем он приятней тем лучше, и кстати белый цвета тоже не плохо смотрятся
Свойства формы: FrameBorder=none, BackColor=white
image
Глава 2: Кнопки играют не маловажную роль в интерфейсе любой ПО, главное их правильное расположение, размер, текст и цвет,
Для этого создадим UserControl
using System;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace habr
{
    public partial class btn : Button//UserControl
    {
        public enum ButtonType
        { 
            GoBack,
            Home,
            GoForward,
            Refresh,
            Search,
            Close,
            Minimize
        }
        public btn()
        {
            InitializeComponent();
        }
        private Color _OnMouseEnterColor = Color.Blue;
        private Color _OnMouseClickColor = Color.BlueViolet;
        private Color _MixedColor = Color.CadetBlue;
        private byte _Transparency1 = 64;
        private byte _Transparency2 = 64;
        private byte _AngleOfTransparency = 90;
        private float _Resizer = 1.05f;
        private ButtonType _ButtonType;

        private bool IsOver;
        private bool IsDown;
        private Point _initLocation;
        private Font _initFontSize;
        private Point _tempLocation;
        private Size _tempSize;

        public Color OnMouseEnterColor { get { return _OnMouseEnterColor; } set { _OnMouseEnterColor = value; Invalidate(); } }
        public Color OnMouseClickColor { get { return _OnMouseClickColor; } set { _OnMouseClickColor = value; Invalidate(); } }
        public Color MixedColor { get { return _MixedColor; } set { _MixedColor = value; Invalidate(); } }
        public byte Transparency1 { get { return _Transparency1; } set { _Transparency1 = value; Invalidate(); } }
        public byte Transparency2 { get { return _Transparency2; } set { _Transparency2 = value; Invalidate(); } }
        public byte AngleOfTransparency { get { return _AngleOfTransparency; } set { _AngleOfTransparency = value; Invalidate(); } }
        public float Resizer { get { return _Resizer; } set { _Resizer = value; Invalidate(); } }
        public ButtonType ButtonTypeThumb { get { return _ButtonType; } set { _ButtonType = value; Invalidate(); } }


        protected override void OnMouseEnter(EventArgs e)
        {
            base.OnMouseEnter(e);
            IsOver = true;
        }
        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            IsOver = false;
        }
        protected override void OnMouseDown(MouseEventArgs mevent) //Эффект увеличивания / уменьшения
        {
            base.OnMouseDown(mevent);
            _initLocation = Location;
            _tempLocation = new Point(Location.X + Width / 2, Location.Y + Height / 2);
            _tempSize = Size;
            Size = new Size((int)(Width / _Resizer), (int)(Height / _Resizer));
            Location = new Point(_tempLocation.X - Size.Width / 2, _tempLocation.Y - Size.Height / 2);
            _initFontSize = Font;
            Font = new Font(Font.FontFamily, Font.Size / _Resizer);
            IsDown = true;
            
        }
        protected override void OnMouseUp(MouseEventArgs mevent)
        {
            base.OnMouseUp(mevent);
            Location = _initLocation;
            Size = _tempSize;
            Font = _initFontSize;
            IsDown = false;
        }
        protected override void OnPaint(PaintEventArgs pevent) //отрисовка иконки ИСПОЛЬЗОВАТЬ ШРИФТ SEGOE UI SYMBOL. Который позволяет отрисовывать такие жамечательные картинки
        {
            base.OnPaint(pevent);
            if (_ButtonType == ButtonType.GoBack) Text = "\ue096";
            if (_ButtonType == ButtonType.GoForward) Text = "\ue097";
            if (_ButtonType == ButtonType.Home) Text = "\ue10f";
            if (_ButtonType == ButtonType.Refresh) Text = "\ue149";
            if (_ButtonType == ButtonType.Search) Text = "\ue11a";
            if (_ButtonType == ButtonType.Close) Text = "\ue10a";
            if (_ButtonType == ButtonType.Minimize) Text = "\ue108";
             
            if (IsOver)
            {
                if (IsDown)
                {
                    Color c1 = Color.FromArgb
                    (_Transparency1, _OnMouseClickColor);
                    Color c2 = Color.FromArgb
                        (_Transparency2, _MixedColor);
                    Brush b = new System.Drawing.Drawing2D.LinearGradientBrush
                        (ClientRectangle, c1, c2, _AngleOfTransparency);
                    pevent.Graphics.FillRectangle(b, ClientRectangle);
                    b.Dispose();
                }
                else
                {
                    Color c1 = Color.FromArgb
                   (_Transparency1, _OnMouseEnterColor);
                    Color c2 = Color.FromArgb
                        (_Transparency2, _MixedColor);
                    Brush b = new System.Drawing.Drawing2D.LinearGradientBrush
                        (ClientRectangle, c1, c2, _AngleOfTransparency);
                    pevent.Graphics.FillRectangle(b, ClientRectangle);
                    b.Dispose();
                }

            }
        }
        
    }
}

image
Глава 3: Не много функциональности для формы
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private bool IsDown;
        private Point Origin;
        private void btn6_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void btn7_Click(object sender, EventArgs e)
        {
            WindowState = FormWindowState.Minimized;
        }

        private void panel4_MouseDown(object sender, MouseEventArgs e)
        {
            IsDown = true;
            Origin = new Point(e.X, e.Y);
        }

        private void panel4_MouseUp(object sender, MouseEventArgs e)
        {
            IsDown = false;
            Location = new Point(Location.X - Origin.X + e.X, Location.Y - Origin.Y + e.Y);
        }

        private void panel4_MouseMove(object sender, MouseEventArgs e)
        {
            if (IsDown) Location = new Point(Location.X - Origin.X + e.X, Location.Y - Origin.Y + e.Y);
        }

        private void panel1_DoubleClick(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Maximized) WindowState = FormWindowState.Normal;
            else WindowState = FormWindowState.Maximized;
        }
    }

Заключение: Не смотря на многообещающий WPF, Winforms еще жив, пока и не мере в Казахстане и России, и во многих странах, да и вообще везде, не мало людей кто пишут. Путем не многих модернизации можно добиться схожих результатов как и в WPF.
Еще один пример
image
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.