Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Затерается рисунок (С#) 
:(
    Опции темы
Edd
Дата 4.3.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 23.3.2006

Репутация: 1
Всего: 1



Открываю bmp, рисую его в picturBox.
Вроде всё хорошо, но если на рисунок навести другой обьект или свернуть форму,
 то ресунок пропадает( стирается).
Как эту проблему решить? Ниже приведон код.
Код

private void button1_Click(object sender, EventArgs e)
        {
            String FName;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                FName = openFileDialog1.FileName.ToString();
                Bitmap ImageOpen = new Bitmap(FName);
                Graphics g = pictureBox1.CreateGraphics();
                pictureBox1.Width = ImageOpen.Width;
                pictureBox1.Height = ImageOpen.Height;
                Rectangle RectIn = new Rectangle(0, 0, ImageOpen.Width, ImageOpen.Height);// куда рисуем 
                Rectangle RectOut = new Rectangle(0, 0, ImageOpen.Width, ImageOpen.Height);//откуда рисуем
                g.DrawImage(ImageOpen, RectIn, RectOut, GraphicsUnit.Pixel);
                g.Dispose();
                ImageOpen.Dispose();
            }
        }

Может прорисовку надо подругому реализовать, для устронения проблемы?

PM MAIL   Вверх
Void
Дата 4.3.2007, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



В данном конкретном случае можно просто установить свойство PictureBox.Image.

А вообще, чтобы избежать затирания, надо обрабатывать событие Paint.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Edd
Дата 4.3.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 23.3.2006

Репутация: 1
Всего: 1



C PictureBox.Image: в смысле на прямую загружать рисунок? Но мне надо будет вырезать куски рисунка.

А как обрабатывать событие Paint?  smile (По форуму ускал, ничего не нашол)

PM MAIL   Вверх
Idsa
Дата 4.3.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(Void @  4.3.2007,  20:54 Найти цитируемый пост)
А вообще, чтобы избежать затирания, надо обрабатывать событие Paint.

Нее, обрабатывать OnPaint - не дело: для этого нужно хранить координаты всех нарисованных фигур. На мой взгляд, лучше делать вот так:
Код

string fileName = "image.bmp";
pictureBox1.Image = new Bitmap(fileName);
Graphics g = Graphics.FromImage(pictureBox1.Image);
g.DrawLine(Pens.Aqua, new Point(0, 0), new Point(10, 10));

В этом случае нарисованное тобой не стирается и перерисовкой заниматься не нужно.

Цитата(Edd @  4.3.2007,  21:24 Найти цитируемый пост)
А как обрабатывать событие Paint?

Делаешь обработчик события Paint в PictureBox:
Код

private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
      Graphics g = e.Graphics;
      g.DrawLine(Pens.Aqua, new Point(0, 0), new Point(10, 10));
    }

(делает код то же, что и в примере выше).

А вообще, я так и не разобрался во внутренностях этого процесса: почему так по-разному ведут себя рисунки при получении Graphics разными способами. Буду очень благодарен за ссылочки или подробное объяснение.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 4.3.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Edd @  4.3.2007,  20:24 Найти цитируемый пост)
А как обрабатывать событие Paint?

В property grid у pictureBox1 на закладке Events надо дважды кликнуть в строке с Paint.


--------------------
user posted image
PM MAIL WWW   Вверх
Edd
Дата 5.3.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 23.3.2006

Репутация: 1
Всего: 1



Используя:
Код

Graphics g = Graphics.FromImage(pictureBox1.Image);
g.DrawImage(ImageOpen, RectIn, RectOut, GraphicsUnit.Pixel);

затерание пропадает, но этот метод нельзя применять если
pictureBox1.Image=null;,
А мне надо использовать куски рисунков, которые могут быть разных форматов и в этом pictureBox1 рисовать.

П.С. Есть ли возможность к загружонному ресунку ислпользовать Transparent(Прозрачность фонового цвета).
PM MAIL   Вверх
-Mikle-
Дата 6.3.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Расскажи что ты вообще делаешь, а то тут предлагают всякого разного, опиши свою задачу, и тебе помогут грамотно реализовать ее. Что ходить вогруг, да около. Лично мне показалось что ты делаешь двумерную игрушку. И я мог бы рассказать как и что лучше сделать с прорисовкой, но вдруг я ошибся, и выйдет что я зря потратил время.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Edd
Дата 8.3.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 23.3.2006

Репутация: 1
Всего: 1



Делаю следующее: небольшая программка по обработке граффики.

Создаётся массив pictureBox-сов, в эти pictureBox-ы (PB) пользователь грузит картинки, разных размеров и форматов. Хотя не в PB, а в массив Bitmap-ов. PB нужны чтобы с картинками работать: отаброжать, перемещать по форме.
Далее, когда всё загружено и раставлено, всё это рисуется в отдельном pictureBox-се с соответствующими координатами. Полученное новое изображение сохраняется.

Проблема: Прорисовки всего (всех загруженных картинок) на отдельном pictureBox-се. С загрузкой, размещением и определением какую часть рисунка рисовать, проблем нету.

Размеры отдельного pictureBox-а, могут изменятся. Еслибы не менялись, то в отдельном pictureBox-е использовалбы рисунок весь белого цвета нужного мне размера.

Мозет для всего этого использовать другую компоненту, вместо pictureBox, или вообще свою создать?

PM MAIL   Вверх
mr.DUDA
Дата 9.3.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Уж не проще ли тогда рисовать все битмапы в одном контроле, например на панели ?


--------------------
user posted image
PM MAIL WWW   Вверх
-Mikle-
Дата 9.3.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Ну тогда все просто:

Код

Bitmap[] bmps = ...; // все картинки, к примеру взял массив, но это не принципиально
Bitmap destination = new Bitmap(w, h); // w и h - размеры конечной картинки, то есть твоего PB или Panel

private void UpdateBitmap()
{
    Graphics g = Graphics.FromImage(destination); // создаем Graphics для destination
    g.Clear(Color.Black); // заливаем всю область нужным цветом фона

    // рисуем поочередно все картинки в координатах x y
    for(int i=0; i<bmps.Length; i++)
        g.DrawImageUnscaled(bmps[i], x, y);

    g.Dispose(); // уничтожаем Graphics после того, как он не нужен
}


// использование вариант №1 
        pictureBox1.BackgroundImageLayout = ImageLayout.None;
        pictureBox1.BackgroundImage = destination;
        // или
        pictureBox1.Image = destination;


// использование вариант №2

        // функция обработки события Paint того контрола, на котором ты хочешь рисовать все
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            // если картинка destination изменилась, то надо перерисовать ее
            // здесь я просто для примера придумал свое название переменной, замени его на любое свое
            if( updateBitmapNeeded )
                UpdateBitmap();

            // рисуем картинку прям на контроле
            e.Graphics.DrawImageUnscaled(destination, 0, 0);
        }



Здесь код приведен в стиле "для ознакомления с принципом работы". В конечном коде необходимы различного рода оптимизации.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0964 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.