Форум программистов, компьютерный форум, киберфорум
Наши страницы
anomal6
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

Form Style своими руками на WinForms с помощью расширения

Запись от anomal6 размещена 03.09.2019 в 22:13

Всем добра читающие гости форумчане.
Задался я тут вопросом таким можно ли легко и просто сменить дизайн формы. Есть у меня программа, написанная рабочая, всё хорошо.
Но дизайн на WinForms оставляет желать лучшего.
Нажмите на изображение для увеличения
Название: doc1.png
Просмотров: 26
Размер:	18.1 Кб
ID:	5535

Как то "не айс"!

Попробовав через NuGet MetroFrameWork переплевался полностью. Так как нормальный дизайн отсутствует, и если Вы захотите скрыть кнопки навигации приготовьтесь к багам.
Потом попробовал MaterialSkin всё через тот же NuGet. Тут я просрался.
Ну во-первых там есть даже PersianMaterialSkin. Парень скомуниздил дизайн, добавил ООЧЕНЬ КОРЯВЫЙ ListView, переделал шрифт под не читаемый вовсе, и выложил под своим копирайтом. Ну типа плюс от этого GitHub, но глянув GitHub'a внутрь, и решив поменять dll под себя (ну шрифты там всякие, размер полей) блеванул пару раз, и понял что лучше с ноля самому писать. Дальше я пошёл Гуглить...

Гуглёжка привела меня к тому что танцы с бубном неизбежны, и придётся в кровь пальцы стереть чтобы получить нормальную форму. Не хочешь крови ? go WPF.

По-WPF'ил я немного методом научного тыка и понял, что учить надо, и так просто на WPF не перейти.
И красивенькая форма пусть снится ночами.

Но полазив по форуму я тут вычитал что можно и круглые углы сделать но вот только
C#
1
this.FormBorderStyle.None;
Но изучив вопрос нашёл код который таскает форму за любой пиксель.

код который таскает WinForm за любой пиксель

Сначала добавим библиотеку
C#
1
using System.Runtime.InteropServices;
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
[DllImport("Gdi32.dll")]
        public static extern IntPtr CreateRoundRectRgn(int nLeftRect,
                                                          int nTopRect,
                                                          int nRightRect,
                                                          int nBottomRect,
                                                          int nWidthEllipse,
                                                          int nHeightEllipse);
 
        [DllImport("user32.dll")]
        public static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw);
        private bool Drag;
        private int MouseX;
        private int MouseY;
 
        private const int WM_NCHITTEST = 0x84;
        private const int HTCLIENT = 0x1;
        private const int HTCAPTION = 0x2;
 
        private bool m_aeroEnabled;
 
        private const int CS_DROPSHADOW = 0x00020000;
        private const int WM_NCPAINT = 0x0085;
        private const int WM_ACTIVATEAPP = 0x001C;
 
        [System.Runtime.InteropServices.DllImport("dwmapi.dll")]
        public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
        [System.Runtime.InteropServices.DllImport("dwmapi.dll")]
        public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
        [System.Runtime.InteropServices.DllImport("dwmapi.dll")]
 
        public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
 
 
 
        public struct MARGINS
        {
            public int leftWidth;
            public int rightWidth;
            public int topHeight;
            public int bottomHeight;
        }
        protected override CreateParams CreateParams
        {
            get
            {
                m_aeroEnabled = CheckAeroEnabled();
                CreateParams cp = base.CreateParams;
                if (!m_aeroEnabled)
                    cp.ClassStyle |= CS_DROPSHADOW; return cp;
            }
        }
        private bool CheckAeroEnabled()
        {
            if (Environment.OSVersion.Version.Major >= 6)
            {
                int enabled = 0; DwmIsCompositionEnabled(ref enabled);
                return (enabled == 1) ? true : false;
            }
            return false;
        }
        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_NCPAINT:
                    if (m_aeroEnabled)
                    {
                        var v = 2;
                        DwmSetWindowAttribute(this.Handle, 2, ref v, 4);
                        MARGINS margins = new MARGINS()
                        {
                            bottomHeight = 1,
                            leftWidth = 0,
                            rightWidth = 0,
                            topHeight = 0
                        }; DwmExtendFrameIntoClientArea(this.Handle, ref margins);
                    }
                    break;
                default: break;
            }
            base.WndProc(ref m);
            if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT) m.Result = (IntPtr)HTCAPTION;
        }
        private void PanelMove_MouseDown(object sender, MouseEventArgs e)
        {
            Drag = true;
            MouseX = Cursor.Position.X - this.Left;
            MouseY = Cursor.Position.Y - this.Top;
           
        }
        private void PanelMove_MouseMove(object sender, MouseEventArgs e)
        {
            if (Drag)
            {
                this.Top = Cursor.Position.Y - MouseY;
                this.Left = Cursor.Position.X - MouseX;
               
            }
        }
        private void PanelMove_MouseUp(object sender, MouseEventArgs e) { Drag = false; }


Попробовав на пустом проекте мне эта идея приглянулась.
Единственное что у формы теперь нет кнопок навигации, и никакой окантовки.

Ну да пофиг подумал я, и начал панелями создавать цветные формы.
Ващее огонь подумал я сделав одну форму. Нарадоваться не мог. Сделал вторую, думаю ништяк, но чёт я заколебался.
Впереди ещё 5 форм.
Каждой пририсовывать панель, это вроде не долго, но пока всё выставишь проходит 30 минут.

