Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446

Хранение и редактирование фигуры

13.08.2013, 21:38. Показов 3156. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Салют!

Уже который день ломаю голову, как реализовать следующую задачу:

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

Что-то вроде этого:

Каким образом, хранить эти элементы фигуры и при необходимости переместить деталь или удалить?

Заранее спс!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.08.2013, 21:38
Ответы с готовыми решениями:

Настойки программы: редактирование и хранение
Подскажите как вставить в своё приложение настройка и и как создать форму с настройками Добавлено через 43 секунды 'Этот класс...

Редактирование фигуры
Как правильно редактировать существующие фигуры. Т.е., например, необходимо отредактировать фигуру Центробежный насос Разработчик -...

Хранение данных (добавление, редактирование, поиск, удаление) до 500МБ
Сейчас какой то конкретной задачи нет, просто стало интересно, подскажите, вот допустим есть какая то программа для учета чего либо,...

7
)))
 Аватар для aleks_pilipenko
610 / 423 / 55
Регистрация: 31.12.2009
Сообщений: 2,334
Записей в блоге: 3
13.08.2013, 22:16
Делай их bitmap-ом, выделяй через список рядом с картинкой... Можно конечно и через наведение мыши находить этот объект, но я думаю что это геморно, придется через двойные циклы каждый объект(фигуру) перебирать на совпадение координат... Собственно не очень сложная задача, по сути...
1
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
14.08.2013, 01:57  [ТС]
Хмммм...

Интересная идея. Спасибо. Попробую.

Добавлено через 42 минуты
Т.е. правильно ли я понял:

Пользователь выберает, к примеру, "Рисовать квадрат".
Указывает параметры(длина стороны).
Я создаю bitmap(длина стороны Х длина стороны), на котором рисую этот квадрат.
Потом этот bitmap отображаю в pictureBox.
Хорошо. Но как быть с кругом или прямой? Мне ведь так же придется их отображать, а так как bitmap есть ничто иное как матрица битов, то получится, что я буду отрисовывать не круг, а квадрат. А это неочень хорошо, т.к. фигуры буду налазить друг на друга...

Как быть?

Заранее спс!
0
39 / 37 / 8
Регистрация: 01.08.2013
Сообщений: 106
14.08.2013, 09:03
Смотря каким образом в дальнейшем предполагается их изменять, если действительно, как в Paint, то сверху верно подсказали, просто рисуй на PictureBox, пример:
C#
1
2
Graphics gh = pictureBox1.CreateGraphics();
            gh.DrawRectangle(new Pen(new SolidBrush(Color.Red)), new Rectangle(new Point(0, 0), new Size(100, 100)));
, а потом сохраняй в файл стандартным методом, например в png:
C#
1
pictureBox1.Image.Save("c:\bitmap.png", System.Drawing.Imaging.ImageFormat.Png);
Если же их предполагается использовать как, например, AutoCad использует - тут одно из двух, либо изобретать свой формат файла (или использовать xml тип), либо изучить структуру файла, для аналогичных целей, те же autoCad-овские файлы.
0
)))
 Аватар для aleks_pilipenko
610 / 423 / 55
Регистрация: 31.12.2009
Сообщений: 2,334
Записей в блоге: 3
14.08.2013, 20:32
Цитата Сообщение от some_name Посмотреть сообщение
Пользователь выбирает, к примеру, "Рисовать квадрат".
Указывает параметры(длина стороны).
Вот небольшую заготовочку набросал, с этого можно продолжить, добавить перемещение объектов и фигуры, также их объединение, если нужно. Для этого думаю все-таки список в datagridView создавать со списком FF вместе
Все что нужно написать я уже представил в голове, что успел за пару часов написать и отладить выкладываю:
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
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
130
131
132
133
134
135
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace MyPaint
{
    public partial class Form1 : Form
    {
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
        public Form1()
        {
            InitializeComponent();
        }
        private void InitializeComponent()
        {
            this.Квадрат = new System.Windows.Forms.Button();
            this.pictureBox1 = new System.Windows.Forms.PictureBox();
            this.Круг = new System.Windows.Forms.Button();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
            this.SuspendLayout();
            // 
            // Квадрат
            // 
            this.Квадрат.Location = new System.Drawing.Point(49, 3);
            this.Квадрат.Name = "Квадрат";
            this.Квадрат.Size = new System.Drawing.Size(66, 23);
            this.Квадрат.TabIndex = 5;
            this.Квадрат.Text = "Квадрат";
            this.Квадрат.UseVisualStyleBackColor = true;
            // 
            // pictureBox1
            // 
            this.pictureBox1.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
            this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
            this.pictureBox1.Location = new System.Drawing.Point(136, 56);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(357, 299);
            this.pictureBox1.TabIndex = 4;
            this.pictureBox1.TabStop = false;
            this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
            this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
            // 
            // Круг
            // 
            this.Круг.Location = new System.Drawing.Point(-1, 3);
            this.Круг.Name = "Круг";
            this.Круг.Size = new System.Drawing.Size(44, 23);
            this.Круг.TabIndex = 3;
            this.Круг.Text = "Круг";
            this.Круг.UseVisualStyleBackColor = true;
            this.Круг.Click += new System.EventHandler(this.Круг_Click);
            // 
            // Form1
            // 
            this.ClientSize = new System.Drawing.Size(818, 428);
            this.Controls.Add(this.Квадрат);
            this.Controls.Add(this.pictureBox1);
            this.Controls.Add(this.Круг);
            this.Name = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
            this.ResumeLayout(false);
 
        }
 
        private Button Круг;
        private Button Квадрат;
        private PictureBox pictureBox1;
        string figur = "";
        int x, y;
        bool s = false, Draw = false;
        Point p1, p2;
        List<FF> Fig = new List<FF>();
 
        private void Круг_Click(object sender, EventArgs e)
        {
            figur = "Круг";
            pictureBox1.Invalidate();
        }
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (figur == "") return;
            if (e.Button.ToString() == "Left")
            {
                if (s == false)
                { p1 = new Point(e.X, e.Y); s = true; }
                p2 = new Point(e.X, e.Y);
            }
 
            pictureBox1.Invalidate();
        }
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (figur == "Круг")
                drawCirc(p1, p2, e.Graphics);
            for (int i = 0; i < Fig.Count; i++)
            {
                if (Fig[i].fig == "Круг") drawCirc(Fig[i].p1, Fig[i].p2, e.Graphics);
            }
        }
        private void drawCirc(Point p1, Point p2, Graphics g)
        {
            int xMin = (p1.X < p2.X) ? p1.X : p2.X;
            int yMin = (p1.Y < p2.Y) ? p1.Y : p2.Y;
            g.DrawEllipse(new Pen(Color.Black), xMin, yMin, Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y));
        }
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            Fig.Add(new FF(p1, p2, figur));
            s = false; figur = "";
            p1 = p2 = new Point(0, 0);
        }
    }
}
public class FF
{
    public Point p1, p2;
    public string fig = "";
    public FF(Point p1, Point p2, string fig)
    {
        this.p1 = p1;
        this.p2 = p2;
        this.fig = fig;
    }
}
Добавлено через 3 минуты
Вопрос понравился, года три назад хотел прогу по окнам написать(чертежи и схемы окон рисовать, для фирмы), но не знал как подступиться, а сейчас за два часа основные алгоритмы придумал... Из этой заготовки можно будет доделать...
0
39 / 37 / 8
Регистрация: 01.08.2013
Сообщений: 106
15.08.2013, 12:49
Что это за манера писать названия объектов на русском языке, это же плохой тон программирования, с родни GoTo и вечных циклов. )
0
)))
 Аватар для aleks_pilipenko
610 / 423 / 55
Регистрация: 31.12.2009
Сообщений: 2,334
Записей в блоге: 3
15.08.2013, 18:36
Цитата Сообщение от onicdr Посмотреть сообщение
Что это за манера писать названия объектов на русском языке
Просто торопился, да и используются они один раз, потому ничего страшного в этом не было...
Обычно так не делаю никогда...
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
16.08.2013, 15:27
1) Изучаем класс Graphics и все его методы.
2) Для всех методов рисования изучаем их параметры
3) для каждого элемента рисования создаем свой класс для сохранения параметров.
Для некоторых и создавать не надо - для прямоугольника, эллипса есть Rect, для линии достаточно хранить массив точек.
4) Теперь не проблема создать общий класс-контейнер для всех елементов
5) мы можем выполнить рисунок отрисовав все элементы по очереди и сохранить его в виде сериализации коллекции
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2013, 15:27
Помогаю со студенческими работами здесь

Редактирование параметров фигуры и положение на листе
Доброго всем времени суток! Добавляю фигуру в документ с помощью кода: With Form.Shapes .AddShape msoShapeRectangle, 50, 50,...

Хранение файлов и файловый менеджер в файле(листе) Excel, Бинарное хранение данных в CustomProperty листа Excel
Всем привет! Хочу поделится наработками, которые получились в процессе реализации своих задач. Отдельная благодарность! Андрей VG, за...

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

Наложить чертёж плоской фигуры на проекцию этой фигуры
Стоит задача наложить чертёж земельного участка на фотографию этого участка. Участок обозримого размера и целиком влазит в кадр. Таким...

Передвижение фигуры при клике на область внутри фигуры
Есть прямоугольник 100 на 50. При удерживании мышки фигура передвигается как карта в пасьянсе. При отпуске фиксируется. Хотел бы...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru