前言:

在项目或者学习过程中我们经常会使用到C#自带的GDI绘图技术,
在我之前几篇文章里也有用到绘图技术
画五角星

基本步骤:

  • 创建Graphics对象
  • 创建Pen对象
  • 调用Graphics类中封装的绘制方法(绘制直线,曲线,圆)

问题:

在前一篇文章中贪吃蛇V1.0
我想给游戏界面添加网格线,让界面看起来舒服。
然而在这过程中我遇到了问题

  • 我最开始的思路为在Form1的load事件中为窗体绘制网格线
    网格线的绘制代码,如下:
            int col = 50;int row = 50;int drawRow = 0;int drawCol = 0;Pen black = new Pen(Color.Gray, 1);Graphics g = this.CreateGraphics();for (int i = 0; i <= row; i++){g.DrawLine(black, 0, drawCol, 500, drawCol);drawCol += 10;}// 画垂直线for (int j = 0; j <= col; j++){g.DrawLine(black, drawRow, 0, drawRow, 500);drawRow += 10;}

但是当我运行Form1的时候发现窗体中并没有出现网格线,我反复检查我的代码发现并没有问题,

问题原因:

   Form_Load事件是在窗体首次显示时发生的。
也就是说,在Form_Load过程中,这个Form里所有需要在屏幕上呈现的东西都还没开始绘制,所以你在Load中去绘制东西是看不到的。在Windows系统中,窗体的Load事件执行完毕后,系统才开始绘制窗体并显示在屏幕上。
  其实,只有当Form_Load方法执行完后,我们才能看见窗体。
  当Form_Paint方法执行完后才显示出我们想要绘制的完整的图形。并且窗体Repaint后,窗体的Graphics就被清空了。每次刷新的时候都需要绘制,在窗体Load也会刷新。

解决方法:

所以,在为窗体初始化的过程中绘制网格线,就得在窗体的Paint事件中创建Graphics对象,
方法为:
- 通过调用窗体的CreateGraphics方法来获取对Graphics对象的引用;

        private void Form1_Paint(object sender, PaintEventArgs e){Graphics g = this.CreateGraphics();}
  • 通过在窗体的Paint事件中创建,将其作为PaintEventArgs的一部分
        private void Form1_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;}

总结:

就是不要将为窗体绘制网格的代码,放在From_Load事件中,要放在Form_Paint事件中

补充:

创建Graphics对象的方法,除了上述两种外还有一种:
由从Image继承的如何对象创建Graphics对象

        private void Form1_Load(object sender, EventArgs e){Bitmap bitmap  = new Bitmap(@"C:\is.bmp");Graphics g = Graphics.FormImage(bitmap);}

WinForm中绘制网格线,Load和Piant事件区别相关推荐

  1. C# WinForm中Form的load和Shown事件

    假设当前界面为Form1,则load事件是在Form1显示之前发生并执行的:然后Form1显示出来,此时会引发Shown事件的发生: load比shown触发的更早: load在第一次显示窗体前发生, ...

  2. Winform 中panel的mousewheel鼠标滚轮事件触发

    如果将窗体或容器控件(如Panel控件)的AutoScroll属性设置为True时,那么当窗体或Panel容不下其中的子控件时就会出现 滚动条,通过移动滚动条可以上下显示出窗体或Panel中的全部内容 ...

  3. jQuery中ready与load事件的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. jQuery中ready与load事件的区别 概述: 大家在工作中用jQuery的时候一定会在使用之 ...

  4. 怎样正确处理WinForm中Listview的ItemCheck事件

    我很少写具体的对象应用心得,这次尝试一下. WinForm中Listview的ItemCheck事件,例子如下:   private void lvwTables_ItemCheck(object s ...

  5. Winform中怎样重写窗体关闭事件实现验证密码通过才能关闭窗体

    场景 需要在Winform中执行一些定时器,需要该窗体一直开启,防止因点击窗体的关闭误操作.所以需要在点击叉号进行关闭时验证一个密码,密码正确则允许关闭,否则不允许关闭. 效果如下: 注: 博客: B ...

  6. winform中键盘和鼠标事件的捕捉和重写(转)

    在 编写winform应用程序时,有时需要无论在哪个控件获取焦点时,对某一个键盘输入或者鼠标事件都进行同样的操作.比如编写一个处理图片的应用程序时, 希望无论当前哪个控件获得焦点,当用户按上.下.左. ...

  7. 在Paint事件中绘制控件(边框)

    在Paint事件中绘制控件(边框) 单纯的自己记录,将来会继续添加,侥幸被大家发现了的话请不要太鄙视... private void panel4_Paint(object sender, Paint ...

  8. Winform中实现双击Dev的TreeList在ZedGraph中生成对应颜色的曲线

    场景 首先要实现的效果如下 在实现上面的效果前参照下面的博客 DevExpress的TreeList怎样设置数据源使其显示成单列树形结构: https://blog.csdn.net/BADAO_LI ...

  9. Winform中DataGridView设置前景色、单元格背景色、标题栏样式、禁止改变高宽、不显示空白行、清除选中样式、填充数据源、设置标题、设置单列宽度

    场景 Winform中使用DataGridView实现加载数据并显示在led大屏中. 需要设置整个DataGridView的前景色.背景色.单元格颜色.标题栏样式.禁止 改变行高.列宽.不显示新增行. ...

最新文章

  1. linux下c md5函数
  2. Dubbo 源码分析 - 服务引用
  3. cannot find or load main class org.apache.flink.api.scala.FlinkShell
  4. 工作131:根据请求返回报错
  5. 首次结算和汇总不一致
  6. win服务器自动发邮件,asp.net基于windows服务实现定时发送邮件的方法
  7. 《Windows 8 权威指南》——2.10 几招解决Windows 8 Metro应用打不开的问题
  8. Nginx资源合并优化模块nginx-http-concat
  9. jquery uploadify 避免jquery.uploadify.min.js 文件多次引用导致只有最后一个才能上传
  10. ISTP会议论文检索
  11. 你好Haskell (1) 环境搭建和简单玩玩
  12. 对学术不怎么热爱,只想当大学老师而去读博可以么?
  13. 项目开发过程中遇到的问题和解决方法
  14. python获取交换机信息
  15. MATLAB resample()函数
  16. 第8天-信息收集——站点搭建,WAF等
  17. 自签名证书和CA机构颁发的证书的区别
  18. 云原生数据库整体架构和典型示例
  19. 工程项目管理软件下载
  20. 使用Docker 镜像

热门文章

  1. 推荐系统从入门到接着入门
  2. python自动化测试学习笔记合集
  3. linux固态硬盘检测,linux 检查硬盘是 SSD or HDD
  4. 人大金仓windows 10 安装闪退,改绿色安装方法,
  5. 细说安装php的webp文件格式支持
  6. mq java 开发_MQ java 基础编程(一)
  7. Android av sync机制
  8. 使用Charles做弱网测试入门篇
  9. Html5 Egret游戏开发 成语大挑战(九)设置界面和声音管理
  10. 详解文件存储空间管理中的位示图法