Как закруглить кнопку в windows forms

How do I make a button in a round shape rather than the conventional rectangle. I am using winforms(2.0)

What about ‘GDI’?

Implementation Example:

 #region <Round Corners> : (Properties)
        // [Use Round Corners]
        private bool useRoundCorners = false;

        [Category("Control Corners"), DisplayName("Round Corners")]
        [Description("Set Round Corners.")]
        [Browsable(true)]
        public bool UseRoundBorders
        {
            get { return useRoundCorners; }
            set { if (useRoundCorners != value) { useRoundCorners = value; Invalidate(); } }
        }

        // [Ellipse Radius]
        private int ellipseRadius = 20;

        [Category("Control Corners"), DisplayName("Radius")]
        [Description("Set Corner (Ellipse) Radius")]
        [Browsable(true)]
        public int EllipseRadius
        {
            get { return ellipseRadius.FixedValue(0, 90); }
            set { if (ellipseRadius != value.FixedValue(0, 90)) { ellipseRadius = value; Invalidate(); } }
        }
        #endregion

        #region <Round Corners> : (Draw)
        [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
        private static extern IntPtr CreateRoundRectRgn
        (
            int nLeftRect,     // x-coordinate of upper-left corner
            int nTopRect,      // y-coordinate of upper-left corner
            int nRightRect,    // x-coordinate of lower-right corner-
            int nBottomRect,   // y-coordinate of lower-right corner
            int nWidthEllipse, // width of ellipse
            int nHeightEllipse // height of ellipse
        );


        /// <summary> Draw Corners (Round or Square). </summary>
        /// <param name="e"></param>
        private void DrawCorners()
        {
            if (useRoundCorners) { this.Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, ellipseRadius, ellipseRadius)); }
            else { this.Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 0, 0)); }
        }
        #endregion

    /// <summary> Redraw (Update) the Control. </summary>
    /// <param name="e"></param>
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        DrawCorners();
    }    

Extension to Limit Round Corner Radius (*Range: 0-90)

Author: Salvador

// Extension to Set Min. & Max. Values to Properties
public static class Extensions
{
    public static int FixedValue(this int value, int min, int max)
    {
        if (value >= min && value <= max) { return value; }
        else if (value > max) { return max; }
        else if (value < min) { return min; }
        else { return 1; }
    }
}

Да-да, я знаю, что лучше не делать на Windows Forms красивые приложения – для этого есть WPF. Однако, если проект уже разросся, то переносить его из-за пары красивостей не хочется. Тем более, что при достаточной сноровке можно делать симпатичные кнопочки и на Windows Forms.

Итак, сначала создаем кнопку. Называем её неоригинально – button1. Сначала закругляем ей края при загрзуке формы (событие лоад):

System.Drawing.Drawing2D.GraphicsPath Button_Path = new System.Drawing.Drawing2D.GraphicsPath();
            Button_Path.AddEllipse(-10, -9, this.button1.Width+20, 40);
            Region Button_Region = new Region(Button_Path);
            this.button1.Region = Button_Region;

Числа подбираются индивидуально — чтобы края у кнопки были закруглены равномерно — я же не заню, какого размера она у вас.

Теперь нам надо закрасить кнопку. Но не просто однотонно, а с градиентом. Это тоже реализуется довольно просто. В обработчик перерисовщика кнопки кидаем:

    private void button1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
        
                g.FillRectangle(
                    new LinearGradientBrush(PointF.Empty, new PointF(0, button1.Height), Color.Black, Color.Green),
                    new RectangleF(PointF.Empty, button1.Size));
            g.DrawString("Вход за преподавателя", new Font("Arial", 10), System.Drawing.Brushes.White, new Point(10, 3));

        }

И получается вот такая картина:

Не сказать, чтобы очень красиво, но своей цели мы все же добились. Если вам требуется помощь программиста по C# или другим языкам программирования, то вы можете написать мне — за небольшую плату я вам с удовольствием помогу.


Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, visual studio, windows forms

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
    public class RoundButton : Control
    {
        public Color BackColor2 { get; set; }
        public Color ButtonBorderColor { get; set; }
        public int ButtonRoundRadius { get; set; }
 
        public Color ButtonHighlightColor { get; set; }
        public Color ButtonHighlightColor2 { get; set; }
        public Color ButtonHighlightForeColor { get; set; }
 
        public Color ButtonPressedColor { get; set; }
        public Color ButtonPressedColor2 { get; set; }
        public Color ButtonPressedForeColor { get; set; }
 
        private bool IsHighlighted;
        private bool IsPressed;
 
        public RoundButton()
        {
            Size = new Size(100, 40);
            ButtonRoundRadius = 30;
            BackColor = Color.Gainsboro;
            BackColor2 = Color.Silver;
            ButtonBorderColor = Color.Black;
            ButtonHighlightColor = Color.Orange;
            ButtonHighlightColor2 = Color.OrangeRed;
            ButtonHighlightForeColor = Color.Black;
 
            ButtonPressedColor = Color.Red;
            ButtonPressedColor2 = Color.Maroon;
            ButtonPressedForeColor = Color.White;
        }
 
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams createParams = base.CreateParams;
                createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
                return createParams;
            }
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
 
            var foreColor = IsPressed ? ButtonPressedForeColor : IsHighlighted ? ButtonHighlightForeColor : ForeColor;
            var backColor = IsPressed ? ButtonPressedColor : IsHighlighted ? ButtonHighlightColor : BackColor;
            var backColor2 = IsPressed ? ButtonPressedColor2 : IsHighlighted ? ButtonHighlightColor2 : BackColor2;
 
 
            using (var pen = new Pen(ButtonBorderColor, 1))
                e.Graphics.DrawPath(pen, Path);
 
            using (var brush = new LinearGradientBrush(ClientRectangle, backColor, backColor2, LinearGradientMode.Vertical))
                e.Graphics.FillPath(brush, Path);
 
            using (var brush = new SolidBrush(foreColor))
            {
                var sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
                var rect = ClientRectangle;
                rect.Inflate(-4, -4);
                e.Graphics.DrawString(Text, Font, brush, rect, sf);
            }
 
            base.OnPaint(e);
        }
 
        protected override void OnPaintBackground(PaintEventArgs e)
        {
        }
 
        protected override void OnMouseEnter(EventArgs e)
        {
            base.OnMouseEnter(e);
            IsHighlighted = true;
            Parent.Invalidate(Bounds, false);
            Invalidate();
        }
 
        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            IsHighlighted = false;
            IsPressed = false;
            Parent.Invalidate(Bounds, false);
            Invalidate();
        }
 
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            Parent.Invalidate(Bounds, false);
            Invalidate();
            IsPressed = true;
        }
 
        protected override void OnMouseUp(MouseEventArgs e)
        {
            base.OnMouseUp(e);
            Parent.Invalidate(Bounds, false);
            Invalidate();
            IsPressed = false;
        }
 
        protected GraphicsPath Path 
        {
            get
            {
                var rect = ClientRectangle;
                rect.Inflate(-1, -1);
                return GetRoundedRectangle(rect, ButtonRoundRadius);
            }
        }
 
        public static GraphicsPath GetRoundedRectangle(Rectangle rect, int d)
        {
            var gp = new GraphicsPath();
 
            gp.AddArc(rect.X, rect.Y, d, d, 180, 90);
            gp.AddArc(rect.X + rect.Width - d, rect.Y, d, d, 270, 90);
            gp.AddArc(rect.X + rect.Width - d, rect.Y + rect.Height - d, d, d, 0, 90);
            gp.AddArc(rect.X, rect.Y + rect.Height - d, d, d, 90, 90);
            gp.CloseFigure();
 
            return gp;
        }
    }
  • Remove From My Forums
  • Question

  • I have used many codes for generating Rounded Corner button. But, that are all have some issue in the edge or in the corner radius border.

    I want the clean code, which should be like perfect Rounded corner edge in the button (like our mobile phone edge with descent color).

    Can anybody share the sample source code with clean examples…?

    • Moved by

      Tuesday, May 5, 2020 1:28 PM
      Winforms related

Answers

  • It was just a test to create it dynamically and see that it is anti-aliased

    For a real control, you must add a Constructor without parameters

    Test, to be improved =>

    [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(System.ComponentModel.Design.IDesigner))]
    public partial class RoundedUserControl : System.Windows.Forms.UserControl
    {
        private int nRadius = 20;
    
        // crash on VS 2015
    
        //[Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
        //[Description("Text for User Control"), Category("Data")]
        //public override string Text 
        //{
        //    get { return this.Text; }
        //    set { this.Text = value; }
        //}
    
        [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
        [Description("Text for User Control"), Category("Data")]
        public string ControlText
        {
            get { return this.Text; }
            set { this.Text = value; }
        }
    
        public int Radius
        {
            get { return nRadius; }
            set { nRadius = value; }
        }
    
        private System.Drawing.Color borderColor = System.Drawing.Color.Red;
    
        public System.Drawing.Color BorderColor
        {
            get { return borderColor; }
            set { borderColor = value; }
        }
    
        private System.Drawing.Color fillColor = System.Drawing.SystemColors.ButtonFace;
    
        public System.Drawing.Color FillColor
        {
            get { return fillColor; }
            set { fillColor = value; }
        }
    
        private System.Drawing.Color oldFillColor;
    
        protected override void OnMouseEnter(EventArgs e)
        {
            base.OnMouseEnter(e);
            oldFillColor = FillColor;
            FillColor = System.Drawing.SystemColors.ButtonHighlight;
            this.Invalidate();
        }
    
        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            FillColor = oldFillColor;
            this.Invalidate();
        }
    
        private int nBorderSize = 4;
    
        public int BorderSize
        {
            get { return nBorderSize; }
            set { nBorderSize = value; }
        }
    
        public RoundedUserControl()
        {
            //InitializeComponent();
        }
    
        public RoundedUserControl(int nRadius = 20, System.Drawing.Color? fillColor = null, System.Drawing.Color? borderColor = null, int borderSize = 4) : this()
        {
            Radius = nRadius;
            FillColor = fillColor ?? System.Drawing.SystemColors.ButtonFace;
            BorderColor = borderColor ?? System.Drawing.Color.Red;
            BorderSize = borderSize;
        }
    
    
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
          
            nRadius = Math.Min(nRadius, Height - BorderSize * 2);
            Rectangle rect = new Rectangle(BorderSize, BorderSize, Width - BorderSize * 2, Height - BorderSize * 2);
            using (System.Drawing.Drawing2D.GraphicsPath gp = CreatePath(rect, nRadius, false))
            {
                System.Drawing.Pen pen = new System.Drawing.Pen(BorderColor, BorderSize);
                pen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;
                e.Graphics.FillPath(new SolidBrush(FillColor), gp);
                e.Graphics.DrawPath(pen, gp);
            }
    
            //System.Drawing.Size textSize = TextRenderer.MeasureText(this.Text, this.Font);
            System.Drawing.Size textSize = TextRenderer.MeasureText(this.ControlText, this.Font);
            var nWidth = ((this.Width - textSize.Width) / 2);
            var nHeight = ((this.Height - textSize.Height) / 2);
            System.Drawing.Point drawPoint = new System.Drawing.Point(nWidth, nHeight);
            Rectangle normalRect = new Rectangle(drawPoint, textSize);
            TextRenderer.DrawText(e.Graphics, this.Text, this.Font, normalRect, ForeColor);
        }
    
        public static System.Drawing.Drawing2D.GraphicsPath CreatePath(Rectangle rect, int nRadius, bool bOutline)
        {
            int nShift = bOutline ? 1 : 0;
            System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
            path.AddArc(rect.X + nShift, rect.Y, nRadius, nRadius, 180f, 90f);
            path.AddArc((rect.Right - nRadius) - nShift, rect.Y, nRadius, nRadius, 270f, 90f);
            path.AddArc((rect.Right - nRadius) - nShift, (rect.Bottom - nRadius) - nShift, nRadius, nRadius, 0f, 90f);
            path.AddArc(rect.X + nShift, (rect.Bottom - nRadius) - nShift, nRadius, nRadius, 90f, 90f);
            path.CloseFigure();
            return path;
        }  
    }

    • Marked as answer by
      Gani tpt
      Tuesday, May 12, 2020 7:43 AM
    • Unmarked as answer by
      Gani tpt
      Tuesday, May 12, 2020 11:36 AM
    • Marked as answer by
      Gani tpt
      Wednesday, May 13, 2020 3:29 AM

  • You must call Invalidate() after you change the text (or
    Refresh())

    .Text should work but as I put in comments, it crashes on my configuration (VS 2015, Windows 10)…

    • Marked as answer by
      Gani tpt
      Wednesday, May 13, 2020 5:22 PM

