С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 2
Регистрация: 09.10.2014
Сообщений: 18
1

Нужен пример класса, от которого будет наследоваться Button

30.11.2014, 15:47. Показов 1483. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите примером. Нужно сделать класс, от которого будут наследоваться 6 кнопок
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2014, 15:47
Ответы с готовыми решениями:

Нужен пример неизменяемого класса и класса от которого нельзя наследоваться
Здравствуйте! Нужно привести пример неизменяемого класса и класса от которого нельзя наследоваться.

Нужен пример класса
Привести пример класса для работы с комплексными числами и содержащего перегруженную операцию для...

Реализовать GenericRepository, который будет наследоваться от IEntityRepository<T>
Привет всем. Объясните пожалуйста элементарные вещи новичку. Есть у меня интерфейс interface...

Нужен пример создания статического класса
Приведите, пожалуйста, пример создания статического класса.

11
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
30.11.2014, 16:02 2
Maks1980,
C#
1
class CustomButton: Button { }
0
0 / 0 / 2
Регистрация: 09.10.2014
Сообщений: 18
30.11.2014, 16:28  [ТС] 3
то есть сделать еще 1 класс, наследуемый от Button и от моего класса? И не совсем понимаю где это прописывать. Если можно, пример в более готовом виде.

PS. Вот такой парадокс у нас - лабы есть по С#, а лекций нету. Вернее, препод сказал что ничего рассказывать не будет по языку, все есть на msdn.ru ;(
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
30.11.2014, 17:04 4
Maks1980, множественное наследование не получится сделать. Если вы хотите расширить функционал кнопки - наследуйте от Button, если поведение кнопки зависит от Вашего уже реализованного класса - просите его экземпляр как свойство новой кнопки.

Будет проще если Вы скинете текст задания.
0
0 / 0 / 2
Регистрация: 09.10.2014
Сообщений: 18
30.11.2014, 18:17  [ТС] 5
текста нет, препод объяснял на пальцах. Есть написаная лаба, но он сказал что неправильно.

Вот в приложении 6 кнопок справа, их надо унаследовать от своего класса и переопределить функцию рисования.

Рисование сделано не совсем правильно, хотел как красивее, получилось как всегда. Я сам переделаю. Надо - выбираем кнопкой нужную фигуру, далее два клика по Image (начальная и конечная точка) и рисуется фигура. Не совсем понятно зачем там свой класс нужен вообще.

ЗЫ. Это первая моя программа на C#, если не считать первую лабу - консольное Hello world.
Вложения
Тип файла: rar GraficEditor.rar (172.9 Кб, 4 просмотров)
0
0 / 0 / 2
Регистрация: 09.10.2014
Сообщений: 18
30.11.2014, 18:18  [ТС] 6
Цитата Сообщение от rRczZZ Посмотреть сообщение
если поведение кнопки зависит от Вашего уже реализованного класса - просите его экземпляр как свойство новой кнопки.
можете пример дать, как это сделать?
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
30.11.2014, 19:04 7
Maks1980, предположим у меня есть простой объект со свойством и методом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyObject
{
    /// <summary>
    /// Какое-то свойство
    /// </summary>
    public string Text
    { get; set; }
 
 
    /// <summary>
    /// Какой-то метод
    /// </summary>
    public void Foo()
    {
        MessageBox.Show(String.Format("MyObject with text \"{0}\"", Text));
    }
}
Делаем кнопку, которая будет отображать подпись Text и вызывать этот метод Foo при нажатии:
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
public class MyButton : Button
{
    MyObject _obj = null;
 
    /// <summary>
    /// Хранимый объект
    /// </summary>
    public MyObject RequiredObject
    {
        get { return _obj; }
        set
        {
            if (value != _obj)
            {
                _obj = value; 
                // тут подписываемся и отписываемся от всех событий
                // Обновляем кнопку
                Refresh();
            }
        }
    }
 
    /// <summary>
    /// Берем подпись кнопки из объекта
    /// </summary>
    [Browsable(false)]
    public override string Text
    {
        get { return _obj == null ? "Объект не задан" : _obj.Text; }
        set { if (_obj != null) _obj.Text = value; }
    }
 
    /// <summary>
    /// При нажатии на кнопку дополнительно вызываем метод объекта
    /// </summary>
    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        if (_obj != null) _obj.Foo();
    }
}
Далее, для простоты, создам на форме обычную кнопку, открою Form1.Desinger.cs и поменяю строки:
C#
1
2
3
4
5
this.button1 = new System.Windows.Forms.Button();
private System.Windows.Forms.Button button1;
//на
this.button2 = new MyButton();
private MyButton button1;
теперь где-нибудь в другом месте, например при загрузке формы:
C#
1
2
3
4
private void Form1_Load(object sender, EventArgs e)
{
    button1.RequiredObject = new MyObject() { Text = "abc" };
}
Добавлено через 9 минут
Цитата Сообщение от Maks1980 Посмотреть сообщение
переопределить функцию рисования
Функцию рисования на холсте?

Добавлено через 3 минуты
я думаю он имел виду создать класс "Инструмент", от него унаследовать инструменты рисования круга линии итд.. Тогда пропадут все эти switch'и в событиях, код станет масштабируемым.
0
0 / 0 / 2
Регистрация: 09.10.2014
Сообщений: 18
30.11.2014, 19:26  [ТС] 8
а можно ли сделать как то, в зависимости от того какая нажата кнопка, определить свой обработчик Paint у PictureBox? А не как сделано у меня через swith-case

Добавлено через 4 минуты
Цитата Сообщение от rRczZZ Посмотреть сообщение
я думаю он имел виду создать класс "Инструмент", от него унаследовать инструменты рисования круга линии итд.. Тогда пропадут все эти switch'и в событиях, код станет масштабируемым.
Вот, наверно это правильная постановка вопроса
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
30.11.2014, 23:08 9
Maks1980, да по-разному можно. Например так. Во-первых нужно отделить модель от вида, создаем "Среду"/"Документ" где храним все что понадобится для рисования, методы загрузки/сохранения итд. Да, "Текущий цвет" цвет нужно хранить в отдельном свойстве, завязав его изменение на события, весть код который у вас лежит в форме следует вынести в UserControl.
DrawEnvironment
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
class DrawEnvironment
{
    Bitmap bmp;
    public Bitmap Bitmap
    {
        get { return bmp; }
        set 
        { 
            bmp = value;
            Graphics = Graphics.FromImage(bmp);
            Refresh();
        }
    }
 
    public Color Color
    {
        set 
        {
            Brush = new SolidBrush(value);
            Pen = new Pen(value, 2.0f);
        }
    }
 
    public Graphics Graphics;
    public event EventHandler OnBitmapUpdate;
    public Brush Brush { get; private set; }
    public Pen Pen { get; private set; }
 
    public void Refresh()
    {
        if (OnBitmapUpdate != null)
            OnBitmapUpdate(this, EventArgs.Empty);
    }
}

Теперь класс инструмент (можно реализовать не классом а интерфейсом), сюда пишем что понадобится для рисования всех фигур (чтобы код не повторять):
Instrument
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Instrument
{
    protected DrawEnvironment de;
 
    public Instrument(DrawEnvironment de)
    {
        this.de = de;
    }
 
    protected bool IsInitialized
    { get { return de != null && de.Bitmap != null; } }
 
    public virtual void OnMouseDown(float x, float y) { }
 
    public virtual void OnMouseMove(float x, float y) { }
 
    public virtual void OnMouseUp(float x, float y) { }
}

Я бы от него унаследовал два класса - первый это построение фигур по двум точкам (от него - эллипс, линия, прямоугольник), второй - непрерывные построители (карандаш, кисть итд..). Ну можно унаследовать только шесть штук, пример "карандаша":
Pencil
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
class Pencil : Instrument
{
    bool IsMousePressed;
    PointF pStart;
 
    public Pencil(DrawEnvironment de) : base(de) { }
 
    public override void OnMouseDown(float x, float y)
    {
        IsMousePressed = true;
        pStart = new PointF(x, y);
    }
 
    public override void OnMouseUp(float x, float y)
    {
        IsMousePressed = false;
    }
 
    public override void OnMouseMove(float x, float y)
    {
        if (IsInitialized && IsMousePressed)
        {
            de.Graphics.DrawLine(de.Pen, pStart.X, pStart.Y, x, y);
            pStart = new PointF(x, y);
            de.Refresh();
        }
    }        
}

На форме объявляем переменную "Текущий инструмент", передаем ему события с picturebox, можно подвязать на события. Так же можно хранить коллекцию инструментов с иконками итд, загружать их динамически, создавать тулбары для них из конфига, иначе - просто при клике на кнопку - меняем значение CurrentInstrument. Аналогично, можно отвязать pictureBox от формы, создав отдельный компонент для рисования
Form
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
public partial class Form1 : Form
{
    DrawEnvironment de;
    Instrument CurrentInstrument;
 
