面板的两个边框

时间:2015-10-12 16:42:25

标签: c# winforms

我已完成以下操作,但整个面板双边框未正确填充的问题。 //内边框的右下线不是彩绘的 目标控件是面板

protected override void OnPaint(PaintEventArgs pe)
    {
        using (SolidBrush brush = new SolidBrush(BackColor))
            pe.Graphics.FillRectangle(brush, this.Bounds);

        // Inner Border
        pe.Graphics.DrawRectangle(new Pen(Color.FromArgb(_InnerBorderColor.R, _InnerBorderColor.B, _InnerBorderColor.G), 1.0f), 1, 1, ClientSize.Width - 1, ClientSize.Height - 1);
        using (SolidBrush brush = new SolidBrush(BackColor))
            pe.Graphics.FillRectangle(brush, this.Bounds);

        // Main Border
        pe.Graphics.DrawRectangle(new Pen(Color.FromArgb(_BorderColor.R, _BorderColor.B, _BorderColor.G), 1.0f), 0, 0, ClientSize.Width - 1, ClientSize.Height - 1);
    }

这就是我得到的 enter image description here

这就是我需要的东西 enter image description here

被修改

3 个答案:

答案 0 :(得分:2)

你应该使用这个坐标:

e.Graphics.DrawRectangle(pen1, 
    this.ClientRectangle.Left, this.ClientRectangle.Top,
    this.ClientRectangle.Width - 1, this.ClientRectangle.Height - 1);
e.Graphics.DrawRectangle(pen2, 
    this.ClientRectangle.Left + 1, this.ClientRectangle.Top + 1,
    this.ClientRectangle.Width - 3, this.ClientRectangle.Height - 3);

注意:

  • 对于外部矩形,您应该从原始宽度和高度中减去-1以显示
  • 要绘制内部矩形,您应该从1,1绘制,因此宽度和高度将比外部宽度和高度小2点,并且由于外部宽度和高度是原始宽度和高度-1,因此您需要减去 - 3原始宽度和高度。

答案 1 :(得分:2)

你有多个错误。使用Bounds是错误的,即在父坐标中,使用DisplayRectangle。你绘制背景两次,既不必要,第二次覆盖内部矩形。你绘制内部矩形两个像素太大。你忘记丢弃笔了,你往往会侥幸逃脱它,但是当你不这样做的时候,就会非常难看。最后但并非最不重要的是,这应该在OnPaintBackground中完成,因此它不会像便宜的汽车旅馆那样闪烁。

绘画错误并不容易诊断,最好的方法是逐步增加,一次一个。

更正后的代码如下:

protected override void OnPaintBackground(PaintEventArgs pe) {
    base.OnPaintBackground(pe);
    // Inner Border
    using (var pen = new Pen(_InnerBorderColor))
        pe.Graphics.DrawRectangle(pen, 1, 1, ClientSize.Width - 3, ClientSize.Height - 3);
    // Main Border
    using (var pen = new Pen(_BorderColor))
        pe.Graphics.DrawRectangle(pen, 0, 0, ClientSize.Width - 1, ClientSize.Height - 1);
}

答案 2 :(得分:0)

您需要从Client.Width / Height

中减去2
pe.Graphics.DrawRectangle(new Pen(Color.FromArgb(_InnerBorderColor.R, _InnerBorderColor.B, _InnerBorderColor.G), 1.0f), 1, 1, ClientSize.Width - 2, ClientSize.Height - 2);