Как добавить матрицу OvalShapes в окно?

Я хочу нарисовать матрицу 16*64, каждая из которых содержит:

Microsoft.VisualBasic.PowerPacks.OvalShape,

Я использовал это:

List<Microsoft.VisualBasic.PowerPacks.OvalShape> ovalShape = 
    new List<Microsoft.VisualBasic.PowerPacks.OvalShape>();

for (int i = 0; i < 16; i++)
{
    for (int j = 0; j < 64; j++)
    {
        OvalShape ovl = new OvalShape();
        ovl.Width = 20;
        ovl.Height = 20;
        ovl.FillStyle = FillStyle.Solid;
        ovl.FillColor = Color.Green;

        ovalShape.Add(ovl);
    }
}

Как я могу показать это в окне?

3 ответа

Создание отдельного контейнера для каждой фигуры не требуется. Также вы можете пропустить дополнительный список контейнеров для фигур. Таким образом, вы можете использовать этот очень компактный код.

        var ovalShapes = new Microsoft.VisualBasic.PowerPacks.ShapeContainer()
        {
            Dock = DockStyle.Fill,
            Margin = new Padding(0),
            Padding = new Padding(0),
        };
        for (int i = 0; i < 16; i++)
            for (int j = 0; j < 64; j++)
                ovalShapes.Shapes.Add(
                    new Microsoft.VisualBasic.PowerPacks.OvalShape()
                    {
                        Width = 20,
                        Height = 20,
                        FillStyle = Microsoft.VisualBasic.PowerPacks.FillStyle.Solid,
                        FillColor = Color.Green,
                        Location = new Point(20 * i, 20 * j),
                    });
        this.Controls.Add(ovalShapes);

Из MSDN:

Элемент управления OvalShape не может быть отображен непосредственно в форме или элементе управления контейнера; он должен содержаться в объекте ShapeContainer. После того, как вы инициализируете OvalShape, вам нужно будет установить его свойство Parent либо в существующий ShapeContainer, либо в новый экземпляр ShapeContainer.

Попробуйте установить местоположение и добавить свои элементы управления в форму:

        List<Microsoft.VisualBasic.PowerPacks.OvalShape> ovalShape = new List<Microsoft.VisualBasic.PowerPacks.OvalShape>();

        for (int i = 0; i < 16; i++)
        {
            for (int j = 0; j < 64; j++)
            {
                OvalShape ovl = new OvalShape();
                ovl.Width = 20;
                ovl.Height = 20;
                ovl.FillStyle = FillStyle.Solid;
                ovl.FillColor = Color.Green;

                ovl.Location = new Point(ovl.Width*i, ovl.Height*j);

                ovalShape.Add(ovl);
            }
        }

        foreach(OvalShape os in ovalShape)
        {
              Microsoft.VisualBasic.PowerPacks.ShapeContainer shapeContainer = new Microsoft.VisualBasic.PowerPacks.ShapeContainer();
              Control c = new Control();
              shapeContainer.Parent = c;
              os.Parent = shapeContainer;
              myForm.Controls.Add(c);              
        }

Сначала упростить

int totalCount = 1024; //16*64
const int shapeWidth  =20;
const int shapeHeight = 20;

for (int j = 0; j < totalCount; j++)
{
   OvalShape ovl = new OvalShape();
   ovl.Width = shapeWidth;
   ovl.Height = shapeHeight;
   ovl.FillStyle = FillStyle.Solid;
   ovl.FillColor = Color.Green;

   ovalShape.Add(ovl);
}

После выбора вашей области рисования и решите, сколько фигур в строке вы хотели бы иметь. Так что некоторый гипотетический код может выглядеть так:

int shapesPerRowCount = 5;
int yPos = 0;

for(int i=0;i<ovalShape.Count;i++)
{
  if(i % shapesPerRowCount  == 0) //reach end of the row, so offset Y position by Height
     yPos += shapeHeight; 

  int xPos = i*shapeWidth;
  DrawShapeAtPos(ovalShape[i], xPos, yPos); //some special function that draws the shape
}

Очень общий код, но просто чтобы дать вам идею.

Если это не то, что вы ищете, пожалуйста, уточните.

Другие вопросы по тегам