    public Form1()
    {
        InitializeComponent();
    }
 
    private void Form1_Load(object sender, EventArgs e)
    {
        de = new DrawEnvironment();
        de.Bitmap = new Bitmap(200, 200);
        de.Color = Color.Black;
        de.OnBitmapUpdate += de_OnBitmapUpdate;
    }
 
    void de_OnBitmapUpdate(object sender, EventArgs e)
    {
        pictureBox1.Image = de.Bitmap;
    }
 
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (CurrentInstrument != null)
        {
            CurrentInstrument.OnMouseDown(e.X, e.Y);
        }
    }
 
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (CurrentInstrument != null)
        {
            CurrentInstrument.OnMouseMove(e.X, e.Y);
        }
    }
 
    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if (CurrentInstrument != null)
        {
            CurrentInstrument.OnMouseUp(e.X, e.Y);
        }
    }
 
    // Такой код для каждой кнопки
    private void button1_Click(object sender, EventArgs e)
    {
        CurrentInstrument = new Pencil(de);
    }
 
    /*private void ColorPickerColorChanged(object sender, EventArgs e)
    {
        // Событие смены цвета
        de.Color = (sender as ColorPicker).Color;
    }*/
}
1
0 / 0 / 2
Регистрация: 09.10.2014
Сообщений: 18
02.12.2014, 12:24  [ТС] 10
Спасибо, вроде разобрался, сделал пока только 1 кнопку. Как сделать в этом же духе для двух вкладок TabPage - PictureBox'ы должны быть независимы, содержать каждый свой рисунок. Добавить просто обработчики для второго пиктурбокса не получилось.

Еще нужно сделать кнопку (TabPage1 / TabPage2). программа запоминает состояние кнопки и при следующем открытии делает активным выбранный TabPage
Вложения
Тип файла: rar Grafic2.rar (29.8 Кб, 3 просмотров)
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
02.12.2014, 15:16 11
Maks1980, можно использовать Один pictureBox, загружая в него данные от разных DrawEnvironment. Либо создать отдельный компонент Canvas/DrawingControl (как назовете).. Нужно определиться где хранить различные параметры - типа выбранного инструмента, если они привязаны к вкладке - перенести их в Канвас как свойства, иначе - оставить на форме.

Немного изменил видимость полей в классах и добавил этот самый канвас (DrawingControl). В коде формы метод AddPage - создает вкладку, я привел пример как создавать новый документ и читать из файла. Вам нужно создать конфиг приложения или просто текстовый файл рядом с exe или Application.Settings - при загрузке формы создавать все сохраненные вкладки.
Вложения
Тип файла: rar Grafic2_1.rar (42.7 Кб, 4 просмотров)
0
0 / 0 / 2
Регистрация: 09.10.2014
Сообщений: 18
02.12.2014, 22:17  [ТС] 12
Хотел сделать так:
C#
1
2
3
4
5
6
7
8
// Считываем значение параметра.
<тип> user_parameter = Properties.Settings.Default.USER_PARAMETER;
//...
// Изменяем значение параметра.
user_parameter = <новое значение>;
//...
// Сохраняем значение параметра.
Properties.Settings.Default.USER_PARAMETER = user_parameter;
В английской версии VС# в Solution Explorer ПКМ на имени проекта и выбрать Properties. Далее выбрать раздел Settings и задать требуемые настройки.


Но сразу стало выдавать вот это (на картинке)
Миниатюры
Нужен пример класса, от которого будет наследоваться Button  
0
02.12.2014, 22:17
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2014, 22:17
Помогаю со студенческими работами здесь

Нужен пример описания любого класса
Люди добрые, подскажите, может кто делал описание класса в С++, и у вас осталась работа? Можете...

Как наследоваться от класса TIniFile?
class TFile : public TIniFile { void _fastcall SaveToFile(UnicodeString Path, TFL *L); void...

Нужен пример с глобальной переменной которую можно будет использовать в StringGrid
Пожалуйста помогите . Может ктонибудь набросать пример с глобальной переменной которую можно...

Создание нескольких объектов класса и их сохранение (Нужен пример)
Собственно вопрос в названии темы. Можно какую-нибудь самую простейшую программу, которая создает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru