public override void DrawFrame(Rectangle rect, FrameOptions opts = null)
        {
            var style    = opts?.Style ?? FrameStyle.Single;
            var rectOpts = new RectangleOptions
            {
                Attributes = opts?.Attributes ?? CharAttribute.None,
                Background = opts?.Background ?? CharColor.Black,
                Foreground = opts?.Foreground ?? CharColor.White
            };

            DrawRectangle(new Rectangle(rect.X + 1, rect.Y, rect.Width - 2, 1), Piece(FramePiece.Horizontal, style), rectOpts);
            DrawRectangle(new Rectangle(rect.X + 1, rect.Y + rect.Height - 1, rect.Width - 2, 1), Piece(FramePiece.Horizontal, style), rectOpts);
            DrawRectangle(new Rectangle(rect.X, rect.Y + 1, 1, rect.Height - 2), Piece(FramePiece.Vertical, style), rectOpts);
            DrawRectangle(new Rectangle(rect.X + rect.Width - 1, rect.Y + 1, 1, rect.Height - 2), Piece(FramePiece.Vertical, style), rectOpts);
            PutChar(new Point(rect.X, rect.Y), Piece(FramePiece.Bottom | FramePiece.Right, style), rectOpts.Foreground,
                    rectOpts.Background, rectOpts.Attributes);
            PutChar(new Point(rect.X + rect.Width - 1, rect.Y), Piece(FramePiece.Bottom | FramePiece.Left, style),
                    rectOpts.Foreground,
                    rectOpts.Background, rectOpts.Attributes);
            PutChar(new Point(rect.X, rect.Y + rect.Height - 1), Piece(FramePiece.Top | FramePiece.Right, style),
                    rectOpts.Foreground,
                    rectOpts.Background, rectOpts.Attributes);
            PutChar(new Point(rect.X + rect.Width - 1, rect.Y + rect.Height - 1),
                    Piece(FramePiece.Top | FramePiece.Left, style),
                    rectOpts.Foreground, rectOpts.Background, rectOpts.Attributes);
        }
 public abstract void DrawFrame(Rectangle rect, FrameOptions opts = null);