WinForm中绘制网格线,Load和Piant事件区别
前言:
在项目或者学习过程中我们经常会使用到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事件区别相关推荐
- C# WinForm中Form的load和Shown事件
假设当前界面为Form1,则load事件是在Form1显示之前发生并执行的:然后Form1显示出来,此时会引发Shown事件的发生: load比shown触发的更早: load在第一次显示窗体前发生, ...
- Winform 中panel的mousewheel鼠标滚轮事件触发
如果将窗体或容器控件(如Panel控件)的AutoScroll属性设置为True时,那么当窗体或Panel容不下其中的子控件时就会出现 滚动条,通过移动滚动条可以上下显示出窗体或Panel中的全部内容 ...
- jQuery中ready与load事件的区别
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. jQuery中ready与load事件的区别 概述: 大家在工作中用jQuery的时候一定会在使用之 ...
- 怎样正确处理WinForm中Listview的ItemCheck事件
我很少写具体的对象应用心得,这次尝试一下. WinForm中Listview的ItemCheck事件,例子如下: private void lvwTables_ItemCheck(object s ...
- Winform中怎样重写窗体关闭事件实现验证密码通过才能关闭窗体
场景 需要在Winform中执行一些定时器,需要该窗体一直开启,防止因点击窗体的关闭误操作.所以需要在点击叉号进行关闭时验证一个密码,密码正确则允许关闭,否则不允许关闭. 效果如下: 注: 博客: B ...
- winform中键盘和鼠标事件的捕捉和重写(转)
在 编写winform应用程序时,有时需要无论在哪个控件获取焦点时,对某一个键盘输入或者鼠标事件都进行同样的操作.比如编写一个处理图片的应用程序时, 希望无论当前哪个控件获得焦点,当用户按上.下.左. ...
- 在Paint事件中绘制控件(边框)
在Paint事件中绘制控件(边框) 单纯的自己记录,将来会继续添加,侥幸被大家发现了的话请不要太鄙视... private void panel4_Paint(object sender, Paint ...
- Winform中实现双击Dev的TreeList在ZedGraph中生成对应颜色的曲线
场景 首先要实现的效果如下 在实现上面的效果前参照下面的博客 DevExpress的TreeList怎样设置数据源使其显示成单列树形结构: https://blog.csdn.net/BADAO_LI ...
- Winform中DataGridView设置前景色、单元格背景色、标题栏样式、禁止改变高宽、不显示空白行、清除选中样式、填充数据源、设置标题、设置单列宽度
场景 Winform中使用DataGridView实现加载数据并显示在led大屏中. 需要设置整个DataGridView的前景色.背景色.单元格颜色.标题栏样式.禁止 改变行高.列宽.不显示新增行. ...
最新文章
- linux下c md5函数
- Dubbo 源码分析 - 服务引用
- cannot find or load main class org.apache.flink.api.scala.FlinkShell
- 工作131:根据请求返回报错
- 首次结算和汇总不一致
- win服务器自动发邮件,asp.net基于windows服务实现定时发送邮件的方法
- 《Windows 8 权威指南》——2.10 几招解决Windows 8 Metro应用打不开的问题
- Nginx资源合并优化模块nginx-http-concat
- jquery uploadify 避免jquery.uploadify.min.js 文件多次引用导致只有最后一个才能上传
- ISTP会议论文检索
- 你好Haskell (1) 环境搭建和简单玩玩
- 对学术不怎么热爱,只想当大学老师而去读博可以么?
- 项目开发过程中遇到的问题和解决方法
- python获取交换机信息
- MATLAB resample()函数
- 第8天-信息收集——站点搭建,WAF等
- 自签名证书和CA机构颁发的证书的区别
- 云原生数据库整体架构和典型示例
- 工程项目管理软件下载
- 使用Docker 镜像