Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Разработка графического редактора


Автор: EgoBrain 23.3.2008, 13:00
Здравствуйте. Я разрабатываю простой графический редактор. Всё рисование на форме осуществляется в событиях MouseDown, MouseMove, MouseUp. Естественно после перерисовки формы изображение пропадает.  :dash1 

Переделывать всё под событие OnPaint лень, много переделывать придётся, плюс я незнаю стандартной технологии рисования по OnPaint. Была идея сбрасывать уже нарисованное в битовую карту каждый раз, и каждый раз заново воспроизводить, как это реализовать, или может есть другие подходы без глобальных переделок кода?  Времени слишком мала, в мае сдача дипломки, тема связанная с графикой в .NET :wacko 

Автор: 0lmer 23.3.2008, 14:43
Посмотри в MSDN на тему GDI.
Мож чего найдешь хорошего.

Автор: vponomarov 23.3.2008, 15:54
EgoBrain, вот чувак тем же занимался. говорит, что я ему помог, все заработало smile 
http://forum.vingrad.ru/forum/topic-201830/kw-simole-paint-redactor.html

Автор: EgoBrain 24.3.2008, 07:11
Хмм... Вариант сбрасывания в файл я не рассматривал, всё время мучился вопросом как сохранять битовую карту в памяти и загружать её в рисуемую область. Это реально? Хотя можно попробывать и с файлом... Блин, опять гемор в итоге...  smile 

Тьфу блин, всё вижу, здесь не через файл идёт работа, а в памяти... Но всё равно никак до ума довести не могу, получается сделать чтоб рисунок не пропадал, но не видно самого процесса рисования (нарисованное появляется только после перерисовки формы). В общем не мог бы ты ещё раз всё по-порядку объяснить что и как, и не просто код привести, а в научно публицистическом стиле рассказать smile ведь толку нету копировать чужой код.

А вот, всё, получилось, неужели smile Просто у меня там инструментов несколько уже было, поэтому переделывать немножко пришлось. Самое главное набраться моральных сил чтобы что-то сделать smile Теперь осталось работу с битовой картой из файла переделать под pictureBox (у меня всё рисование до этого было по Form).

Да, кстати, впервые вижу чтоб объявляли экземпляры классов здесь:
Код

public Form4()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
            pictureBox1.Image=new Bitmap(pictureBox1.Width,pictureBox1.Height);
            Graphics myGraphix=Graphics.FromImage(pictureBox1.Image);
            myGraphix.Clear(Color.White);
            
        }
 

Автор: vponomarov 24.3.2008, 10:45
Цитата

Да, кстати, впервые вижу чтоб объявляли экземпляры классов здесь:

а что в этом такого?
и кстати, если ты имеешь в виду pictureBox1.Image=new Bitmap(pictureBox1.Width,pictureBox1.Height); - то это инициализация. где же ее делать как не в конструкторе? smile 
а если Graphics myGraphix=... , то это просто вспомогательный объект, чтобы залить картинку. опять же не вижу ничего противоестественного smile 

Автор: EgoBrain 24.3.2008, 14:22
Новая проблема: размеры битовой карты, по которой происходит рисование, не совпадают с размерами клиентской области pictureBox, причём возникает это абсолютно по непонятным причинам и поразному (бывает просто нижнюю часть отрезает, а бывает нижнюю и правую). Кто-нибудь сталкивался? 

Автор: Dennnis 24.3.2008, 15:58
Так же используй двойную буферизацию. Ты рисуешь на невидимой Graphics, а затем просто попируешь содержимое в графикс формы
Код

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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        private BufferedGraphicsContext context;
        private BufferedGraphics buffer;
        private Graphics graphics;


        public Form1()
        {
            InitializeComponent();

            context = BufferedGraphicsManager.Current;
            Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);
            buffer = context.Allocate(this.CreateGraphics(), rect);
            graphics = buffer.Graphics;
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            buffer.Render(e.Graphics);
        }

        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            //Резуем в graphics что угодно
            graphics.DrawRectangle(Pens.Red, 10, 10, 100, 100);
            //Перерисовывает форму
            this.Refresh();
        }
    }
}


Автор: EgoBrain 25.3.2008, 04:22
Что за пространства имён System.Collections.Generic и System.Linq. Какую версию Framework юзаешь? У меня в системе нет таких пространств о_О.
WinXP SP2, .NET Framework 1.1. Походу 2.0 нуна?  smile  

Автор: QryStaL 25.3.2008, 10:14
System.Collections.Generic из 2.0
System.Linq из 3.5

2.0 очень желательно, есть довольно существенные отличия от 1.1

Автор: EgoBrain 21.4.2008, 03:26
Немогу найти информацию по вопросу: как осуществить в C# заливку области обозначенной одним цветом, тобишь как это реализовано в MS Paint.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)