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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание произвольного PictureBox 
V
    Опции темы
wester
Дата 14.3.2010, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Приветствую!
проблема такова:
необходимо создать некое поле N x N квадратов , в дальнейшим эти квадраты будут менять цвет.
я подумал что можно было бы для этого использовать PictureBox и там отрисовывать все что надо. но не получается 
picturebox просто не появляется на форме Form1

cодержание файла Form1.cs
Код

private void button1_Click(object sender, EventArgs e)
        {
            var ssq = new Square(13);// создаем новый объект Square
            var pict = ssq.CreatePictBox(10); // создаем новый PictureBox
            pict.Update();
            pict.Name = "PictBox"; // присваеваем имя
            pict.Location=new Point(10,10); // координаты расположения
            Controls.Add(pict);
            Refresh();

        }

cодержание файла Square.cs
Код

/// <summary>
        /// Создание прямоугольника
        /// </summary>
        /// <param name="carriage">если условие равно <c>true</c> то меняем значение y на строку ниже.</param>
        /// <returns>Прямоугольник</returns>
        private  Rectangle Rect(Boolean carriage)
        {
            var rect = new Rectangle(new Point(x, y), new Size(width, width)); // cоздаем rectangle по изменным параметрам
            if (carriage)
            {
                y += width + 1;
            }
            x += width + 1;
            return rect;
        }

        /// <summary>
        /// Создание PictureBox по определенным параметрам
        /// </summary>
        /// <param name="n">Колличество квадратов</param>
        /// <returns>PictureBox</returns>
        public PictureBox CreatePictBox(Int32 n)
        {
            var pictBox = new PictureBox
                              {
                                  Size = new Size(200, 200)
                              };
            
            var carriage = false; // перенос указателя на новую строку (ниже)
            for(var i=0;i<n;i++)
            {
                for (var j = 0; j < n; j++)
                {
                    var brush = new SolidBrush(Color.Blue);
                    pictBox.CreateGraphics().FillRectangle(brush, Rect(carriage)); // рисуем синий квадратик
                    pictBox.Update();
                    brush.Dispose();
                    if(carriage)
                    {
                        carriage = false;
                    }
                    
                }
                carriage = true; // если закончился вложенный цикл меняем переменную определяющую перенос квадрата на новую строку
            }
            

            return pictBox;
        }

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


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Привет. Может он у тебя сливается с фоном просто?
Код

var pictBox = new PictureBox
            {
                Size = new Size(Width, Width),
                BackColor = Color.White // измени цвет
            };

У меня появляется все


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
wester
Дата 15.3.2010, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

private  Rectangle Rect(Boolean carriage)
        {
            var point = new Point(_x, _y);
       //     _points.Add(point);
            var rect = new Rectangle(point, new Size(_width, _width)); // cоздаем rectangle по изменным параметрам
            if (carriage)
            {
                _y += _width + 1; // опускаем указатель новой строки на строку вниз
            }
            _x += _width + 1;
            return rect;
        }

        /// <summary>
        /// Создание PictureBox по определенным параметрам
        /// </summary>
        /// <param name="n">Колличество квадратов</param>
        /// <returns>PictureBox</returns>
        public PictureBox CreatePictBox(Int32 n)
        {
            var pictBox = new PictureBox
                              {
                                  Size = new Size(200, 200),
                                  BackColor = Color.Black
                              };
            
            var carriage = false; // перенос указателя на новую строку (ниже)
            for(var i=0;i<n;i++)
            {
                for (var j = 0; j < n; j++)
                {
                    var brush = new SolidBrush(Color.Blue);
                    pictBox.CreateGraphics().FillRectangle(brush, Rect(carriage)); // рисуем синий квадратик
                    if(carriage)
                    {
                        carriage = false;
                    }
                    
                }
                carriage = true; // если закончился вложенный цикл меняем переменную определяющую перенос квадрата на новую строку
            }
            return pictBox;
        }

прописал backColor, теперь видеть проблему легче, но путь решения ее не могу найти. то есть синие квадраты не отрисовывываются
вот скрин того если вызвать метод CreatePictBox();
http://s51.radikal.ru/i132/1003/57/564fe5b51802.png
PM MAIL   Вверх
CYBERDREAM
Дата 16.3.2010, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



вот написал класс, в котором задаешь количество квадратов на каждой стороне, а он уже отрисует. Баги есть) но это уже дело техники.
Код

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace delWin
{
    public class MySquare:Control
    {
        private int _count;
        private readonly List<Brush> _brushes=new List<Brush>(1);

        public new int Width
        {
            get { return base.Width; }
            set { base.Height = base.Width = value; }
        }

        public new int Height
        {
            get { return base.Height; }
            set { base.Height = base.Width = value;}
        }
        
        public int Count
        {
            get { return _count; }
            set
            {
                if (_count == value)
                    return;
                if (_count < value)
                {
                    Random random=new Random();
                    for (int i = _count * _count; i < value * value; i++)
                        _brushes.Add(new SolidBrush(Color.FromArgb(random.Next(255), random.Next(255), random.Next(255))));
                }
                else
                    _brushes.RemoveRange(value * value, _count * _count - value * value);
                _count = value;
                Refresh();
            }
        }

        public MySquare()
        {
            Count = 1;
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);

            pe.Graphics.Clear(BackColor);
            int width = Width/Count;
            for(int q=0;q<Count;q++)
                for (int s = 0; s < Count; s++)
                    pe.Graphics.FillRectangle(_brushes[Count*q + s], q*width, s*width, width, width);
        }
    }
}



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
CYBERDREAM
Дата 16.3.2010, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



PictureBox думаю не нужен в качеств родителя


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
wester
Дата 18.3.2010, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



CYBERDREAM, 
ну я так понял что нужно отрисовывать в файле формы,
а как можно сделать в отдельном файле, что бы просто возвращал нужный PictureBox ?
вот я набросал код, если допустим у нас на форме есть обьект PictureBox с именем pictureBox2 то код создает два ряда красных маленьких квадратиков, по нажатию кнопки

Код

            x = 0;
            y = 0;
            for (var i = 0; i < 2; i++)
            {
                for (var k = 0; k < 10; k++)
                {
                    pictureBox2.CreateGraphics().FillRectangle(Brushes.Red, x, y, 13, 13);
                    x += 14;
                    Update();
                }
                x = 0;
                y += 14;
            }

а вот как такое создать в отдельном классе и просто получать нужный контрол по вызову метода ?
вот точно такой же код только в отдельном файле и получать я должен контрол по вызову метода CreateTest();
Код

public PictureBox createTest()
        {
            Int32 x, y;
            var pict = new PictureBox
                           {
                               BackColor = Color.AliceBlue,
                               Size = new Size(200, 200),
                               Location = new Point(0, 1),
                               Name = "pict",
                               TabIndex = 100,
                               TabStop = false
                           };
            x = 0;
            y = 0;
            for (var i = 0; i < 2; i++)
            {
                for (var k = 0; k < 10; k++)
                {
                    pict.CreateGraphics().FillRectangle(Brushes.Red, x, y, 13, 13);
                    x += 14;
                }
                x = 0;
                y += 14;
            }
            return pict;
        }

вызов из файла формы по нажатию кнопки;
Код

var ccs = new Square(14);
pictureBox2 = ccs.createTest();

контрол pictureBox2 я уже положил сам на форму
PM MAIL   Вверх
CYBERDREAM
Дата 19.3.2010, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Код

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace delWin
{
    public class MySquare:Control
    {
        protected MySquare()
        {

        }

public Static MySquare Instance
{
    get{return new MySquare();}
}
          
        private int _count;
        private readonly List<Brush> _brushes=new List<Brush>(1);

        public new int Width
        {
            get { return base.Width; }
            set { base.Height = base.Width = value; }
        }

        public new int Height
        {
            get { return base.Height; }
            set { base.Height = base.Width = value;}
        }
        
        public int Count
        {
            get { return _count; }
            set
            {
                if (_count == value)
                    return;
                if (_count < value)
                {
                    Random random=new Random();
                    for (int i = _count * _count; i < value * value; i++)
                        _brushes.Add(new SolidBrush(Color.FromArgb(random.Next(255), random.Next(255), random.Next(255))));
                }
                else
                    _brushes.RemoveRange(value * value, _count * _count - value * value);
                _count = value;
                Refresh();
            }
        }

        public MySquare()
        {
            Count = 1;
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);

            pe.Graphics.Clear(BackColor);
            int width = Width/Count;
            for(int q=0;q<Count;q++)
                for (int s = 0; s < Count; s++)
                    pe.Graphics.FillRectangle(_brushes[Count*q + s], q*width, s*width, width, width);
        }
    }
}


а чтобы уже создать таковой:
Код

 Control controlColored=MySquare.Instance; 
 //добавляешь на форму как обычно
 Controls.Add(controlColored);



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
wester
Дата 19.3.2010, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



CYBERDREAM, 
гм, я уже даже не знаю где искать у себя баги
вот создал отдельный класс MySquare
cкопировал в него твой код, но не появляется ничего)
там кстати 
Код

protected MySquare(){}

закоментил, так как уже определен чуть ниже

я уже даже не знаю что делать



и еще
вот в этом методе PictureBox создается!
но вот почему то квадратики не отрисовывает
Код

public PictureBox createTest()
        {
            Int32 x, y;
            var pict = new PictureBox
                           {
                               BackColor = Color.AliceBlue,
                               Size = new Size(200, 200),
                               Location = new Point(0, 1),
                               Name = "pict",
                               TabIndex = 100,
                               TabStop = false
                               
                           };
            x = 0;
            y = 0;
            for (var i = 0; i < 2; i++)
            {
                for (var k = 0; k < 10; k++)
                {
                    pict.CreateGraphics().FillRectangle(Brushes.Red, x, y, 13, 13);
                    x += 14;
                }
                x = 0;
                y += 14;
            }
            return pict;
        }


Это сообщение отредактировал(а) wester - 19.3.2010, 18:29
PM MAIL   Вверх
CYBERDREAM
Дата 20.3.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



надо метод OnPaint определить
вот проект, глянь

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  delWin.rar 222,06 Kb


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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