Skip to content

With windows form application, there are multiple ways to create a custom shaped button. One of the option is to use a picture box and set a round image as background. The other option which is the best one is to create a custom button by inheriting from the Button class and overriding the OnPaint event. With this approach, we will get all the features of a windows button with a custom shape. Steps to create a rounded button is explained below,

  1. Add a new Class named RoundButton

Add a new Class to your project

2. Inherit the Button class and override the OnPaint method as follows

public class RoundButton : Button
{
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
var graphicsPath = new GraphicsPath();
graphicsPath.AddEllipse(0, 0, ClientSize.Width, ClientSize.Height);
this.Region = new Region(graphicsPath);
base.OnPaint(e);
}
}

3. Build the project and open the Form where button is to be placed. The new RoundButton would appear in the ToolBox in the Components section at the top of the tool list

4. Drag and Drop the button to the form

5. Modify the width and the height of the button to change the shape from ellipse to circle.

I changed the FlatStyle to Popup, BackColor to ActiveCaption and Width and Height to 75 which draws a rounded button on the form.

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.

Egolds

Дней с нами
1.374
Розыгрыши
0
Сообщения
51
Репутация
+/-

2

Реакции
62


  • #1

Сегодня создаем Rounded Corners Button, это закругленные углы кнопок. И как всегда, в Windows Forms мы делаем современный графический интерфейс. В этот раз я решил создать кнопки в современном стиле, который вы уже наверняка встречали в интерфейсах Android, Google и других веб-сайтах.

+ Создадим собственный компонент (C# Component), которому дадим возможность манипулировать другими всеми кнопками на форме, чтобы закругление можно было настраивать не только отдельно на каждой кнопке, но и на всех сразу.

kaktus

Дней с нами
1.188
Розыгрыши
0
Сообщения
219
Репутация
+/-

0

Реакции
141


Egolds

Дней с нами
1.374
Розыгрыши
0
Сообщения
51
Репутация
+/-

2

Реакции
62


iamnazar

Дней с нами
1.280
Розыгрыши
0
Сообщения
103
Репутация
+/-

0

Реакции
50


  • #4

Чувак, как я раньше не видел твои посты, как раз нечем заняться на карантине , спасибо!

Egolds

Дней с нами
1.374
Розыгрыши
0
Сообщения
51
Репутация
+/-

2

Реакции
62


  • #5

Чувак, как я раньше не видел твои посты, как раз нечем заняться на карантине , спасибо!

Пожалуйста!)

илья-воздух

Дней с нами
997
Розыгрыши
0
Сообщения
261
Репутация
+/-

0

Реакции
257
Telegram
@ilia_vozduh


koper

Дней с нами
1.535
Розыгрыши
0
Сообщения
133
Репутация
+/-

31

Реакции
273


  • #9

а через winapi както можно закруглить стандартные кнопки ?

Egolds

Дней с нами
1.374
Розыгрыши
0
Сообщения
51
Репутация
+/-

2

Реакции
62


  • #10

а через winapi както можно закруглить стандартные кнопки ?

Думаю можно закруглить стандартные даже без winapi, но будет выглядеть как обрезанные по краям

Похожие темы

Egolds

Содержание

  1. Закругленные края в кнопке C# (WinForms)
  2. 3 ответов
  3. Как создать кнопку с закругленными углами/краями на Winform С#?
  4. Применение скругленных углов в классических приложениях для Windows 11
  5. Почему в моем приложении не скруглены углы?
  6. Как предоставить согласие на скругление углов
  7. определения API
  8. Приложения C#
  9. Примеры
  10. Пример 1. Скругление углов главного окна приложения в C# — WPF
  11. Пример 2. Скругление углов главного окна приложения в C# — WinForms
  12. Пример 3. Скругление углов главного окна приложения в C++
  13. Пример 4. Скругление углов меню с небольшим радиусом — С++
  14. Пример 5. Настройка содержимого окна для скругления — С++
  15. Закругленные края в button C# (WinForms)
  16. 6 ответов
  17. Как создать/сделать закругленные угловые кнопки в WPF?
  18. 9 ответов

Закругленные края в кнопке C# (WinForms)

e890968a156199938b7c3372b95fcccf

Здравствуйте, через некоторые исследования здесь и на других сайтах я сделал кнопку с закругленными краями.

проблема, с которой я сталкиваюсь,-это «синяя подсветка» кнопки: она отображается на большей части кнопки, но не отображается на закругленных краях, поэтому моя кнопка частично подсвечена и частично не подсвечена (по краям). Что я мог сделать, чтобы решить эту проблему? Спасибо.

PS: Я не могу использовать WPF. Приложение предназначено для очень старого компьютера;, пожалуйста,не предлагай. Кроме того, у клиента нет денег на новый компьютер.

3 ответов

это быстро, вы можете настроить вещи и оптимизировать довольно много деталей..

очевидно, поскольку у нас есть класс, мы можем кэшировать GraphicsPath в переменной класса. И конечно, ты выбираешь цвет..

77107588e48d0713527874c4e356b841

вы можете использовать WebBrowser, сделать кнопку с HTML и CSS, а затем использовать webbrowser.DocumentText = «your html»;

кроме как покрасить его самостоятельно, я не думаю, что есть что-то, что вы можете сделать. Логика базовой кнопки paint не записывается как «показать синюю подсветку вокруг такой-то части любой области окна». Вместо этого он написан с типом региона, который он ожидает-прямоугольный. Таким образом, базовая краска всегда будет рисовать прямоугольное изображение в обрезанной форме. У вас будет более легкое время таких вещей в WPF.

Источник

Как создать кнопку с закругленными углами/краями на Winform С#?

Хорошо, я буду помещать изображение на кнопку, и это изображение имеет закругленные углы. Как это сделать? Я искал поиски в Интернете и искал часы, но мне все равно не повезло.

Если вы хотите придерживаться форм Windows, тогда вы должны использовать графический ящик и делать анимацию при наведении и т.д. Когда вы нажимаете на нее, она будет функционировать как кнопка.

Или просмотрите эти статьи:

Однако вы также можете использовать WPF, если хотите более приятный макет, но он несколько отличается от форм Windows.

Вы можете использовать форму прямоугольника из Microsoft Visual Basic PowerPacks.

Я проверил, что он работает в проекте форм Windows С# в VS2013 Express для Windows Desktop на Windows7 x64, ориентированном как на x86, так и на x64.

lazy placeholder

Для удобства вы можете добавить новую вкладку Toolbox и добавить к ней элементы управления VB PP.

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

1. должен иметь визуальную студию, создать новый проект
2. выберите новую форму окна в качестве нового проекта
3. добавьте 2 x кнопки в форму
4. дважды щелкните в любом месте формы, чтобы открыть окно кода
5. удалите весь код, включая верхние заголовки Form1, и вставьте ниже

вызов функции “buttonBorderRadius (отправитель, 50)” означает, что вы можете установить разные borderRadius для отдельных кнопок.
и поскольку он использует объект, вы можете применить ту же функцию к изображениям и другим элементам управления (не все)

поэтому вы можете установить радиус границы 10 пикселей с помощью “buttonBorderRadius (отправитель, 10)”,
и радиус 50 пикселей, подобный этой “buttonBorderRadius (отправитель, 50)”,
просто измените целое число как 2-й аргумент в функции,
и первый аргумент должен быть переменной объекта

