Да-да, я знаю, что лучше не делать на 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)
Элемент кнопка в Visual Studio 2022
И получается вот такая картина:
Не сказать, чтобы очень красиво, но своей цели мы все же добились. Если вам требуется помощь программиста по C# или другим языкам программирования, то вы можете написать мне — за небольшую плату я вам с удовольствием помогу.
Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
заметки, visual studio, windows forms
Источник: upread.ru
Как сделать в visual studio программу с кнопками
Честно говорю, что я искал, как это делается, но не понял. Мне нужно, чтобы один раз нажал кнопку в программе, и с этого момента началось циклическое выполнение действий. Типа того:
Как можно такое сделать?
Регистрация: 15.02.2010
Сообщений: 15,411
Есть такое понятие как обработчик нажатия кнопки. Обычно в него можно попасть дважды кликнув на нужной кнопке в дизайнере.
Форумчанин
Регистрация: 12.02.2010
Сообщений: 787
А может как-то проще можно сделать? Я понял, что при каждом нажатии на кнопку я могу изменять значение некоторой переменной с True на False, а при обработке менять цвет кнопки, например.
Но вот можно подробнее насчет «нужной кнопки в дизайнере»?
Регистрация: 12.01.2011
Сообщений: 19,500
Чего подробнее?
Регистрация: 15.02.2010
Сообщений: 15,411
А может как-то проще можно сделать? Я понял, что при каждом нажатии на кнопку я могу изменять значение некоторой переменной с True на False, а при обработке менять цвет кнопки, например.
Создание оконного приложения С++/Visual studio 2019/Windows Form
Ну зависит от задачи и проектирования. Можно отдельный рабочий поток запустить и кнопкой переключать его состояние, модно цикл в кнопку всунуть.
Форумчанин
Регистрация: 12.02.2010
Сообщений: 787
А, понятно, ну я-то в курсе события Click. Мне-то именно это и надо, чтобы кнопка принимала 2 состояния — нажатое, и отжатое. Сейчас я имею лишь кнопку, на которую можно просто кликать, у меня по этому клику выполняется код, 1 раз.
А мне-то надо так: нажал на кнопу — она изменилась и стала нажатой, и циклически работает тот код, который я прописал для такого положения кнопки. Вот как это сделать?
Я на таком уровне в решении данного вопроса:
private void button1_Click(object sender, EventArgs e) < btn1pos = !btn1pos; if (btn1pos == true) < this.Controls[«button1»].UseWaitCursor = false; >if (btn1pos == false) < this.Controls[«button1»].UseWaitCursor = true; >>
Думаю, что все можно сделать намного проще, вот и спрашиваю.
Последний раз редактировалось Krasi; 09.10.2015 в 15:15 .
Регистрация: 15.02.2010
Сообщений: 15,411
1. Берете CheckBox и Appearance ставите в Баттон.
2. Делаете какой-либо флаг и перерисовываете кнопку соответствующе.
3. Используйте сторонние компоненты
4. Сами отрисуйте
.
Регистрация: 12.01.2011
Сообщений: 19,500
Да куда уж проще, вроде и так просто.
В чем смысл писать Controls[«button1»] если у вас уже есть созданная дизайнером переменная button1?
И == true/false обычно не пишут для boolean выражений. Достаточно if(btn1Pos)/if(!btn1Pos) (или просто else).
Форумчанин
Регистрация: 12.02.2010
Сообщений: 787
А можете подсказать, что у меня происходит не так? То есть сейчас вроде при первом нажатии должен работать мой код, а при втором — не должен, при третьем — снова должен и тп. Так вот, рассмотрим ситуацию на деле.
private void button1_Click(object sender, EventArgs e) < btn1pos = !btn1pos; ZedGraphControl zedGraph = new ZedGraphControl(); zedGraph.Location = new System.Drawing.Point(100, 10); zedGraph.Name = «zedGraph»; zedGraph.Size = new System.Drawing.Size(500, 300); this.Controls.Add(zedGraph); ZedGraphControl zgc = zedGraph; GraphPane myPane = zgc.GraphPane; if (btn1pos) < this.Controls[«button1»].UseWaitCursor = false; /////////////////Представляем символы в двоичном виде и выводим на график///////////////// ////////////////////////////////////////////////////////////////////////////////////////// string A = richTextBox1.Text; string str_bin = asbin(A); byte[] strBytes = System.Text.Encoding.Unicode.GetBytes(A); //string str = Encoding.ASCII.GetString(strBytes); StringBuilder sb = new StringBuilder(); foreach (byte b in System.Text.Encoding.Unicode.GetBytes(A)) sb.Append(Convert.ToString(b, 2).PadLeft(8, ‘0’)).Append(‘ ‘); string binaryStr = sb.ToString(); //////////////Массив 0 и 1 this.Controls[«richTextBox2»].Text = str_bin; ////////////////////////////////////////////////////////////////Создание значений x // Set the titles and axis labels myPane.Title = «Бинарные данные»; myPane.XAxis.Title = «n, выборки»; myPane.YAxis.Title = «bin_data, единицы»; PointPairList list = new PointPairList(); int l = strBytes.Length; int[] myArr = new int[l]; // Инициализируем каждый элемент массива вручную for (int i = 0; i < l; i++) < myArr[i] = i; list.Add(myArr[i], strBytes[i]); >LineItem myCurve = myPane.AddCurve(«bin_data», list, Color.Green, SymbolType.Diamond); zgc.AxisChange(); zgc.Refresh(); > if (!btn1pos) < this.Controls[«button1″].UseWaitCursor = true; >> static string chr2(char c) < string s = » «; for (; c != ‘