Ну и решил : "Создам-ка я своё расширение"
Не так давно почитал за расширения, и принялся писать.

Как в итоге получилось совсем немного.
Создал в отдельном статическом классе.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public static class FormComponent
    {
        //Элементы тоже статичные чтобы к ним обращаться
        public static Label label = new Label();
        public static Panel panel = new Panel();
        public static Panel panel2 = new Panel();
        public static Button close = new Button();
 
        public static void AddFormPanel(this Form form, string FormNameLabel)
        {
 
            Color HotTrack = ColorTranslator.FromHtml("#0066CC");
            Color White = ColorTranslator.FromHtml("#FFFFFF");
 
            form.FormBorderStyle = FormBorderStyle.None;
            form.BackColor = Color.FromKnownColor(KnownColor.ControlLightLight);
 
            panel2.Dock = DockStyle.Top;
            panel2.Height = 45;
            panel2.BackColor = Color.FromKnownColor(KnownColor.MenuHighlight);
 
            label.Text = FormNameLabel;
            label.ForeColor = Color.FromKnownColor(KnownColor.ControlLightLight);
            label.Font = new Font("Cambria", 14.25f, FontStyle.Italic);
            label.AutoSize = true;
            label.Location = new Point(3, 3);
 
            panel2.Controls.Add(label);
            form.Controls.Add(panel2);
 
            panel.Dock = DockStyle.Top;
            panel.Height = 25;
            panel.BackColor = HotTrack;
 
            close.Size = new Size(25, 25);
            close.Name = "bClose";
            close.Text = "X";
            close.FlatStyle = FlatStyle.Flat;
            close.FlatAppearance.BorderSize = 0;
            close.Location = new Point(form.Size.Width - close.Width - 3, -2);
            close.ForeColor = Color.FromKnownColor(KnownColor.ControlLightLight);
            close.Font = new Font("Comic Sans", 9.75f, FontStyle.Bold);
 
            panel.Controls.Add(close);
            form.Controls.Add(panel);
 
 
        }
 
 
    }
Код самый простой, и даёт на деле получить красивую картинку.
На основной форме пишем

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public Form()
        {
            InitializeComponent();
            this.AddFormPanel("Новое задание");
            FormComponent.panel.MouseDown += new MouseEventHandler(PanelMove_MouseDown);
            FormComponent.panel.MouseMove += new MouseEventHandler(PanelMove_MouseMove);
            FormComponent.panel.MouseUp += new MouseEventHandler(PanelMove_MouseUp);
            FormComponent.panel2.MouseDown += new MouseEventHandler(PanelMove_MouseDown);
            FormComponent.panel2.MouseMove += new MouseEventHandler(PanelMove_MouseMove);
            FormComponent.panel2.MouseUp += new MouseEventHandler(PanelMove_MouseUp);
            FormComponent.close.Click += Close_Click;
        }
 
        private void Close_Click(object sender, EventArgs e)
        {
            this.Close();
        }
C#
1
FormComponent.panel.MouseDown += new MouseEventHandler(PanelMove_MouseDown);
Даст возможность двигать не только за пиксель формы, но и за панель которую мы добавили.

А на выходе всего этого мы получаем
Нажмите на изображение для увеличения
Название: doc2.png
Просмотров: 31
Размер:	25.8 Кб
ID:	5536

Скажете что я наркоман? Да! но зато я вижу в этом прекрасное.



upd1. Для того чтобы края формы были закруглены в событие загрузки формы нужно добавить
C#
1
2
IntPtr hRgn = CreateRoundRectRgn(0, 0, ШиринаФормы, ВысотаФормы, 10, 10); //10 это какой скос будет
            SetWindowRgn(this.Handle, hRgn, true);
upd2.Для того чтобы при перетаскивании была форма как на видео нужно добавить
C#
1
this.Opacity = *
у меня стоит так
C#
1
2
3
4
5
6
7
8
9
10
 private void PanelMove_MouseMove(object sender, MouseEventArgs e)
        {
            if (Drag)
            {
                this.Top = Cursor.Position.Y - MouseY;
                this.Left = Cursor.Position.X - MouseX;
                this.Opacity = 0.5;
            }
        }
        private void PanelMove_MouseUp(object sender, MouseEventArgs e) { Drag = false; this.Opacity = 1; }
P.S. Возможно я для кого то наркоман, а возможно кому то это пригодится. Вот лично мне это нужно было.
Менять, добавлять изменять можно как душе угодно.
Тестовый проект приложил
Вложения
Тип файла: zip ExtWPF.zip (205.7 Кб, 14 просмотров)
Просмотров 80 Комментарии 2
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для mozgotron
    Мне понравился ваш новый дизайн формы. Чётко получилось.
    Запись от mozgotron размещена 06.09.2019 в 10:04 mozgotron вне форума
  2. Старый комментарий
    Цитата:
    Сообщение от mozgotron Просмотреть комментарий
    Мне понравился ваш новый дизайн формы. Чётко получилось.
    спасибо Вам
    Хоть кто-то отзыв оставил)) Значит можно продолжать творить псевдоWPF над контролами
    Запись от anomal6 размещена 07.09.2019 в 22:05 anomal6 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru