认知尚浅,如有错误,愿闻其详!
概述
初识Graphics绘图时走了很多弯路,很多时候根据网上的教程完成了绘制,却因项目的需求上遇上了各种问题,导致达不到自己需要的效果。而且对于Graphics的绘制过程及机制上不了解,很大程度遇到问题就懵逼了!
其实利用Graphics绘制一个图形很简单,容易出现问题的是在于你画了之后他什么时候被销毁了,什么时候该重绘。这两个处理不好,就是突然消失了,或者是浪费资源。
我遇到的问题
在我的工作中,我需要在Panel中使用Graphics绘制几条线,来形成一个矩形简单表格,将内容包括起来,便于查看。可是在窗口初始加载后显示正常,但在切换窗口后却消失了。效果如下:
![](https://img.haomeiwen.com/i11467412/d9c934ddabd8bd09.png)
实现
实现上很简单,一般绘制都是在重写OnPaint中去实现绘制。代码如下:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
//画方框
int width_P = panel_Left.Size.Width;//宽
int height_P = panel_Left.Size.Height;//高
int topSpace = 100;//线上边距
int botSpace = 40;//线上边距
int leftSpace = 9;//线左右边距
int rowSpace = 30;//行距
Pen pen = new Pen(Color.Black, 2f);
Pen pen_1 = new Pen(Color.Black, 1.5f);//创建画笔
using (Graphics g = panel_Left.CreateGraphics())//使用using括起来,绘制完成立即销毁
{
//开始绘制图形
g.DrawLine(pen, new Point(leftSpace, topSpace), new Point(width_P - leftSpace, topSpace));//上下
g.DrawLine(pen, new Point(leftSpace, height_P - botSpace), new Point(width_P - leftSpace, height_P - botSpace));
g.DrawLine(pen_1, new Point(leftSpace, topSpace + rowSpace), new Point(width_P - (leftSpace + 1), topSpace + rowSpace));//上下
g.DrawLine(pen_1, new Point(leftSpace, height_P - (botSpace + rowSpace)), new Point(width_P - (leftSpace + 1), height_P - (botSpace + rowSpace)));
g.DrawLine(pen_1, new Point(leftSpace, height_P - (botSpace + rowSpace * 2)), new Point(width_P - (leftSpace + 1), height_P - (botSpace + rowSpace * 2)));
g.DrawLine(pen, new Point(leftSpace + 1, topSpace), new Point(leftSpace + 1, height_P - botSpace));//左右
g.DrawLine(pen, new Point(width_P - (leftSpace + 1), topSpace), new Point(width_P - (leftSpace + 1), height_P - botSpace));
}
}
但是,意想不到的是在窗口初始化后能正常显示,而在切换窗口时,绘制的横线却消失了。
当时也大概了解起因是应为窗体在切换后被重绘了,图像被覆盖住了,导致看不见了。
后来,我也尝试的去单步调试,在窗口获得焦点后,重绘时,OnPaint并没有被执行,所以得到以下方法:
private void Frm_SettlementMsg_Activated(object sender, EventArgs e)
{
//将整个窗口设置为无效,致触发重绘
this.Invalidate();
}
强制性的在窗口处于激活状态时执行刷新窗口,触发重绘,进而触发重新绘制图形。
网友评论