Источник

Применение скругленных углов в классических приложениях для Windows 11

Скругленные углы — это самая заметная особенность в геометрическом оформлении интерфейса Windows 11. В Windows 11 система автоматически скругляет углы окон верхнего уровня для всех предустановленных приложений, включая все приложения UWP, и большинства других приложений. Но в некоторых приложениях Win32 окна могут не скругляться. В этой статье объясняется, как применить скругление углов главного окна приложения Win32, если система не делает это автоматически.

По умолчанию скругление в приложениях не применяется при максимальном развертывании и прикреплении окон, а также при работе на виртуальной машине или в Виртуальном рабочем столе Windows (WVD).

notepad rounded

Почему в моем приложении не скруглены углы?

Если углы основного окна вашего приложения не скругляются автоматически, это связано с тем, что настроенные вами параметры рамки препятствуют скруглению. В контексте диспетчера окон рабочего стола (DWM), приложения делятся на три основные категории:

Приложения, в которых скругление применяется по умолчанию.

К ним относятся приложения, которым требуется полноценная предоставленная системой рамка и элементы управления заголовками (кнопки свертывания, развертывания и закрытия), например «Блокнот». Сюда также входят приложения, которые предоставляют системе достаточно информации, чтобы она могла правильно скруглить углы, например задать стили окна WS_THICKFRAME и WS_CAPTION или предоставить границу неклиентской области шириной в 1 пиксель, которую система может использовать для скругления углов.

Приложения, в которых скругление не применено в соответствии с политикой, но в которых это можно сделать.

Приложения этой категории обычно самостоятельно настраивают большую часть рамки окна, но им по-прежнему требуется отображаемая системой граница и тень (например, Microsoft Office). Если в вашем приложении скругление не применяется в соответствии с политикой, это может быть вызвано одной из следующих причин:

Изменение в одном из этих пунктов приведет к нарушению автоматического скругления. Хотя мы старались скруглить углы как можно большего количества приложений с помощью нашей системной эвристики, есть некоторые комбинации настроек, которые мы не можем предсказать. Для таких случаев мы предусмотрели API, позволяющий предоставить согласие вручную. Если вы устраните эти проблемы в приложении или вызовете API предоставления согласия, как описано в следующем разделе, система сможет применить скругление. Но обратите внимание, что API является указанием для системы и не гарантирует скругление в зависимости от настроек.

Приложения, для которых нельзя применить скругление, даже если они вызывают API предоставления согласия.

У таких приложений нет рамки или границ, а их пользовательский интерфейс обычно имеет широкие возможности настройки. Если в приложении выполняется одно из следующих действий, в нем нельзя применить скругление:

Например, приложение может размещать прозрачные пиксели вокруг главного окна путем альфа-наложения для каждого пикселя для достижения эффекта настраиваемой тени. В результате окно теряет прямоугольную форму и система не может скруглить углы.

Как предоставить согласие на скругление углов

определения API

Если в приложении не применяется скругление в соответствии с политикой, при необходимости можно вызвать наш новый API, чтобы для вашего приложения можно было предоставить согласие на скругление углов. Этот API выражается как значения перечисления, которые должны передаваться в API DwmSetWindowAttribute, как показано в новом перечислении DWM_WINDOW_CORNER_PREFERENCE. Перечисление DWM_WINDOW_CORNER_PREFERENCE определено в заголовке dwmapi.h и доступно в последней версии пакета SDK Insider Preview.

Значение перечисления Описание
DWMWCP_DEFAULT Система определяет, следует ли скруглять углы окон.
DWMWCP_DONOTROUND Скругление не применяется.
DWMWCP_ROUND Скругление применяется, если это уместно.
DWMWCP_ROUNDSMALL Скругление с небольшим радиусом применяется, если это уместно.

Указатель на соответствующее значение из этого перечисления передается третьему параметру функции DwmSetWindowAttribute. Для второго параметра, который указывает, какой атрибут задается, передайте новое значение DWMWA_WINDOW_CORNER_PREFERENCE, определенное в перечислении DWMWINDOWATTRIBUTE.

