Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C#]Work with PictureBox 
:(
    Опции темы
newbie2009
Дата 4.1.2010, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если не сложно то расскажите как делать следующее:
Есть форма. В ней есть контрол  PictureBox
В нем надо:
1. Добавлять кружочки с надписями ( 1, 2, 3 ...)
2. Удалять кружочки с надписями
3. Возможность перемещать кружочки без мерцания....


Хотя бы первые 2 пункта помогите плиз....


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


iOS Lead Developer
****


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

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



Кружочки придется где-то хранить, заведи список (List) твоих кружков. У кружков придется знать координаты только. Т.е. это будет список List<Point>. Рисовать примерно так:
Код

// пусть pictureBox назван pb
using (Graphics gp = pb.CreateGraphics())
{
    foreach (Point circle in yourList)
        gp.DrawCircle(...); // тут юзаешь координаты из circle для рисования кружка. Вывод текста - gp.DrawString(...)
}



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
newbie2009
Дата 4.1.2010, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(mr.Anderson @ 4.1.2010,  22:02)
Кружочки придется где-то хранить, заведи список (List) твоих кружков. У кружков придется знать координаты только. Т.е. это будет список List<Point>. Рисовать примерно так:
Код

// пусть pictureBox назван pb
using (Graphics gp = pb.CreateGraphics())
{
    foreach (Point circle in yourList)
        gp.DrawCircle(...); // тут юзаешь координаты из circle для рисования кружка. Вывод текста - gp.DrawString(...)
}

Код

private List<Point> circleList = new List<Point>();
        private int d = 20;

private void NetworkImage_MouseDown(object sender, MouseEventArgs e)
        {
            circleList.Add(new Point(e.X,e.Y));

            using (Graphics g = pb.CreateGraphics())
            {
                foreach (Point circle in circleList)
                    g.DrawEllipse(Pens.Aqua, e.X, e.Y, d, d);
            }
        }



Почему, например, посл. нажатия 20 раз мышкой, все кружки исчезают?
И как быть с удалением и перетягиванием, и с мерцанием?


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


iOS Lead Developer
****


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

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



С мерцанием просто - заведи буфер в памяти (Bitmap), рисуй на нем, а уже после рисования выводи его на канву реального пикчербокса. С удалением - ну заведи кнопку, которая удалять будет определенный кружок. Список кружков сделай в GUI, тут места для фантазии много. Пусть удаляется кружок, который юзер выделит в их списке. Удаление вещь нехитрая - выброси его из списка List и все. А потом перерисовку сразу делай (рисуй все кружки, как сейчас у тебя). Чтобы избежать пропадания при таскании формы и при изменении ее размеров - в соответствующие события поставь перерисовку свою.

Добавлено через 4 минуты и 48 секунд
ЗЫ перемещение без мерцания делается аналогично через второй буфер.

Добавлено через 4 минуты и 59 секунд
ЗЗЫ через тот же самый буфер, конечно же, три штуки заводить незачем.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
newbie2009
Дата 5.1.2010, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если не сложно, то можно какой-то пример с Bitmap ?
И как насильно вызвать перерисовку?

Это сообщение отредактировал(а) newbie2009 - 5.1.2010, 11:08
PM MAIL   Вверх
mr.Anderson
Дата 5.1.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Да ничего сложного с битмапом. В классе формы заведи приватный битмап. Создай отдельную функцию перерисовки. Получи точно так же его Graphics в этой функции. На этом графиксе рисуй то, что тебе надо. А после окончания этих рисований попросту получи графикс твоего пикчербокса и отрисуй на нем через DrawImage() твой битмап. Все. Из битмапа графикс получать так:
Код

Bitmap myBuffer = new Bitmap(200, 300); // битмап размерами 200х300
using (Graphics gp = Graphics.FromBitmap(myBuffer))
{
  // рисуешь на нем кружки
  // ...
}
using (Graphics pgp = pictureBox1.CreateGraphics())
  pgp.DrawImage(0, 0, mybuffer); // уточни параметры, могу врать.



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
newbie2009
Дата 6.1.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо за помощь!
Только немного ошиблись. Пишу как надо, может кто-то будет испол...
Код

Bitmap myBuffer = new Bitmap(200, 300); // битмап размерами 200х300
using (Graphics gp = Graphics.FromImage(myBuffer)) // ЗАМЕСТЬ FromBitmap
{
  // рисуешь на нем кружки
  // ...
}
using (Graphics pgp = pictureBox1.CreateGraphics())
  pgp.DrawImage(mybuffer,0,0); // ТУТ НАОБОРОТ


Это сообщение отредактировал(а) newbie2009 - 6.1.2010, 14:34
PM MAIL   Вверх
mr.Anderson
Дата 6.1.2010, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



А, ну да, разумеется. Очепяток.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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


 




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


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

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