Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 |

 

  Вопрос: Сохранить графику Добавлено: 10.01.11 16:41  

Автор вопроса:  romashko1901 | ICQ: 416844272 
Здравствуйте, столкнулся с проблемой...
Написал код, благодаря которому можно мышкой нарисовать что-то, мне нужно теперь сделать так что бы данные о нарисованном сохранялись в массив, и при необходимости можно было обратившись к данным получить рисунок.
Не мог ли бы помочь?

Ответить

  Ответы Всего ответов: 32  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 10.01.11 17:13
Если ты рисуешь на Bitmap'e то у него есть метод Save позволяющий сохранить рисунок, если же как то иначе то надо видеть КАК именно ты рисуешь и тогда уже можно будет сказать что то более конкретное..

Ответить

Номер ответа: 2
Автор ответа:
 HIWORD



Вопросов: 0
Ответов: 14
 Профиль | | #2 Добавлено: 10.01.11 17:16
В win32API можно через CreateEnhMetaFile.
А в NET ,видимо, new MetaFile(new MemoryStream()); ?

Ответить

Номер ответа: 3
Автор ответа:
 romashko1901



ICQ: 416844272 

Вопросов: 1
Ответов: 13
 Профиль | | #3 Добавлено: 11.01.11 19:30
Здравствуйте, Eros!
Я рисую на форме вот как:
 
Dim graf As Graphics = CreateGraphics()
                graf.DrawLine(Pens.Black, x1, y1, x2, y2)

Как вбивать в массив каждую координату ключевую, я разобрался сам. Теперь появилась новая проблемка,
1) если курсор задержать в одной точке в массив вгоняются много одинаковых значений подряд, хотя это не нужно, не знаю как с этим бороться. думаю что если придумать какую-нибудь процедуру, которая бы проверяла значения и при обнаружении одинаковых подряд, удаляла все кроме одного.
Если поможете с этой проблемкой, тогда я смогу сделать что бы рисовалось из массива, в случае сворачивания или необходимости с нуля вывести изображение.
Заранее спасибо!

Ответить

Номер ответа: 4
Автор ответа:
 Дмитрий Юпатов



Вопросов: 4
Ответов: 457
 Web-сайт: cargomaster.at.ua/
 Профиль | | #4
Добавлено: 11.01.11 19:43
если курсор задержать в одной точке в массив вгоняются много одинаковых значений подряд
с чего бы? Неужели координаты курсора по таймеру проверяются?!

Ответить

Номер ответа: 5
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #5 Добавлено: 11.01.11 20:08
и то верно. считывай координаты по MouseMove

Ответить

Номер ответа: 6
Автор ответа:
 romashko1901



ICQ: 416844272 

Вопросов: 1
Ответов: 13
 Профиль | | #6 Добавлено: 11.01.11 20:09
Сейчас объясню почему так, у меня код для рисования находится в таймере, поэтому так выходит наверное....просто я не нашел пока другого способа рисовать в след за курсором, если делаю не в таймере то нужно для рисования каждой линии отпускать и заново нажимать кнопку мыши, а так все работает пока mouse_down and move

Ответить

Номер ответа: 7
Автор ответа:
 romashko1901



ICQ: 416844272 

Вопросов: 1
Ответов: 13
 Профиль | | #7 Добавлено: 11.01.11 20:12
AgentFire пишет:
и то верно. считывай координаты по MouseMove

Если этот код вставить в событие mouse_move то рисует вслед за курсором постоянно, и не останавливается, а это не удобно

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 11.01.11 20:35
в случае сворачивания

Ты неверно рисуешь.. надо рисовать в событии Paint (там уже передается Graphics и не надо ничего создавать),тогда при сворачивании изображение не будет пропадать..
Идея с таймером в корне неверна.. Ты объясни как ты хочешь чтоб рисовалось с точки зрения юзера, а потом тебе подскажут КАК это правильно сделать..

Ответить

Номер ответа: 9
Автор ответа:
 romashko1901



ICQ: 416844272 

Вопросов: 1
Ответов: 13
 Профиль | | #9 Добавлено: 11.01.11 20:40
Мне нужно что бы, юзер мог что то нарисовать, затем то что он нарисовал, сохранилось не как картинка, а именно значениями всех координат в массиве. Что бы можно было потом работать с этими значениями

Ответить

Номер ответа: 10
Автор ответа:
 romashko1901



ICQ: 416844272 

Вопросов: 1
Ответов: 13
 Профиль | | #10 Добавлено: 11.01.11 20:46
EROS пишет:
надо рисовать в событии Paint

Если делать в этом событии то:
1) рисует не в след за мышью, а только по точкам где кликнешь
2) во вторых если кликаешь по одному объекту(например по RectangleShape) то рисуется одна линия и все, а если начинаешь по нему и например по текстбоксу кликать рисуются линии но как в первом пункте

Ответить

Номер ответа: 11
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #11 Добавлено: 11.01.11 20:52
romashko1901 пишет:
Мне нужно что бы, юзер мог что то нарисовать, затем то что он нарисовал, сохранилось не как картинка, а именно значениями всех координат в массиве. Что бы можно было потом работать с этими значениями

я бы создал тут класс, который бы содержал в конкретный момент времени конкретное действие (рисование стоп или старт, тип фигуры, цвет, координату), а затем список экземпляров таких классов. а сохранение сериализацией

Ответить

Номер ответа: 12
Автор ответа:
 romashko1901



ICQ: 416844272 

Вопросов: 1
Ответов: 13
 Профиль | | #12 Добавлено: 11.01.11 21:08
AgentFire пишет:
я бы создал тут класс

А не могли бы помочь примером, или статейкой хорошоей по этому способу?

Ответить

Номер ответа: 13
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #13 Добавлено: 11.01.11 21:39
рабочий пример могу накатать рублей за 300

Ответить

Номер ответа: 14
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #14 Добавлено: 12.01.11 02:23
рабочий пример могу накатать рублей за 300

AgentFire, ну ёмаё.. Настоящие джедаи так не поступают.. нельзя быть таким жлобом! Если бы это был хитрожопый студент,который лохов ищет,чтоб за него курсовую или зачет сделали - это один разговор.. С таких можно, и бы даже сказал нужно драть 3 шкуры. Но тут то совсем другой случай... Видишь же, пацан к знаниям тянется.. Таких поощрять надо!
На вот лучше переведи на его "родной" язык,чтоб он понял о чем мы тут ему говорили и разобрался как это работает..

  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using System.Drawing.Drawing2D;
  6. using System.Windows.Forms;
  7.  
  8. namespace VbNetSample
  9. {
  10.  
  11.     public partial class Form1 : Form
  12.     {
  13.         ShapeManager m_shapeManager;
  14.         Color m_currentColor;
  15.         ShapeType m_currentShape;
  16.         Point m_lastPoint;
  17.         bool m_is_pressed;
  18.         float m_currentWidth;
  19.  
  20.         public Form1()
  21.         {
  22.             InitializeComponent();
  23.             Initialize();
  24.         }
  25.  
  26.         void Initialize()
  27.         {
  28.             BackColor = Color.White;
  29.             DoubleBuffered = true;
  30.  
  31.             m_shapeManager = new ShapeManager();
  32.             m_currentColor = Color.Blue;
  33.             m_currentShape = ShapeType.Line;
  34.             m_currentWidth = 10f;
  35.         }
  36.  
  37.         protected override void OnMouseDown(MouseEventArgs e)
  38.         {
  39.             if (e.Button == MouseButtons.Left)
  40.             {
  41.                 m_lastPoint = e.Location;
  42.                 m_is_pressed = true;
  43.             }
  44.         }
  45.  
  46.         protected override void OnMouseUp(MouseEventArgs e)
  47.         {
  48.             if (e.Button == MouseButtons.Left)
  49.             {
  50.                 m_is_pressed = false;
  51.             }
  52.         }
  53.  
  54.         protected override void OnMouseMove(MouseEventArgs e)
  55.         {
  56.             if (m_is_pressed)
  57.             {
  58.                 switch (m_currentShape)
  59.                 {
  60.                     case ShapeType.Line:
  61.                         AppendShape(new Line(m_currentColor, m_lastPoint, e.Location, m_currentWidth));
  62.                         m_lastPoint = e.Location;
  63.                         break;
  64.                     default:
  65.                         throw new NotImplementedException();
  66.                 }
  67.  
  68.             }
  69.         }
  70.  
  71.         void AppendShape(IShape shape)
  72.         {
  73.             m_shapeManager.Add(shape);
  74.             UpdateImage();
  75.         }
  76.  
  77.         protected override void OnPaint(PaintEventArgs e)
  78.         {
  79.             base.OnPaint(e);
  80.  
  81.             e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
  82.             e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
  83.  
  84.             foreach (IShape shape in m_shapeManager)
  85.                 shape.Draw(e.Graphics);
  86.         }
  87.  
  88.         void Undo()
  89.         {
  90.             if (m_shapeManager.Count != 0)
  91.             {
  92.                 m_shapeManager.RemoveAt(m_shapeManager.Count - 1);
  93.                 UpdateImage();
  94.             }
  95.         }
  96.  
  97.         void UpdateImage()
  98.         {
  99.             Refresh();
  100.             Text = string.Format("Объектов: {0}", m_shapeManager.Count);
  101.         }
  102.     }
  103.  
  104.  
  105.     public enum ShapeType { Line, Rectangle, Star, Cycle };
  106.     public interface IShape { void Draw(Graphics g);}
  107.  
  108.     [Serializable]
  109.     public class Line : IShape
  110.     {
  111.         public Line() { }
  112.         public Line(Color color, Point begin, Point end, float width)
  113.         {
  114.             Color = color;
  115.             Begin = begin;
  116.             End = end;
  117.             Width = width;
  118.         }
  119.  
  120.         public Color Color { get; set; }
  121.         public Point Begin { get; set; }
  122.         public Point End { get; set; }
  123.         public float Width { get; set; }
  124.  
  125.         public void Draw(Graphics g)
  126.         {
  127.             using (Pen pen = new Pen(Color, Width))
  128.             {
  129.                 pen.StartCap = LineCap.Round;
  130.                 pen.EndCap = LineCap.Round;
  131.                 g.DrawLine(pen, Begin, End);
  132.             }
  133.         }
  134.  
  135.     }
  136.  
  137.     public class ShapeManager : List<IShape>
  138.     {
  139.         public static ShapeManager FromFile(string path) {/* load from file */ return null; }
  140.         public void Save(string path) {/* save to file */}
  141.     }
  142. }




З.Ы. Ну и если не лень будет, допили пример чтоб сериализация была..

Ответить

Номер ответа: 15
Автор ответа:
 romashko1901



ICQ: 416844272 

Вопросов: 1
Ответов: 13
 Профиль | | #15 Добавлено: 12.01.11 13:08
EROS, Это C#? И это наверное нужно прописывать где происходит инициализация приложения?

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам