【问题标题】:Can rectangle be split in rows and columns?矩形可以分成行和列吗?
【发布时间】:2014-12-06 10:13:37
【问题描述】:
          private void panel1_Paint(object sender, PaintEventArgs e)
    {
        Pen mypen = default(Pen);
        mypen = new Pen(System.Drawing.Color.Red, 3);
        mypen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
        //For Dash Line in Rectangle 
        Pen mypen1 = default(Pen);
        mypen1 = new Pen(System.Drawing.Color.Blue, 1);
        mypen1.DashStyle![enter image description here][2] = System.Drawing.Drawing2D.DashStyle.Dash;

        //Pen mypen2 =default(Pen);
        //mypen2 = new Pen(System.Drawing.Color.Yellow, 3);
        //mypen2.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;

        //Pen mypen3 = default(Pen);
        //mypen3 = new Pen(System.Drawing.Color.Violet, 1);
        //mypen3.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;

        L1 = Rect1LT.X + 5;
        T1 = Rect1LT.Y + 5;
        W1 = Rect1RB.X - Rect1LT.X;
        H1 = Rect1RB.Y - Rect1LT.Y;


        e.Graphics.DrawRectangle(mypen, new System.Drawing.Rectangle(L1, T1, W1, H1));
        e.Graphics.DrawRectangle(mypen1, new System.Drawing.Rectangle(L1, T1, W1, H1));

        e.Graphics.DrawRectangle(Pens.Blue, new System.Drawing.Rectangle(Rect1LT.X, Rect1LT.Y, 10, 10));
        e.Graphics.DrawRectangle(Pens.Blue, new System.Drawing.Rectangle(Rect1RT.X, Rect1RT.Y, 10, 10));
        e.Graphics.DrawRectangle(Pens.Blue, new System.Drawing.Rectangle(Rect1LB.X, Rect1LB.Y, 10, 10));
        e.Graphics.DrawRectangle(Pens.Blue, new System.Drawing.Rectangle(Rect1RB.X, Rect1RB.Y, 10, 10));

        e.Graphics.FillRectangle(Brushes.Blue, Rect1LT);
        e.Graphics.FillRectangle(Brushes.Blue, Rect1RT);
        e.Graphics.FillRectangle(Brushes.Blue, Rect1LB);
        e.Graphics.FillRectangle(Brushes.Blue, Rect1RB);

        e.Graphics.DrawRectangle(Pens.Blue, new System.Drawing.Rectangle(Rect1T.X, Rect1T.Y, 10, 10));
        e.Graphics.DrawRectangle(Pens.Blue, new System.Drawing.Rectangle(Rect1R.X, Rect1R.Y, 10, 10));
        e.Graphics.DrawRectangle(Pens.Blue, new System.Drawing.Rectangle(Rect1B.X, Rect1B.Y, 10, 10));
        e.Graphics.DrawRectangle(Pens.Blue, new System.Drawing.Rectangle(Rect1L.X, Rect1L.Y, 10, 10));

        e.Graphics.FillRectangle(Brushes.Blue, Rect1T);
        e.Graphics.FillRectangle(Brushes.Blue, Rect1R);
        e.Graphics.FillRectangle(Brushes.Blue, Rect1B);
        e.Graphics.FillRectangle(Brushes.Blue, Rect1L);

        DataGridView dg1 = new DataGridView();


        //while (!exit)
        //{
        //    var time = GetTime();
        //    Update(time);
        //    Render(time);
        //}


    }

我想在行和列中划分矩形并且行和列的大小可以在运行时更改?并且行数和列数也可以改变吗?我不想拆分整个矩形,我只想将它们分成矩形。

【问题讨论】:

  • 你的代码应该做什么?变量 Rect1T、Rect1B、Rect1L、Rect1R 中存储了哪些值?
  • 当然你可以这样做,但是你需要两个循环,并且需要根据你的输入计算矩形参数。你的代码似乎只使用了 4 个硬编码的矩形。
  • 我在简单背景的面板上绘制矩形。我希望将该矩形分成几个单元格,如数据网格视图中的单元格。
  • 您的问题现在解决了吗?
  • 是的,亲爱的,谢谢你,已经解决了......

标签: c# image-processing graphics drawing rectangles


【解决方案1】:

这是一个简化的例子:

int cols = 7; int rows = 11;

private void panel1_Paint(object sender, PaintEventArgs e)
{
    Rectangle Rect = // your Rectangle!

    Rectangle pRect = Rect;  // panel2.ClientRectangle;
    float width = 1f * pRect.Width / cols;
    float height = 1f * pRect.Height / rows;

    using (Pen pen = new Pen(System.Drawing.Color.Blue, 1))
    {
      pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;

      for (int c = 0; c < cols; c++)
         for (int r = 0; r < rows; r++)
         {
            RectangleF rect = new RectangleF(pRect.X + c * width, pRect.Y + r * height, 
                                             width, height);
            e.Graphics.FillRectangle(Brushes.Coral, rect);
            // e.Graphics.DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);
         }

        for (int c = 0; c < cols; c++) e.Graphics.DrawLine(pen, 
             pRect.X + c * width, pRect.Y, pRect.X + c * width, pRect.Y + pRect.Height);
        for (int r = 0; r < rows; r++) e.Graphics.DrawLine(pen, 
             pRect.X, pRect.Y + r * height, pRect.X + pRect.Width, pRect.Y + r * height);
        e.Graphics.DrawRectangle(Pens.Red, 
                                 pRect.X, pRect.Y, pRect.Width - 1, pRect.Height - 1);

    }
}

注意一些变化:

  • 边框颜色和填充颜色不能相同。
  • 必须先填充,否则会覆盖边框
  • 我使用浮动来完全填充面板;如果 cols 和 rows 没有均匀地划分为面板/矩形大小,则矩形的大小将不会都相同..
  • 一开始我忽略了你的DashStyle。如果你想拥有DashStyle,你必须彻底改变你的计划!原因是,如果你在网格中绘制矩形,你..

    • ..要么让它们重叠,然后破折号就会相互干扰。有一个DashOffset 参数,但我认为它不能被扭曲以使其适用于任何网格。

    • ..或者您需要在网格单元格内绘制矩形,但它们的厚度会是原来的两倍,而且图案仍然会相互干扰。

相反,您只需如图所示仅绘制几条线!

这是我的破折号示例:

【讨论】:

  • 你这是什么意思?
  • 你为 Panel 做了这个,但我想把这个拆分工作变成 Rectangle。我想要矩形中的单元格,就像我们在数据网格视图中一样。
  • 谢谢亲爱的。工作得很好,但有什么办法可以让这个动态。可在运行时调整大小?
  • 因为这一切都发生在 Paint 事件 ii 已经是动态的。您需要做的就是更改 cols、rows 或 Rectangle 的值,然后调用 panel1.Invalidate()..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 2016-08-23
  • 2018-12-03
  • 1970-01-01
  • 2021-07-06
相关资源
最近更新 更多