2012-03-28 62 views
0

我想绘制16 * 64的矩阵,每个包含一个:如何将OvalShapes矩阵添加到窗口中?

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); 
    } 
} 

我怎样才能显示它的窗口?

+1

绑定到窗体的Drawing事件,获取窗体的Graphics库并开始绘制? – 2012-03-28 20:41:14

+0

我不认为这将起作用。你不需要存储这个位置,你需要一个多维的数组来开始......列表不会去做诡计 – 2012-03-28 20:42:09

+0

@Justin是的,你是对的,但是他可以使用'i'和'j'来设置位置。 – 2012-03-28 20:51:45

回答

1

MSDN

的OvalShape控制不能在窗体或 容器控制直接显示;它必须包含在ShapeContainer对象中。 初始化一个OvalShape后,您必须将其父项 属性设置为现有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);    
     } 
+0

谢谢,我认为它会起作用。但我坚持一个愚蠢的问题。 – 2012-03-28 21:24:35

+0

我不明白在哪里创建对象myForm? 我想在构造函数中完成整个过程。 – 2012-03-28 21:31:11

+0

谢谢Fuex ...它的工作... 我刚刚使用this.Controls.Add(c); – 2012-03-28 21:54:10

0

首先简化

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 
} 

一个非常通用的代码,而只是给你提供一种思路。

如果这不是你正在寻找的,请澄清。

2

不需要为每个形状创建单独的容器。你也可以跳过形状的附加容器列表。所以你可以使用这个非常紧凑的代码。

 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);