Приложения C#

Примеры

В приведенных ниже примерах показано, как вызвать DwmSetWindowAttribute или DwmGetWindowAttribute, чтобы управлять скруглением углов в приложении, если скругление не применяется в соответствии с политикой.

Для краткости и ясности в этих примерах обработка ошибок исключена.

Пример 1. Скругление углов главного окна приложения в C# — WPF

Чтобы вызвать DwmSetWindowAttribute в классическом приложении C# WPF, необходимо импортировать dwmapi.dll и сигнатуру функции DwmSetWindowAttribute с использованием P/Invoke. Сначала необходимо переопределить необходимые значения перечисления из собственного заголовка dwmapi.h, а затем объявить функцию с использованием типов C#, эквивалентных исходной собственной функции. Так как оригинал принимает указатель на третий параметр, обязательно используйте ключевое слово ref, чтобы можно было передать адрес переменной при вызове функции. Это можно сделать в классе MainWindow в MainWindow.xaml.cs.

Затем в конструкторе MainWindow после вызова InitializeComponent создайте новый экземпляр класса WindowInteropHelper, чтобы получить указатель на базовый дескриптор окна (HWND). Обязательно используйте метод EnsureHandle, чтобы система создала HWND для окна перед его отображением, так как обычно система делает это только после выхода из конструктора.

Пример 2. Скругление углов главного окна приложения в C# — WinForms

Как и в случае с WPF, для приложения WinForms сначала необходимо импортировать dwmapi.dll и сигнатуру функции DwmSetWindowAttribute с использованием P/Invoke. Это можно сделать в основном классе Form.

Вызов DwmSetWindowAttribute также соответствует вызову в приложении WPF, но при этом вам не нужно использовать вспомогательный класс для получения HWND, так как это просто свойство Form. Вызовите эту функцию из конструктора Form после вызова InitializeComponent.

Пример 3. Скругление углов главного окна приложения в C++

Для собственного приложения C++ можно вызвать DwmSetWindowAttribute в функции обработки сообщений после создания окна, чтобы система применила скругление.

Пример 4. Скругление углов меню с небольшим радиусом — С++

По умолчанию меню — это всплывающие окна, углы которых не скругляются. Если приложение создает пользовательское меню и вы хотите, чтобы оно соответствовало политике скругления для других стандартных меню, можно вызвать API. Он проинформирует систему о том, что углы этого окна должны быть скруглены, даже если это не соответствует политике скругления по умолчанию.

Пример 5. Настройка содержимого окна для скругления — С++

Когда углы окна скругляются, часть клиентской области окна немного обрезается. Из-за этого некоторым приложениям может потребоваться изменить содержимое окон.

Например, бегунок вертикальной полосы прокрутки может располагаться прямо в нижнем углу окна справа и при скруглении может быть обрезан. Если это нежелательно, при скруглении углов окна полосу прокрутки можно перенести в другое расположение. Но, так как окно не всегда скругляется (например, оно никогда не скругляется в максимально развернутом виде), следует вызвать DwmGetWindowAttribute, чтобы определить, нужно ли корректировать пользовательский интерфейс и до какой степени.

Источник

Закругленные края в button C# (WinForms)

gvLKA

Здравствуйте, благодаря некоторым исследованиям здесь и на других сайтах я сделал закругленные края button.

Проблема, с которой я сталкиваюсь,-это «синяя подсветка» button: она отображается на большинстве button, но не отображается на закругленных краях, поэтому мой button частично выделен и частично не выделен (по краям). Что я мог сделать, чтобы решить эту проблему? Спасибо.

PS: я не могу использовать WPF. Приложение предназначено для очень старого компьютера, поэтому, пожалуйста,не предлагайте его. Кроме того, у клиента нет денег, чтобы купить новый компьютер.

6 ответов

Как закруглить края в элементе управления picturebox. Я хочу получить углы, подобные эллипсу, но не знаю, как это сделать. Я Использую C#. Спасибо!

