使用ControlPaint.DrawBorder绘制WinForm控件边框仅显示左上边框求助
解决WinForm自定义绘制仅显示顶部和左侧边框的问题
嘿,我之前也碰到过一模一样的问题!你这个情况几乎可以肯定是绘制矩形的范围没把控好,导致右侧和底部边框被控件的可视区域裁剪掉了。给你几个实测有效的解决思路:
最直接的修复:调整绘制矩形的尺寸
ClientRectangle的右下角坐标是(ClientSize.Width, ClientSize.Height),而ControlPaint.DrawBorder绘制1像素边框时,会从这个坐标点向外延伸,直接超出了控件的可视范围,所以右侧和底部边框就被裁掉了。你只需要把矩形的宽高各减1像素,就能让边框完全显示在控件内:
private void PaintLines(object sender, PaintEventArgs e) { var control = sender as Control; if (control == null) return; // 调整矩形范围,避免边框被控件可视区域裁剪 var borderRect = new Rectangle(0, 0, control.ClientSize.Width - 1, control.ClientSize.Height - 1); ControlPaint.DrawBorder(e.Graphics, borderRect, Color.Gray, 1, ButtonBorderStyle.Solid, Color.Gray, 1, ButtonBorderStyle.Solid, Color.Gray, 1, ButtonBorderStyle.Solid, Color.Gray, 1, ButtonBorderStyle.Solid); }
其他可能的排查点
- 检查控件的DoubleBuffered属性:把它设为
true,既能避免绘制时的闪烁,也能减少一些奇怪的绘制覆盖问题。 - 避免默认绘制覆盖:如果是在自定义控件中重写
OnPaint方法,不要调用base.OnPaint(e)(除非你需要保留默认绘制);如果是绑定已有控件的Paint事件,确保事件注册正确(比如在Form的Load事件里添加yourControl.Paint += PaintLines;)。 - 排查Padding设置:如果控件的
Padding属性值不为空,会压缩ClientRectangle的可用区域,导致边框被挤出去。可以先把Padding设为Padding.Empty测试一下。
先试试第一个调整矩形的方法,应该马上就能看到四个边框都正常显示了!
内容的提问来源于stack exchange,提问作者AmiralPatate
相关产品推荐
相关产品推荐

