Как добавить матрицу OvalShapes в окно? - PullRequest
0 голосов
/ 29 марта 2012

Я хочу нарисовать матрицу 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 ]

2 голосов
/ 24 сентября 2012

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

        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);
1 голос
/ 29 марта 2012

С MSDN :

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

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

        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);              
        }
0 голосов
/ 29 марта 2012

Первое упрощение

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
}

Очень общий код, но только для того, чтобы дать вам идею.

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

...