Мне было интересно, знает ли кто-нибудь, как сделать закругленные края фона только для определенных углов. Например, на экране блокировки Android 2.2 были два slidingDrawers, чтобы разблокировать телефон и сделать снимок или что-то еще. У slidingDrawers был закругленный угол со значком внутри.

Это быстрый способ, вы можете настроить вещи и оптимизировать довольно много деталей..

Очевидно, что, поскольку у нас есть класс, мы можем кэшировать GraphicsPath в переменной класса. И, конечно, вы выбираете цвет..

r2VmN

Есть ли способ получить закругленные края на UITableViewCell таким образом, чтобы: позволяет пользователю выбирать/настраивать цвет фона ячейки во время выполнения (не все ячейки могут иметь одинаковый цвет фона) не используя режим UITableView GROUPED Поэтому я предполагаю, что это означает, что я.

Мне нужен способ нарисовать закругленные приподнятые и впалые угловые края на пользовательском элементе управления. В настоящее время я использую ControlPaint.DrawBorder3D, но, конечно, углы выровнены и выглядят ужасно. Как это можно сделать? Кроме того, этому проекту не разрешается использовать.

Это настройка на ответ TaW, чтобы легче настроить borderRadius и borderThickness. Если вы получаете случайное белое пространство между границей и цветом фона button, m нужно настроить.

Источник

Как создать/сделать закругленные угловые кнопки в WPF?

Мне нужно создать закругленный угол глянцевая кнопка в WPF. Кто-нибудь может объяснить мне, какие шаги необходимы?

9 ответов

вы должны создать свой собственный ControlTemplate для кнопки. просто взгляните на пример

создал стиль под названием RoundCorner и внутри, который я изменил, а создал свой собственный новый шаблон управления с границей (CornerRadius=8) для круглого угла и некоторого фона и другого триггерного эффекта. Если у вас есть или знаете выражение Blend, Это можно сделать очень легко.

используя

это скорее минимальный шаблон управления, чтобы получить кнопку с закругленными углами, однако у вас не будет наведения или нажмите визуальные эффекты. Но вы можете добавить их в шаблон элемента управления по мере необходимости. Я работал на темном фоне, отсюда и белый фон.

я использовал шаблон элемента управления из следующего сообщения в блоге в качестве отправной точки: http://shihac-sharp.blogspot.com.au/2012/05/button-with-rounded-corners-in-wpf.html

вы можете попробовать это.

в качестве альтернативы вы можете закодировать что-то вроде этого:

«кнопка» будет выглядеть примерно так:

8a88f73b73e2d8252985eb35283769bf

вы можете установить любой другой контент, вместо изображения.

в вашем приложении.xaml добавить эту часть стиля:

ну лучший способ получить круглые углы быстро и со стандартной анимацией, чтобы создать копию шаблона управления с Blend. Как только вы получите копию, установите радиус угла на теге сетки, и вы сможете иметь свой контроль с полной функциональностью анимации и применимы к любому элементу управления кнопкой. посмотрите этот код:

Я также редактировал VisualState= «PointerOver» специально в раскадровке.TargetName= «BorderBrush», потому что его ThemeResource получает квадрат углы всякий раз, когда срабатывает PointerOver.

тогда вы должны иметь возможность применить его к вашему стилю управления следующим образом:

Так что вы можете применить свои стили к любой кнопке.

вы можете использовать прикрепленные свойства для установки радиуса границы кнопки (также то же самое будет работать для текстовых полей).

создать класс для вложенного свойства

затем вы можете использовать синтаксис вложенного свойства для нескольких кнопок без дублирования стилей:

это адаптированная версия ответа @Kishore Kumar, которая проще и более точно соответствует стилю и цветам кнопки по умолчанию. Он также устраняет проблему, что его» IsPressed «триггер находится в неправильном порядке и никогда не будет выполнен, так как «MouseOver» будет иметь прецедент:

Источник

Понравилась статья? Поделить с друзьями:
  • Как закриптовать стиллер от windows defender
  • Как закриптовать вирус от windows defender
  • Как закрепить изображение поверх всех окон windows 10
  • Как закрепить игру стим на панели задач в windows 10
  • Как закрепить игру на рабочем столе в windows 10