Электрофлуд :)

  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3481
Ага, нарешті я зрозумів.
Методів 2:
1( правильний) - свій клас "овальної кнопки" наслідуваний від button, у якому перевизначити деякі методи( малювання кнопки, обробка миші).
2( простий) - як і писав вище, створити будь-який елемент прямокутний( простіше всього Graphics), на якому намалювати свою кнопку, а там вже у обробці кліку визначати чи у зоні миша. Формально це буде прямокутник, фактично - кнопка потрібної форми з єдиним мінусом - неможливістю розміщення чогось іншого у межах цього ж прямокутника - тобто ще один такий овал по діагоналі впритул не вийде розмістити.
 
Останнє редагування:
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3482

1. (поспорю на счет правильный, но для вторичного использования более пригоден) - да, но это очень ты глубоко копнул. Там и так все нужные свойства есть. Не надо их переписывать - все кнопки в демке на форме в дизайнере выглядят обычными квадратными. Действия происходят в конструкторе - именно там им тупо назначается регион.
2. Вообще не понял о чем ты. Это в билдере так?
На демке повози мышкой - контролы (да и сама форма) формально НЕ прямоугольные. Прозрачный контрол с картинкой я ещё в лохматом 99м делел в борланде Это не интересно именно изза "формальной" прямоугольности.
И да, я не в С, я в C# это ваяю под .NET - там всё немного не так..
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3483
зацените какая вундервафля за 2$
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3484

Я заценил шоп, который его продает:
Sold By
Shanghai Fashion Store S's store
Смотреть ассортимент
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.


Как туда попал тестер? И, к стати, в самом шопе я его не наблюдаю.

И эт... его доставка сюда обойдется в $5.91
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3485
И да, я не в С, я в C# это ваяю под .NET - там всё немного не так..
Сенк кеп, але шарп мс для свого дотнету й вигадали. Да й які класи в С?



Регіон "живиться" об'єктами Drawing.2D, котрі ще треба створити. Тож не думаю, що конструктор отак просто декількома кліками усе сам за тебе зробить. Ну принаймні у ВС2010 конструктор цього не вміє та взагалі не світить властивість Region.
А так звичайно можна, при чому знову двома способами:
1( правильний) - створюємо свій повноцінний клас бла бла бла...
2( хитрий) - створюємо свій клас, але перевизначаємо у ньому лише 1 нахуй непотрібний метод. А краще метод, що викликає нахуй непотрібний івент, де й реалізуємо сабж.

Створена цим класом кнопка при першій же зміні розміру стане еліпсом.
class SquareButton : Button
{
protected override void OnResize(EventArgs e)
{
var path = new GraphicsPath();
path.AddEllipse(new Rectangle(x, y, this.Width, this.Height));
this.Region = new Region(path);
base.OnResize(e);
}
}
 
Останнє редагування:
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3486
Сенк кеп, але шарп мс для свого дотнету й вигадали. Да й які класи в С?
Ну в билдере вообще плюсы, а не С - то я так сократил, но ты, как всегда, доебался до слов.

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

Чё она не светит? Конструктор это виртуальное понятие. Нет там ни какого конструктора, конструктор это кусок кода, где написано чего сделать при создании объекта с этим объектом. Можешь туда руками дописывать что угодно, и чего в нем не светит свойство регион?
Студия или билдер или моно сделают только простейшие действия, которые ты в панели свойств выбрал. Ни кто не мешает им руками помочь.

3. Створюэмо свiй неполноценный класс, в котором 2 нi кому не непотрiбнi, а навiть дуже потрiбнi методи, що я выще визначив. И применяем эти функции к нужным нам контролам при из создании. Это более переносимо и может существовать отдельно, применяясь в любом другом проекте.

Надо будет позырить дома Большинство таких советов (типа с хабра и прочих ресурсов, где темы всплывали) были полным фейком и сферическим конём в вакккме, отчего даже не компилировались и рыть где там баг мне было лень.
Из того, что я нашел - всё работает, но несколько не так, как ты накрапал. В ощем - вечером дораскапываю существующий код и твой проверю (сейчас у мну IDE на машине нет, а ноут свой я по морозу не потащил).
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3487
Я конструктор форм іде мав на увазі.
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3488
Я конструктор форм іде мав на увазі.

А, та не, тот умеет только впихивать в конструктор установки, заданные в поле свойств панели инструментов, ну и хедеры создавать.
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3489

Я тогда тоже предложил токовый транс, но Васия отверг его на корню.

Вот поэтому и интересно, чем же закончилось.
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3490

Да чого ж, не лише. Часом дуже допомагає, хоча скоріше як загальний шаблон та джерело шаблонів для купи модулів.


Але це всеодно напівмера. Взагалі властивість Region використовується для повністю зворотнього - обмеження області елемента.
Наприклад можна ту саму область на формі створити без ніякої кнопки і використовувати л_клік івент форми, що генеруватиметься лише на клік усередині цього регіону. Формально - це не кнопка буде, фактично - 1 у 1 з тим, що є зараз.
Нормальна реалізація сабжу - лише перевизначення купки методів, що цю кнопку малюють та палять мишу.
Код:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

    class SquareButton : Button
    {
        protected override void OnResize(EventArgs e)
        {
            using (var path = new GraphicsPath())
            {
                path.AddEllipse(new Rectangle(2, 2, this.Width - this.Width / 10, this.Height - this.Height / 10));
                this.Region = new Region(path);
            }
            base.OnResize(e);
        }
    }

    public class Form1 : Form
    {
        SquareButton button1;
        int i =0;

        public Form1()
        {
            button1 = new SquareButton();
            button1.Text = "Click me";
            button1.Click +=new EventHandler(button1_Click);
            this.Controls.Add(button1);    
        }

        public void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "Im ellipse now")
            {
                if (i == 1)this.Close();
                MessageBox.Show("Im already ellipse. Stop touch me! One more time and FUUUUU");
                i++;
                return;
            }
            button1.Size = new Size(100, 70);
            button1.Text = "Im ellipse now";
        }
    }

    class Program
    {
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        } 
    }
 

Вкладення

  • RoundButton.rar
    3.6 КБ · Перегляди: 54
Останнє редагування:
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3491




Походу - не работает.
P.S. А почему для обратного? Это, как раз, прямое и есть - ограничить контур компонента. Только особенностью его использования является то, что контур может быть любой формы. А ориентация на картинко - просто упрощает проектирование своих контролов, так как можно и в кореле и в гимпе и в пэйнте зазырить какое оно будет. И оно именно такое и будет
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3492
Чого не працює? Овальна кнопка є? Є = працює.
Немає бордеру нормального - ну так ми його й не змінювали, він прямокутний та поза еліпсом. Тому й напівмера.
 
Останнє редагування:
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3493

Где овал? Там надпись и всё. Я понял, допилю своё - на соурсфорж выкину
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3494
Невже повилазило? Навіть на твоєму скрині видно той "овал", хоча різниця кольорів і невелика.

На з контрастом.
Але знову ж таки без бордера, без підсвічування. Для реалізації усього цього знову ж таки є 2 варіанти:
1 ( трушний) - нормально перевизначити усі методи, що малюють кнопку.
2 ( як завжди) - наліпити на кнопку картинку№1, а в обробнику івенту наведення миші змінювати на картинку№2. Так загалом і реалізовано у твоєму прикладі.
 

Вкладення

  • RoundButton.rar
    3.5 КБ · Перегляди: 60
Останнє редагування:
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3495

ниданивосичас. я в глагнэ срусь
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3496
Фуф, от глагнэ уже тошнит. Возвращаюсь к C#
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3498
Ну так що скажеш по сабжу?

Та сделал вчера. Извращение ещё то, но работает. Возникла проблема с отрисовкой - из пэйнта растр отрисовывается корректно. Захотел добавить градиентов - сделал в векторном редакторе и экспортнул - лажа, не все градиенты понимаются на контроле. В имажебоксе рисуется нормально, а на кнопке - с артефактами. Пока не нашел как создавать красивые и одновременно корректные растры.

P.S. Но основной цели достиг - при прозрачном фоне картинки контрол занимает именно то место, где есть не фон. То есть - если спреем напшикать - кнопка будет при наведении мышки на точки, где цвет Шо не может не радовать.
P.P.S. Теперь думаю как корректнее оформить - как библиотеку, или так и оставить классом и тупо присоединять его к проекту, если нужно. Там в классе 2 метода - конвертирование bmp в регион и применение этого региона к контролу.
 
  • 🔴 21:04 Повітряна тривога в Харків.обл.
  • #3499

Эта тема ?
https://www.kharkovforum.com/showthread.php?t=2674842