美文网首页
使用Graphics绘制图形(窗口切换绘图消失)

使用Graphics绘制图形(窗口切换绘图消失)

作者: Memoyu | 来源:发表于2019-08-28 15:39 被阅读0次

认知尚浅,如有错误,愿闻其详!

概述

   初识Graphics绘图时走了很多弯路,很多时候根据网上的教程完成了绘制,却因项目的需求上遇上了各种问题,导致达不到自己需要的效果。而且对于Graphics的绘制过程及机制上不了解,很大程度遇到问题就懵逼了!
  其实利用Graphics绘制一个图形很简单,容易出现问题的是在于你画了之后他什么时候被销毁了,什么时候该重绘。这两个处理不好,就是突然消失了,或者是浪费资源。

我遇到的问题

  在我的工作中,我需要在Panel中使用Graphics绘制几条线,来形成一个矩形简单表格,将内容包括起来,便于查看。可是在窗口初始加载后显示正常,但在切换窗口后却消失了。效果如下:


绘制.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();
        }

强制性的在窗口处于激活状态时执行刷新窗口,触发重绘,进而触发重新绘制图形。

相关文章

网友评论

      本文标题:使用Graphics绘制图形(窗口切换绘图消失)

      本文链接:https://www.haomeiwen.com/subject/qarpectx.html