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

System.Drawing.SolidBrush не помечен как сериализуемый

23.04.2015, 23:03. Показов 3858. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добавил фон при рисовании прямоугольника, в результате чего, при сохранении вылетает ошибка : Тип "System.Drawing.SolidBrush" в сборке "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" не помечен как сериализуемый.

Если закоментить "фон", то всё сохраняется.
Form2.cs При возникновении ошибки, указывает на строчку formatter.Serialize(stream, sdf);
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
 
namespace _10._02._15
{
    [Serializable()]
    public partial class Form2 : Form
    {
        public  ArrayList arraym = new ArrayList();
        public  Figure f;
        Boolean edit=false;
 
        public Form2()
        {
            InitializeComponent();
 
        }
        public void Form2_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                f = new Rect(0, 0, 0, 0, Color.Black, Color.Transparent, 0);
                f.One(e.X, e.Y);//координаты первой точки = 
            }
        }
        public void Form2_MouseMove(object sender, MouseEventArgs e)
        {
            if (f != null)//если f ссылается на объект , то
            {
                f.Two(e.X, e.Y);//координаты первой точки =
                f.CreateRect();
                f.DrawDash(CreateGraphics());//рисуем пунктир
                f.Hide(CreateGraphics());//рисуем белую линию
                edit = true;//индикатор(что файл изменён)
            }
        }
        public void Form2_MouseUp(object sender, MouseEventArgs e)
        {
            if (f != null)//если f ссылается на объект , то
            {
                f.Draw(CreateGraphics());//рисуем сплошную линию
                arraym.Add(f);//добавляем элементы в массив
                f = null;
                Invalidate();//перерисовка окна
            }
        }
        public void Form2_Paint(object sender, PaintEventArgs e)
        {
            
            foreach (Figure xy in arraym)
            {
                xy.Draw(e.Graphics);
            }
            if (f != null)
            {
                f.Draw(e.Graphics);
            }
        }
 
        public void Form2_Load(object sender, EventArgs e)
        {
 
        }
 
        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (edit==true)
            {
                DialogResult result = MessageBox.Show("Сохранить?", "Сохранение", MessageBoxButtons.YesNoCancel);
                if (result == DialogResult.No) 
                {
                    edit = false;
                }
 
                if (result == DialogResult.Yes)
                {
                    MessageBox.Show("Файл сохранён");
                    BinaryFormatter formatter = new BinaryFormatter();
                    Stream stream = File.Create(this.Text);
                    formatter.Serialize(stream, arraym);
                    stream.Close();
                    edit = false;
                  //  Form1.сохранитьToolStripMenuItem.Enabled = true;
                }
                if (result == DialogResult.Cancel) 
                {
                    e.Cancel = true;
                }
            }
        }
 
 
    }
 
 
}



Rect.cs Если закомментить public Brush cbackg; cbackg= new SolidBrush(Form1.cbackground); g.FillRectangle(cbackg, rr); g.FillRectangle(cbackg, rr); , то всё работает.
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
 
namespace _10._02._15
{
    [Serializable()]
    class Rect : Figure
    {
        
        public Rect(int xLeft, int yTop, int xRight, int yBottom, Color cline,Color cbackground, int sline) : base(xLeft, yTop, xRight, yBottom, cline,cbackground, sline) { }
        [NonSerialized()]
        public Pen pen = new Pen(Color.Black, 1);
        public Brush cbackg;
        int xx, yy;
        public Rectangle rr;
        public override void One(int x, int y)
        {
            xx = x;
            yy = y;
        }
        public override void Two(int x1, int y1)
        {
            if (x1 < xx)//если значение правой точки меньше левой,то
            {
                XX1 = x1;
                XX2 = xx;
            }
            else
            {
                XX1 = xx;
                XX2 = x1;
            }
            if (y1 < yy)
            {
                YY1 = y1;
                YY2 = yy;
            }
            else
            {
                YY1 = yy;
                YY2 = y1;
            }
 
        }
        public override Rectangle CreateRect()
        {
            rr = Rectangle.FromLTRB(XX1, YY1, XX2, YY2);//создает структуру Rectangle с координатами точек
            return (rr);
        }
       
        public override void DrawDash(Graphics g)//пунктир
        {
            cline = Form1.cline;//устанавливаем цвет линии
            sline = LineWidth.sline;
            cbackg= new SolidBrush(Form1.cbackground);
            pen = new Pen(cline,sline);
            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
            g.FillRectangle(cbackg, rr);//заливка фигуры
            g.DrawRectangle(pen, rr);//рисование линии(контура фигуры)
 
        }
        public override void Hide(Graphics g)//белая линия
        {
            pen = new Pen(Color.White, sline);
            g.DrawRectangle(pen, rr);
        }
 
        public override void Draw(Graphics g)//сплошная линия
        {
 
            pen = new Pen(cline, sline);
            g.FillRectangle(cbackg, rr);
            g.DrawRectangle(pen, rr);
            
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2015, 23:03
Ответы с готовыми решениями:

Как получить System.Drawing.FontStyle из System.Drawing.Font ?
Font textFont = new Font(&quot;Verdana&quot;, 26f, FontStyle.Bold | FontStyle.Italic); Как получить из...

Как исправить исключение System.StackOverflowException в System.Drawing.dll
An unhandled exception of type 'System.StackOverflowException' occurred in System.Drawing.dll что...

Как повернуть эллипс (System.Drawing)
Здравствуйте! Я нарисовал окружность (рисунок с лева). Есть две точки(они выделены на рисунке в...

System.InvalidCastException: "Не удалось привести тип объекта "System.Byte[]" к типу "System.Drawing.Bitmap"."
Ошибка System.InvalidCastException: &quot;Не удалось привести тип объекта &quot;System.Byte&quot; к типу...

7
1144 / 873 / 506
Регистрация: 09.04.2014
Сообщений: 2,056
24.04.2015, 12:23 2
Лучший ответ Сообщение было отмечено legxr как решение

Решение

C#
1
2
3
4
[NonSerialized()]
public Pen pen = new Pen(Color.Black, 1);
[NonSerialized()]
public Brush cbackg;
Добавлено через 5 минут
а лучше сделайте поля pen и cbackg приватными
1
2 / 2 / 1
Регистрация: 01.11.2014
Сообщений: 66
24.04.2015, 17:44  [ТС] 3
Теперь при открытии выскакивает ошибка(указывает на строчку g.FillRectangle(cbackg, rr); в Rect.cs) :

System.ArgumentNullException не обработано
Message=Значение не может быть неопределенным.
Имя параметра: brush
Source=System.Drawing
ParamName=brush

Добавил cbackg = new SolidBrush(Form1.cbackground); в public override void Draw(Graphics g){} .
Открывает, но, при рисовании, фоны всех фигур принимают цвет фигуры которую я рисую.
0
1144 / 873 / 506
Регистрация: 09.04.2014
Сообщений: 2,056
24.04.2015, 17:57 4
Цитата Сообщение от legxr Посмотреть сообщение
при рисовании, фоны всех фигур принимают цвет фигуры которую я рисую
без всего кода трудно что-либо сказать наверняка, но вы передаете в конструктор фигуры cbackground, им и пользуйтесь вместо Form1.cbackground

Добавлено через 29 секунд
Покажите класс Figure
0
2 / 2 / 1
Регистрация: 01.11.2014
Сообщений: 66
25.04.2015, 00:32  [ТС] 5
Цитата Сообщение от nedel Посмотреть сообщение
Покажите класс Figure
Figure.cs
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
 
namespace _10._02._15
{
    [Serializable()]
    public abstract class Figure
    {
        public int XX1, XX2, YY1, YY2;
        public Color cline;//цвет линии
        public Color cbackground;//цвет фона фигуры
        public int sline;//размер линии
        public Figure(int XX1, int YY1, int XX2, int YY2,Color cline,Color cbackground, int sline)
        {
            this.XX1 = XX1;
            this.YY1 = YY1;
            this.XX2 = XX2;
            this.YY2 = YY2;
            this.cline = cline;
            this.sline = sline;
        }
        //объявление абстрактных методов
        public abstract void One(int x, int y);
        public abstract void Two(int x1, int x2);
        public abstract Rectangle CreateRect();
        public abstract void Draw(Graphics g);
        public abstract void DrawDash(Graphics g);
        public abstract void Hide(Graphics g);
 
    }
 
}
0
1144 / 873 / 506
Регистрация: 09.04.2014
Сообщений: 2,056
25.04.2015, 11:54 6
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
[Serializable()]
    class Rect : Figure
    {
        public Rect(int xLeft, int yTop, int xRight, int yBottom, Color cline, Color cbackground, int sline) : base(xLeft, yTop, xRight, yBottom, cline, cbackground, sline) 
        {
            CreateRect();
        }
        
        int xx, yy;
        public Rectangle rr;
        public override void One(int x, int y)
        {
            xx = x;
            yy = y;
        }
        public override void Two(int x1, int y1)
        {
            if (x1 < xx)//если значение правой точки меньше левой,то
            {
                XX1 = x1;
                XX2 = xx;
            }
            else
            {
                XX1 = xx;
                XX2 = x1;
            }
            if (y1 < yy)
            {
                YY1 = y1;
                YY2 = yy;
            }
            else
            {
                YY1 = yy;
                YY2 = y1;
            }
 
        }
        public override Rectangle CreateRect()
        {
            rr = Rectangle.FromLTRB(XX1, YY1, XX2, YY2);//создает структуру Rectangle с координатами точек
            return (rr);
        }
 
        public override void DrawDash(Graphics g)//пунктир
        {
            using (Brush cbackg = new SolidBrush(cbackground))
            {
                g.FillRectangle(cbackg, rr);//заливка фигуры
            }
            using (Pen pen = new Pen(cline, sline))
            {
                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
                g.DrawRectangle(pen, rr);//рисование линии(контура фигуры)    
            }
        }
        public override void Hide(Graphics g)//белая линия
        {
            using (Pen pen = new Pen(Color.White, sline))
            {
                g.DrawRectangle(pen, rr);
            }
        }
 
        public override void Draw(Graphics g)//сплошная линия
        {
            using (Brush cbackg = new SolidBrush(cbackground))
            {
                g.FillRectangle(cbackg, rr);//заливка фигуры
            }
            using (Pen pen = new Pen(cline, sline))
            {
                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
                g.DrawRectangle(pen, rr);//рисование линии(контура фигуры)    
            }
        }
    }
1
2 / 2 / 1
Регистрация: 01.11.2014
Сообщений: 66
25.04.2015, 12:26  [ТС] 7
Цитата Сообщение от nedel Посмотреть сообщение
Код C#
Фона просто нет, а если прописать Form1.cbackground , то закрашивает все фигуры. =(
0
1144 / 873 / 506
Регистрация: 09.04.2014
Сообщений: 2,056
25.04.2015, 21:07 8
Цитата Сообщение от legxr Посмотреть сообщение
Фона просто нет
оно и не удевительно, ведь вы задаете прозрачный цвет фона
Цитата Сообщение от legxr Посмотреть сообщение
f = new Rect(0, 0, 0, 0, Color.Black, Color.Transparent, 0);
0
25.04.2015, 21:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2015, 21:07
Помогаю со студенческими работами здесь

Необработанное исключение типа "System.IO.FileNotFoundException" произошло в System.Drawing.dll
Выскакивает вот такая ошибка, не знаю, что делать. Я начинающий программист, очень прошу объяснить...

Исключение "System.ArgumentException" в System.Drawing при вызове ellipse.Clear()
Я хочу создать приложение которое будет называться &quot;магический шар&quot; нажимаешь на старт появляеться...

Необработанное исключение типа "System.ArgumentException" в System.Drawing.dll
Пишу приложение для работы с Графами (по учёбе). Есть Панель, в которой я рисую. Заполняю...

Необработанное исключение типа "System.IO.FileNotFoundException" в System.Drawing.dll
Пытаюсь добавить картинку в форму через код. Пользуюсь строчкой: pictureBox1.Image =...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru