Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C#]Work with PictureBox


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


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


Автор: 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(...)
}

Автор: newbie2009 4.1.2010, 22:46
Цитата(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 раз мышкой, все кружки исчезают?
И как быть с удалением и перетягиванием, и с мерцанием?


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

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

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

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

Автор: mr.Anderson 5.1.2010, 11:56
Да ничего сложного с битмапом. В классе формы заведи приватный битмап. Создай отдельную функцию перерисовки. Получи точно так же его 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); // уточни параметры, могу врать.

Автор: newbie2009 6.1.2010, 14:22
Спасибо за помощь!
Только немного ошиблись. Пишу как надо, может кто-то будет испол...
Код

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); // ТУТ НАОБОРОТ

Автор: mr.Anderson 6.1.2010, 19:37
А, ну да, разумеется. Очепяток.

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