Уроки C# - Прозрачность контролов Windows Forms - плавное появление текста в C# - controls opacity
HTML-код
- Опубликовано: 5 окт 2024
- Донаты и на кофе ➜ t.me/win10twea...
Эксклюзив для спонсоров ➜ / xpuct
Если недоступна спонсорка ➜
Основной канал:
/ jailbreakvideo
#Opacity #Transparency #Controls #UI #Animation #Transition #СиSharp #СиШарп - Наука
async void Button1_Click(object sender, EventArgs e)
{
/**************
* Начальный цвет
* 70, 130, 180
*
* Желаемый цвет
* 135, 206, 250
*
**************/
int count = 0;
Again:
for (byte r = 70, g = 130, b = 180; r = 180; r -= 6, g -= 8, b -= 7, await Task.Delay(20))
label1.ForeColor = Color.FromArgb(r, g, b);
label1.ForeColor = Color.FromArgb(70, 130, 180);
count++;
if (count < 3)
goto Again;
}
Во мне перфекционист бьет тревогу...))
async public void button1_Click(object sender, EventArgs e)
{
for (byte[] i = { 240, 240, 240 }; i[0] >= 32 & i[1] >= 178 & i[2] >= 170; i[0] -= 10, i[1] -= 3, i[2] -= 4)
{
label2.ForeColor = Color.FromArgb(i[0], i[1], i[2]);
label2.Text = Color.FromArgb(i[0], i[1], i[2]).ToString();
await Task.Delay(100);
}
}
Нет предела совершенству =)
@@XpucT Ого, Хачатур ты гений, спасибо за такое решение.
Теперь понимаю зачем фантазия, очень крутое решение, аж вдохновило. Спасибо, что делишься инфой!
С циклом и счетчиком изящно вышел из трудной ситуации.
Спасибо за урок Хачатур, как раз то что искал в интернете и не смог найти в таком объяснении как у тебя в видео))))))))
Вот это да!!! Я просто в восторге от такого решения.
Хачатур, привет! Спасибо за видосики. Недавно начал изучать с# и твои видосы ну прям круто заходят. Хочу внести и свою лепту )) В видосе прозвучало "альфа канал, не запаривайтесь", а зря! Я занимаюсь видео и что такое альфа канал знаю, и им можно менять прозрачность! Поэтому начал читать про FromArgb. Короче у FromArgb есть четвертый параметр, вернее он первый: FromArgb(A, r, g, b). Он и работает как прозрачность. Его значение как и у цвета могут быть в диапазоне 0-255. 0 - прозрачен, 255 - непрозрачен. Меняя его значение можно менять прозрачность элемента. Правда, почему-то, на label он не сработал. А вот picturebox за милую душу. Остальные не пробовал.
Идея бомба, вот что значит инструмент в умелых руках, спасибо !
Неплохо работает с кнопкой goto от Хачатура))
void Button1_Click(object sender, EventArgs e)
{
M1();
}
async void M1()
{
Again:
for (byte r = 80, g = 80, b = 100 ; r < 180 & g < 163 & b < 237 ; r+= 10, g+=8, b+=14, await Task.Delay(30))
{
Button1.ForeColor = Color.FromArgb(r,g,b);
}
for (byte r = 180, g = 163, b = 237; r >= 80 & g >= 80 & b >= 100; r -= 10, g -= 8, b -= 14, await Task.Delay(30))
{
Button1.ForeColor = Color.FromArgb(r, g, b);
}
Button1.ForeColor = Color.FromArgb(80, 80, 100);
goto Again;
}
Можно кнопку центрировать - изначально размер ширины сделать 0 - а при каком то условии - плавно задать ширину) Магия
Очень крутой видео урок! Спасибо.
Интересно и подобные вещи в принципе помогают мыслить шире. Сам еще когда знакомился с VBA в экселе начал понимать, что любую идею в принципе можно запрограммировать, важно лишь объяснить идею понятными компьютеру командами. Однако в конкретном примере подобная прозрачность работает только при однотонном фоне, если же под элементом, который мы делаем прозрачным, лежит еще элемент, или же фон не однотонный, то данный способ не подходит)
вот именно
Я бы использовал одну переменную на желаемое число шагов и просто высчитывал значение каждой из 3 компонент цвета через текущую итерацию:
byte shagov=10, r,g,b;
for (byte i=1;i
Классные уроки спасибо хотя люблю wpf
Именно тот случай, когда ООП действительно нужно. Можно создать класс, наследуемый от Label'a, задать в нем определенный набор функций, управляющих анимацией цвета, размера и т.д. В итоге не придется постоянно копипастить и создавать множество анимированных контролов.
Вооооооооот =)
Спасибо за хорошую идею.
Все просто, когда знаешь как :)
Хачатур, привет! Спасибо за видео! Всё круто, но вот с ProgressBar такая история почему-то не работает. Может есть мысли как для него сделать? Если наложить на него panel то она просто его закроет. Мб что-то ещё, мб это в следующих уроках?
Решил найти решение, как можно сделать прозрачность в WF. Загуглил, попал на этот видос. А тут автор сделал тоже самое, что и мне пришло в голову)) Я просто надеялся, что есть другой путь) Видимо нет)
В начале урока решил сам подумать, как это можно сделать, и на 80% мои догадки сошлись с решением, понял что не так уж и глуп))))
Однажды, я столкнулся с задачей. Пацан мне говорит: "Сможешь сделать такую херню как на старых DVD Samsung?" (ну, это когда их логотип по экрану ползает). К тому моменту я рандом не знал и решил сделать из одного угла до другого, но форма была не ровная, точно так же как и в твоей задаче, я не мог тупо сделать Location.X + 1. Задачу я сделал, но пришлось изменить форму до равностороннего квадрата. Тогда у меня не хватило мозгов подсчитать шаги, как ты сделал. Спасибо, короче)
Если написать так то label будет бесконечно менять цвет.
for (byte r = 0, g = 0, b = 0; r = 0; r -= 6, g -= 8, b -= 7, await Task.Delay(50))
{
label2.ForeColor = Color.FromArgb(r, g, b);
}
Дак ведь операция & намного хуже && так как вычисляются сначала все условия, а потом уже проверяются до первого совпадения, тогда как && сразу вычисляет и проверяет по одному.
Можно сделать в одном методе сложить так же и вычесть так как ргб числа могут быть разными меньше и больше попробовал получилось Спасбо за урок !
async void button1_Click_1(object sender, EventArgs e)
{
for (byte r=199,g=21,b=133;r>=127&g
Молодец!
По прежнему жду твоих видосов с нетерпением))))
Для кнопки
FlatStyle->Flat
BackColor->(Internet)Transparent
Спасибо за уроки! :)
Я твоё дз сделал быстро(на самом деле в начале нихуя не заработало, перепутал всякие +- и т.д. но потом разобрался) и решил усложнить. Почему бы не сделать мигающую надпись и кнопку которая включала бы мигание и выключала. В начале сделал цикл while, потом понял что оно зацикливается и не отключается. Попробовал через метод, а он асинхронный и ему пофиг на меня. Пришлось читать метанит и микрософт о том, как отключить то, что не отключается. Ну и там пошло поехало, занял сам себе вечер. В начале сделал с двумя кнопками, потом сделал с одной. Не знаю на сколько правильно я сделал, но в итоге оно работает. На самом деле я и до просмотра твоих уроков что то там писал и делал, но как то раньше не мог разобраться и применить такие штуки как CancellationTokenSource, а тут оно вроде само как то случилось. Если можешь, скажи, что я сделал не так или как это можно было проще сделать. Спросить особо не у кого.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
bool click = false;
void Button1_Click(object sender, EventArgs e)
{
if (!click)
{
click = true;
CancellationToken token = cancelTokenSource.Token;
Magick(click, token, cancelTokenSource);
button1.Text = "не мигаем";
}
else if(click)
{
cancelTokenSource.Cancel();
label1.ForeColor = Color.FromArgb(47, 79, 79);
cancelTokenSource = new CancellationTokenSource();
click = false;
button1.Text = "мигаем";
}
}
async void Magick(bool lol, CancellationToken token, CancellationTokenSource cancelTokenSource)
{
while (lol)
{
for (byte r = 47, g = 79, b = 79; r >= 0 & g
bool =) Я ждал его =)
А теперь всё тоже самое но контролы должны быть друг над другом. )))
Спасибо. Лайк и подписка на оба канала
пипетка)) Веселое слово
19:30 досмотрел до этого момента и вдруг меня осенила мысль: так ведь надпись будет не плавно появляться из ниоткуда, надпись просто будет плавно ищзменять свой цвет, например из этого синего станет фиолетовой, потом жёлтой а потом уже такой как нам надо :-) продолжаю наблюдать эксперемент :-) и кстати, а не проще было бы воспользоваться альфа-каналом, ведь альфа-канал как раз и отвечает за прозрачность? вобщем смотрю до конца, забавный эксперимент. я когда то с модами для игры работал с цветами, мне эта тема довольно близка :-)
С Альфа будет топорность, так дело имеем не с квадратом, а с линиями, где есть антиальясинг.
Будет конфликт. Тут нужно именно из цвета в цвет 👍
Хачатур, приветствую. Подскажи пожалуйста, мне десктоп приложение нужно замутить, и сейчас выбор как раз завис на GUI. Также лучше WinForms использовать или Microsoft что-то лучше сделали? Заранее, спасибо!
Здравствуйте! А что если сделать так:
1. Создать класс, который наследуется от Label, и у него прописать код, где добавить свойство Alpha, и сделать прорисовку текста, где используется значение данного свойства:
using System.Drawing;
using System.Windows.Forms;
namespace MyProgram
{
public class LabelEx : Label
{
private int _alpha = 255;
public int Alpha
{
get { return _alpha; }
set { _alpha = value; Invalidate(); }
}
protected override void OnPaint(PaintEventArgs e)
{
using (Brush brush = new SolidBrush(Color.FromArgb(_alpha, ForeColor)))
{
e.Graphics.DrawString(Text, Font, brush, ClientRectangle);
}
}
}
}
2. И потом использовать свойство Alpha для изменения прозрачности и создания анимации:
public Form1()
{
InitializeComponent();
Task.Run(async () => { labelEx1.Alpha = 0; while ((labelEx1.Alpha += 5) < 255) { await Task.Delay(30); } });
}
Блин, вот смотрел Гошу Дударя, Объясняет мега поверхностно, непонятно что , для чего и зачем. Ты объясняешь идеально, все примеры мега яркие, хорошо запоминаются.Такой вопрос, где можно найти информацию про (as "отправитель как объект, уже день мучаюсь со строчками кода, там всего ничего, но я не понимаю как это работает, не мог бы дать информацию, где можно найти можно найти информацию по этому(Тавтология))(суть в том, что у меня есть Контейнер panel, в нем содержаться Label и PictureBox.(а эти объекты создаются по нажатию другой кнопки(динамично) И нужно как то сделать так, что бы бы по нажатию любого PictureBox менялся Label и panel именно тот, в котором находится сам PictureBox(Вот что мне предложили( var pb = sender as PictureBox;
if (pb != null)
{
var parent = pb.Parent;
}
var result = picture_Start.Parent.Controls.OfType().First();
if (pb == null) return;
var label = pb.Parent.Controls.OfType().First();
label.Font = new Font(label.Font, FontStyle.Strikeout); Где найти информацию по этой теме
Я бы не так делал.
Я as вообще ни разу не использую. Конкретно в Твоём случая Я бы указывал имя контрола таким лайфхаком:
((Label)sender).Text
То есть это будет тот самый контрол, который вызвал событие.
В Win 10 Tweaker точно также динамично расставляются Label, Button, Panel, toolTip и прочие.
И тот, кто нажмёт, у кого и будет смена. И прикол в том, что контролы у Меня называются по одному типу.
То есть label - Paint, Button - PaintButton, Удалить - Paint_del и т.д.
И вся эта красота выстраивается динамично на нескольких языках под разный масштаб.
Я бы дал Тебе код, но не знаю откуда копировать, ибо вложения дикие и Ты запутаешься ещё больше.
Поэтому начни гуглить строку, которую Я предложил на примере Label:
((Label)sender).Text
@@XpucT Понял, спасибо большое))
@@Colibri_Rent v001.radikal.ru/2006/cf/6231955351-6-b5149fb95186992e9fedaafac0ab2fc6.mp4
@@XpucT Спасибо огромное, это прям очень приятно, что выделил время и записал объяснение для меня. Я действительно понял как делать, очень круто объяснил. Спасибо большое, я твой вечный поклонник♥))
а можно использовать вместо большого for цикл while с &&? потом чтобы не высчитывать разницу просто сделать if else?
Можно и так. Очень даже 👍
Подскажите как реализовать следующее:
Есть основная форма Form1, при загрузке Form1_Load для нескольких кнопок устанавливается свойства Enabled=false (реализовал через свойство панели на которую добавил кнопки - panel1.Enabled = flag1 где flag1 это переменная типа Bool созданная в глобальном классе, которая видна из обоих форм). На основной форме Form1 есть кнопка для ввода пароля, по нажатию на которую открывается Form2 где можно ввести пароль и если он корректный, то глобальной переменной flag1=true и форма Form2 закрывается. Надо чтобы после закрытия Form2 форма Form1 скажем так обновилась/перерисовалась и те кнопки что расположены на панели стали активными. Искал информацию на форумах других ютуб каналах, но так не смог найти как сделать желаемое.
1. А с задним фоном нельзя что-то подобное сделать?
2. Можно ли тексту присвоить градиент (от одного цвета к другому, либо все цвета)
3. Можно ли сделать свою четвертую кнопку в titlebar’е без кастомной панели? (Чтобы на Windows 10 и Windows 7 они выглядели как обычное окно с еще одной кнопкой, как это делал TeamViewer) Можно конечно добавить уже заготовленную кнопку (?), но нужна своя иконка.
Спасибо!
1. Можно
2. Можно, но для градиента нужно подключать событие Paint. Мы его пока отдельно не рассматривали.
3. Можно и мы доберёмся обязательно.
Как и обещал любой сможет потом собрать такую программу, как Win 10 Tweaker, в которой как раз свои кнопки и прочее.
идея хорошая, но хотелось бы универсальности %)
класс а почему никто не пользуется таймером?
Можно и таймером, тоже удобно.
А такого нет? (свойство BackStyle в Transparent)
Неа
Можно порефакторить и создать метод
Как можно использовать элементы второй формы из первой формы и что для этого нужно сделать ? Если это сделать через объект формы то можно поменять свойства второй формы . А вот как получить доступ
к свойствам элементов второй формы ?
Лучше делать пошаговое, чтобы не запутаться, и сначала сделать нужный массив цветов
Помогите, пожалуйста. Решил сделать плавное появление label и textbox. С лейблом всё отлично, а текстбокс не корректно работает. Он начинает скакать по цветам
async private void Form1_Load(object sender, EventArgs e)
{
/* начальный цвет
255,165,0
желаемый цвет label
127,255,212
желаемый цвет textbox
255,255,255
*/
await Task.Delay(1000);
for (byte r = 255, g = 165, b = 0; r >=127 & g
Важно помнить, что нельзя прыгнуть из жёлтого сразу в синий (например), потому что это противоречит спектру цветов - тому, как один цвет переходит в другой.
Чтобы это понимать, посмотрите пример:
i.imgur.com/jAAQFtS.jpg
i.imgur.com/MiDQ3AA.jpg
i.imgur.com/NvYFFCk.png
а разве там у вас не условный оператор "И" стоит который не остановит цикл пока все условия не выполнятся?
Про if есть отдельное видео.
ruclips.net/p/PL05SB3rBbUsraqiEUeS70RKhVAu97nGeb
а как можно сделать прозрачный фон для картины в picturebox ?
Да. Есть отдельное свойство у формы TransparencyKey.
Если Ты установишь его цвет в зелёный, а также в картинке будет зелёный, то он будет заменён на прозрачный.
@@XpucT ок, спасибо
Ты гуру .NET
а можно гифку засунуть?
_ интересна наверно можно _ а можно тогда события ловить когда она закончилась / заного началась..
Мне кажется полегче было бы сделать r++,g++,b++ и паузу сделать поменьше намного)
не. Если у тебя разница между R G и B от начального до конечного одинаковая, тогда вариант ок, но если нет, тогда 1 из цветов, когда достигнет желаемого тобой значения, продолжит "инкримироваться", и на выходе будет не тот цвет, который ты заказывал
Можно сделать чуть более плавную анимацию вот так:
async private void Button1_Click(object sender, EventArgs e)
{
label1.Text = "Появляшка";
// 70 130 180
// 130 210 250
label1.ForeColor = Color.FromArgb(70, 130, 180);
for (byte r = 70, g = 130, b = 180; r = 180)
{
b--;
}
label1.ForeColor = Color.FromArgb(r, g, b);
}
}
ну, и так можно добиться именно того цвета, который ты хочешь, а не приблезительного
нет, так будет смещение по всему спектру
Во время выполнения цикла если нажать кнопку ещё раз то надпись начинает моргать, и чем больше нажимаешь тем хуже становится. Вопрос к знатокам - как заблокировать кнопку на время выполнения цикла? , чтобы она просто не реагировала на нажатие? Лайк кому тоже интересно как это можно сделать.
Самым простым решением в таких случаях является bool.
Объявляешь его над всеми, типа:
bool working = true;
В клике проверяешь:
if (!working)
{
// выполнять код
}
А когда завершается цикл, самой нижней строчкой делаешь working = false;
Таким образом, пока цикл работает working = true и не даст ничего сработать кнопке.
Как только цикл завершился и сказал, что working = false, кнопка спокойно выполнит сценарий.
Как можно эти проверки написать проще?
for(byte r=70, g=130, b=180;r
Убрать фигурные скобки. Короче никак.
@@XpucT спасибо)
эти проверки бессмыслены
нужно сделать другие и написать континуе, перед инкрементом
Христ, как полностю востановить обновления виндовс?Я рисетнул в твикере но ничего не изменилось.Windows Update.
После включения Центр обновлений Windows и Update Orchestrator Service просто перезагрузись. Вот и весь лайфхак =)
@@XpucT а если Центр обновлений Windows в службах нет?
@@genius_god5975 Win 10 Tweaker ➜ Службы ➜ Смотреть внимательно
@@genius_god5975 но, если речь о том, что служба вообще вырезана, то это не ко Мне, вырезать её с корнями Я не советую.
Вот плавное исчезновение текста, можно и для плавного закрытия формы прикрутить) ruclips.net/video/9yzcX5as5P0/видео.html
Хм, я почему-то на 100% уверен, что информация, как сделать текст, плавно меняющий цвет, да ещё и на 30 минут отдельного урока, - это совсем не нужная информация, когда целью стоит научить языку.
Орёл!!!
🐦
private async void button1_Click(object sender, EventArgs e)
{
for (int r = 70, g = 130, b = 180; r = 180; r--, g--, b--, await Task.Delay(30))
{
if (r == 70) r++;
if (g == 130) g++;
if (b == 180) b++;
label1.ForeColor = Color.FromArgb(r, g, b);
if (r == 71 & g == 131 & b == 181)
break;
}
}
На самом деле это довольно плохой пример. Я бы сделал это через интерполяцию трехмерных векторов. А в процессе интерполяции из вектора доставал значение каждой оси и переводил в rgb.
Мне нравятся твои видео, но это я считаю глупым решением. Правда для новичков чисто в образовательных целях сойдет
На самом деле - это единственный рабочий пример. Быстрый, короткий.
Давай взглянем на твой не плохой 🤝
@@XpucT я весь код писать не буду, но примерно это будет выглядеть вот так:
private Vector3 color_start = new Vector3( 0f, 0.5f, 0.7f );//начальный цвет
private Vector3 color_end = new Vector3( 0.9f, 0.1f, 0.2f );//конечный цвет
private float duration = 1f;//время перехода в секундах
...тело метода. Допустим цикл с задержкой:
new Vector3 color_result = Vector3.Lerp( color_start, color_end, Time.deltaTime / duration );//линейная интерполяция двух векторов
Ну а дальше нужно просто из вектора вытащить 3 компонента цвета и применить куда нужно.
Плюс такого метода в том, что все компоненты будут линейно изменять свои значения и мы можем выставить время, за которое они полностью изменятся.
Например если красный был в начале 0 а в конце 1, зеленый был 0 а в конце 0.1, то их изменение к конечному цвету будет все равно за одинаковый промежуток времени. Не нужно следить в какую сторону изменять компонент цвета, в плюс или минус. И не нужно будет городить огород.
С помощью библиотеки Mathf можно сделать тоже самое без использования векторов, но тогда нужно будет каждый компонент цвета обрабатывать отдельно. Типа так:
float red_result = Mathf.Lerp( r_start, r_end, Time.deltaTime / duration );
И так для каждого цвета.
Можно даже сделать нелинейную интерполяцию, но это уже другая история)