Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/43: Рейтинг темы: голосов - 43, средняя оценка - 4.84
 Аватар для GreatTalker
4 / 4 / 1
Регистрация: 03.10.2010
Сообщений: 111

Создать экземпляр класса Graphics для метода в своём классе

16.05.2012, 11:51. Показов 8888. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.Делаю графический редактор,нужно,чтобы отрисовывались на контроле picturebox линии из списка lines.Для этого создал класс Line,где данные для объекта tmp берутся из координат на контроле picturebox в обработчиках событий MouseDown и MouseUp.Для отрисования линий я беру точки из списка a и реализую рисование в методе Drawlines,но я не понял как создать экземляр объекта graphics компонента picturebox,чтобы в методе получалась прорисовка.Помогите,пожалуйста.
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
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;
using System.Drawing.Drawing2D;
 
 
 
namespace GraphCreator
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Point start, end;
        List<Point> a = new List<Point>();//массив для хранения точек
        
        private void Form1_Load(object sender, EventArgs e)
        {
            this.pictureBox1.Image = new Bitmap(this.pictureBox1.Width, this.pictureBox1.Height);//для чего это не знаю
        }
 
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)//при нажатии кнопки мыши 
        {
            start = e.Location;//записываем начальные координаты
            this.Invalidate();
        }
 
        private void pictureBox1_MouseEnter(object sender, EventArgs e)//при попадании мыши на picturebox
        {
            Cursor = Cursors.Cross;//курсор становится крестом
        }
 
        private void Form1_MouseEnter(object sender, EventArgs e)//при попадании мыши на форму
        {
            Cursor = Cursors.Default;//курсор становится стандартным
        }
 
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)//при отпускании мыши
        {
             end = e.Location;//записываем конечные координаты
             this.Invalidate();
             pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);//подключаем событие Paint
             
        }
 
        private void pictureBox1_Paint(object sender, PaintEventArgs e)//событие рисования
        {
            Graphics g = e.Graphics;//создаём местную версию графического объекта для picturebox
            Pen p = new Pen(Color.Black, 2);//создаём перо
           // g.DrawLine(p, start, end);//рисуем линию
           // int x1=start.X;
           // int y1=start.Y;
           // int x2=end.X;
            //int y2=end.Y;
            //g.DrawEllipse(p, x1,y1,x2,y2);
            pictureBox1.Refresh();
            Line tmp = new Line(start,end,a);//создание объекта в событии paint
            Line.Drawlines(tmp);//вызов метода-здесь ошибка Для нестатического поля, метода или свойства "GraphCreator.Form1.Line.Drawlines(GraphCreator.Form1.Line)" требуется ссылка на объект
 
        }
        public class Line
        {
            public Point p1,p2;
            public List<Point> a = new List<Point>();
            Graphics g = Graphics.FromHwndInternal(hwnd);//как здесь прописать экземпляр класса Graphics от picturebox
            public  Line(Point p1,Point p2,List<Point> a)//закидываем координаты точек в список
            {
                a.Add(p1);
                a.Add(p2);
            }
            public void Drawlines(Line tmp)//метод для отрисовки линий объекта tmp
            {
                Pen p = new Pen(Color.Black, 2);
                for (int i = 0; i < a.Count; i=+2)
                {
                    g.DrawLine(p, a[i], a[i + 1]);
                }
            }
        }
        
    }
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2012, 11:51
Ответы с готовыми решениями:

Получить адрес метода в классе через экземпляр класса
Здравствуйте знатоки! Прошу помощи. Переношу один проэкт с скриптового языка питон на обжпаскаль и вот упёрся рогом в получение адреса у...

Создать экземпляр метода класса или доступ к методу из экземпляра класса
Всем доброго времени суток!) Уже месяца как 2 не сишарпил и подзабыл...собственно задача такая: Создать отдельный экземпляр класса для...

Как правильно создать экземпляр класса в классе контроллере
Давайте все объясню. Это пока что просто тест класса (FTPCClient) через Controller, который я написал. Не могу проинициализировать...

2
 Аватар для lowercase
213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
16.05.2012, 15:07
я вам дам полезный совет(даже 2):
необижайтесь.. но лучше больше никогда не пишите такой код как у вас идет начиная от метода pictureBox1_Paint().
для начало разберитесь, что такое ООП и с чем его едят, потом разберить с особенностями ооп в c#. ибо c# это чисто обьекто ориентированый язык програмирования. без минимальных знаний ооп в c# далеко не заедите. разберитесь что такое статические классы
имхо. ооп это еще далеко не просто обявление класса с методами и полями.
еще вам не помешает разобратся с областью видимости переменных.

Добавлено через 20 минут
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
         private void pictureBox1_Paint(object sender, PaintEventArgs e){
           // .. пропустим чуть кода в этом меоде.
 
           Line tmp = new Line(start,end,a); // ну это создание класса..
           // тут вроде бы все нормально(если закрыть глаза на то как реализирован этот класс)
 
           // что касается этой строчки:
           Line.Drawlines(tmp);
           // тут сразу видно что вы не знакомы со статическими полями и классами
           // если не понимаете смысл ошибки которую вам выдает компилятор.
 
           // статические члены классов это такие члены, которые
           // можна вызывать без предварительного создания екземпляра класса.
           // детальнее - гугл в помощь.
 
           // нельзя просто так обратится к методу класса, нужно либо сделать метод статическим
           // либо создать екземпляр класса и уже в екземпляре вызвать этот меод.
           // вы пытаетесь вызвать метод непонятно чего. 
 
           // записать так: tmp.Drawlines(tmp); еще куда не шло. 
           // но опять же если заркрыть глаза на реализацию класса Line
  
         }
          
          // идем дальше
 
          public class Line
           {
            public Point p1,p2;
            public List<Point> a = new List<Point>();
            Graphics g = Graphics.FromHwndInternal(hwnd);// зачем вам нужно это? 
            public  Line(Point p1,Point p2,List<Point> a)  {
                // если вы хотите закинуть координаты в 
                // поле данного класса List<Point> a, то надо написать
                this.a.Add(p1);
                this.a.Add(p2);
                // но в таком случае непотяно для чего вам в параметре метода.List<Point> a
            
                // в вашем же случае вы добавите точки в List<Point> a
                // который является параметром метода... 
                // для чего тогда этот параметр метода? - непонятно.. 
                // это можно сделать и без дополнительных классов
 
            }
            public void Drawlines(Line tmp){ 
                //  Line tmp - для чего вам этот параметр если вы его не используете методе?
                Pen p = new Pen(Color.Black, 2);
                for (int i = 0; i < a.Count; i=+2)
                {
                    g.DrawLine(p, a[i], a[i + 1]);
                }
            }
я понимаю, что Вам хочется написать свой графический редактор. да это весело. особенно впервые. но увы Вам недостаточно знаний програмирования, ибо набирать код в текстовом редакторе компилятора это еще далеко не програмирование. имхо.
0
 Аватар для GreatTalker
4 / 4 / 1
Регистрация: 03.10.2010
Сообщений: 111
20.05.2012, 10:23  [ТС]
Спасибо Вам за такой развёрнутый ответ.У нас в универе программирование толком не преподаётся-все изучаю самостоятельно,в книгах описываются не все тонкости,поэтому иногда приходится действовать единственным доступным методом-методом научного тыка.Вот допустим,в книгах я нашел как через Graphics отрисовать линию,но как их сохранять на поверхности picturebox,нигде не пишут.Поэтому я сам пришел к выводу,что все координаты отрисованных линий нужно записывать в список,и потом через метод drawLines отрисовывать на picturebox уже после refresh().Для этого в классе Line нужно создать экземпляр класса graphics,чтобы методу было понятно,где идет отрисовка списка линий.Препод настаивает,чтобы в работе было ярко выраженное ООП,поэтому я и решил создать класс Line для большей наглядности вместе с перегруженным методом и методом Drawlines...Я внял Вашей аргументированной критике,и переделал код,но проблема с экземпляром класса Graphics так и не решена.Код:
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
private void pictureBox1_Paint(object sender, PaintEventArgs e)//событие рисования
        {
            Graphics g = e.Graphics;//создаём местную версию графического объекта для picturebox
            ........................................
            pictureBox1.Refresh();
            Line tmp = new Line(g,start,end);//создание объекта в событии paint
            tmp.Drawlines();//вызов метода
        }
  public class Line
        {
            public Point p1,p2;
            public List<Point> a = new List<Point>();
            Graphics g = e.Graphics;//Элемент "e" не существует в текущем контексте
 
            public  Line(Graphics g,Point p1,Point p2)//закидываем координаты точек в список
            {
                this.a.Add(p1);
                this.a.Add(p2);
            }
            public void Drawlines()//метод для отрисовки линий объекта tmp
            {
                Pen p = new Pen(Color.Black, 2);
                for (int i = 0; i < a.Count; i=+2)
                {
                    g.DrawLine(p, a[i], a[i + 1]);
                }
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.05.2012, 10:23
Помогаю со студенческими работами здесь

Как создать экземпляр внутреннего класса в родительском классе
Как создать экземпляр этого класса в статическом методе main. public class Parent { class Child {} public static void...

Работа с классами (в главном классе создать указатель на экземпляр другого класса)
Недавно начал изучение С++, в частности ООП. В связи с чем у меня есть вопрос как в главном классе можно создать указатель на экземпляр...

Как использовать экземпляр PDO в своём классе?
Вот я соединяюсь с базой: $dbh = new PDO(&quot;mysql:host=$host;dbname=$db_name&quot;,$user,$pass); если использовать $dbh вне своего класса,...

Как правильно использовать экземпляр PDO в своём классе?
Читал тему, но приведенный вариант в самом конце не подходит. Поэтому вынес подключние к базе в отдельный класс, где в конструкторе идет...

Создать экземпляр одного класса в Main, и передать его в экземпляр другого класса
Добрый день. Подскажите пожалуйста. есть несколько классов-файлов в одном пакете. class one class two class main... Нужно...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru