Страница: 1 | 2 | 3 |
|
Вопрос: Сохранить графику
|
Добавлено: 10.01.11 16:41
|
|
Автор вопроса: romashko1901 | ICQ: 416844272
|
Здравствуйте, столкнулся с проблемой...
Написал код, благодаря которому можно мышкой нарисовать что-то, мне нужно теперь сделать так что бы данные о нарисованном сохранялись в массив, и при необходимости можно было обратившись к данным получить рисунок.
Не мог ли бы помочь?
Ответить
|
Номер ответа: 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) если курсор задержать в одной точке в массив вгоняются много одинаковых значений подряд, хотя это не нужно, не знаю как с этим бороться. думаю что если придумать какую-нибудь процедуру, которая бы проверяла значения и при обнаружении одинаковых подряд, удаляла все кроме одного.
Если поможете с этой проблемкой, тогда я смогу сделать что бы рисовалось из массива, в случае сворачивания или необходимости с нуля вывести изображение.
Заранее спасибо!
Ответить
|
Номер ответа: 7 Автор ответа: romashko1901
ICQ: 416844272
Вопросов: 1 Ответов: 13
|
Профиль | | #7
|
Добавлено: 11.01.11 20:12
|
AgentFire пишет:
и то верно. считывай координаты по MouseMove
Если этот код вставить в событие mouse_move то рисует вслед за курсором постоянно, и не останавливается, а это не удобно
Ответить
|
Номер ответа: 10 Автор ответа: romashko1901
ICQ: 416844272
Вопросов: 1 Ответов: 13
|
Профиль | | #10
|
Добавлено: 11.01.11 20:46
|
EROS пишет:
надо рисовать в событии Paint
Если делать в этом событии то:
1) рисует не в след за мышью, а только по точкам где кликнешь
2) во вторых если кликаешь по одному объекту(например по RectangleShape) то рисуется одна линия и все, а если начинаешь по нему и например по текстбоксу кликать рисуются линии но как в первом пункте
Ответить
|
Номер ответа: 12 Автор ответа: romashko1901
ICQ: 416844272
Вопросов: 1 Ответов: 13
|
Профиль | | #12
|
Добавлено: 11.01.11 21:08
|
AgentFire пишет:
я бы создал тут класс
А не могли бы помочь примером, или статейкой хорошоей по этому способу?
Ответить
|
Номер ответа: 14 Автор ответа: EROS
Вопросов: 58 Ответов: 4255
|
Профиль | | #14
|
Добавлено: 12.01.11 02:23
|
рабочий пример могу накатать рублей за 300
AgentFire, ну ёмаё.. Настоящие джедаи так не поступают.. нельзя быть таким жлобом! Если бы это был хитрожопый студент,который лохов ищет,чтоб за него курсовую или зачет сделали - это один разговор.. С таких можно, и бы даже сказал нужно драть 3 шкуры. Но тут то совсем другой случай... Видишь же, пацан к знаниям тянется.. Таких поощрять надо!
На вот лучше переведи на его "родной" язык,чтоб он понял о чем мы тут ему говорили и разобрался как это работает..
-
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.Windows.Forms;
-
- namespace VbNetSample
- {
-
- public partial class Form1 : Form
- {
- ShapeManager m_shapeManager;
- Color m_currentColor;
- ShapeType m_currentShape;
- Point m_lastPoint;
- bool m_is_pressed;
- float m_currentWidth;
-
- public Form1()
- {
- InitializeComponent();
- Initialize();
- }
-
- void Initialize()
- {
- BackColor = Color.White;
- DoubleBuffered = true;
-
- m_shapeManager = new ShapeManager();
- m_currentColor = Color.Blue;
- m_currentShape = ShapeType.Line;
- m_currentWidth = 10f;
- }
-
- protected override void OnMouseDown(MouseEventArgs e)
- {
- if (e.Button == MouseButtons.Left)
- {
- m_lastPoint = e.Location;
- m_is_pressed = true;
- }
- }
-
- protected override void OnMouseUp(MouseEventArgs e)
- {
- if (e.Button == MouseButtons.Left)
- {
- m_is_pressed = false;
- }
- }
-
- protected override void OnMouseMove(MouseEventArgs e)
- {
- if (m_is_pressed)
- {
- switch (m_currentShape)
- {
- case ShapeType.Line:
- AppendShape(new Line(m_currentColor, m_lastPoint, e.Location, m_currentWidth));
- m_lastPoint = e.Location;
- break;
- default:
- throw new NotImplementedException();
- }
-
- }
- }
-
- void AppendShape(IShape shape)
- {
- m_shapeManager.Add(shape);
- UpdateImage();
- }
-
- protected override void OnPaint(PaintEventArgs e)
- {
- base.OnPaint(e);
-
- e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
- e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
-
- foreach (IShape shape in m_shapeManager)
- shape.Draw(e.Graphics);
- }
-
- void Undo()
- {
- if (m_shapeManager.Count != 0)
- {
- m_shapeManager.RemoveAt(m_shapeManager.Count - 1);
- UpdateImage();
- }
- }
-
- void UpdateImage()
- {
- Refresh();
- Text = string.Format("Объектов: {0}", m_shapeManager.Count);
- }
- }
-
-
- public enum ShapeType { Line, Rectangle, Star, Cycle };
- public interface IShape { void Draw(Graphics g);}
-
- [Serializable]
- public class Line : IShape
- {
- public Line() { }
- public Line(Color color, Point begin, Point end, float width)
- {
- Color = color;
- Begin = begin;
- End = end;
- Width = width;
- }
-
- public Color Color { get; set; }
- public Point Begin { get; set; }
- public Point End { get; set; }
- public float Width { get; set; }
-
- public void Draw(Graphics g)
- {
- using (Pen pen = new Pen(Color, Width))
- {
- pen.StartCap = LineCap.Round;
- pen.EndCap = LineCap.Round;
- g.DrawLine(pen, Begin, End);
- }
- }
-
- }
-
- public class ShapeManager : List<IShape>
- {
- public static ShapeManager FromFile(string path) {/* load from file */ return null; }
- public void Save(string path) {/* save to file */}
- }
- }
З.Ы. Ну и если не лень будет, допили пример чтоб сериализация была..
Ответить
|
Страница: 1 | 2 | 3 |
Поиск по форуму