但是如何重写控件的OnPaint事件呢?比如说绘图是在PictureBox中绘制的,那么如何重写PictureBox的OnPaint事件?
我们无法直接在窗体的代码中重写控件的OnPaint事件,只能重写窗体的OnPaint事件。
重写控件的OnPaint事件,必须创建一个新的控件。这个控件继承Windows的控件,然后在创建的控件中重写控件的OnPaint事件。
以PictureBox为例:
//定义一个新的控件,继承PictureBox控件
public class myPictureBox : PictureBox
{
//自定义控件的构造函数
public myPictureBox()
//重写控件的OnPaint属性
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
//绘图
}
使用这种方法,就可以重写任何一个控件的OnPaint事件了。
本文是利用
C#
实现中国象棋的棋盘绘制,以及初始化布局,并不实现中国象棋的对弈逻辑。仅供学习参考使用。
绘制中国象棋棋盘,竖线九条,横线十条。再中间绘制‘楚河’,‘汉界’ 。
绘制棋子,然后将棋子布局在棋盘上即可。
涉及知识点:
用户
控件
:用于实现棋盘的绘制,
重写
On
Paint
(
Paint
EventArgs e)
方法
。
Matrix:封装表示几何变换的 3×3 仿射矩阵。本例中主要用于旋转绘制反方的‘汉界’。
GraphicsPath:表示一系列相互连接的直线和曲线。本例中主要用于绘制圆形棋子。
效果图如下:
棋盘核心代码如下:
对于.Net所写一般程序来说,都属于托管程序,内存的释放和回收是由Garbage Collector完成。但是相对于栈上内存操作而言,GC回收堆上的内存,会消耗更多的CPU时间,这方面的内容可以参看这篇文章。http://blog.csdn.net/knight94/archive/2006/08/05/1023352.aspx 因此如果让GC不停的释放和回收内存,会造成程序性能的下降
重写
On
Paint
方法
Overriding the On
Paint
Method03/30/2017本文内容
重写
.NET Framework 中定义的任何
事件
的基本步骤都是相同的,并且在以下列表中进行了总结。The basic steps for overriding any event defined in the .NET Framework are identical and are ...
入行已经7,8年了,一直想做一套漂亮点的自定义
控件
,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
欢迎前来交流探讨: 企鹅群5...
(一)重绘时候经常会用到On
Paint
()和
Paint
,它们有什么区别呢?
1.On
Paint
方法
是对一个
控件
来说的;而
Paint
事件
是对一个
控件
对象来说的。它们中前者相当于是类的一个成员函数,而后者相当于是类的一个函数指针类型的变量(会因对象的不同而不同)。
2.On
Paint
方法
引发
Paint
事件
,所以
重写
On
Paint
方法
,一定要调用base.On
Paint
,否则就不会引发
Paint
事件
了。On
Paint
原形应该类似以下形式(从中便可以看出):
1:具体实现如下:
原理:通过继承Button类,
重写
On
Paint
()
方法
,使用画笔工具重绘
控件
样式。
public
class
myButton : System.
Windows
.Forms.Button
大家在创建winform的时候,是不是很多时候都需要建立父窗体,然后再父窗体基础上添加子窗体,然后再单击
事件
的时候还有可能弹出好多的窗口,今天给大家带来有关panel
控件
福利。
Panel
控件
相当于在我们主窗体中添加了一个容器,通过这个容器把我们需要用的
控件
直接在这个容器中显示,当然也包括我们的窗体,这样每次单击
事件
就只有这一个窗体中的
控件
内容在变化。
(有关panel和子父窗体...
1 private Color _BorderColor = Color.Black;
3 [Browsable(true), Description("边框颜色"), Category("自定义分组")]
4 public Color Bo.
Invalidate()
一个
控件
应该什么时候绘制主要有两个 :
一个是 系统来确定 这个
控件
需要绘制 比如 最小化后在最大化 那么此时 系统会发出WM_
PAINT
消息来告知
控件
你需要重绘了
另一个就是 人为的调用this.Invalidate()或者this.Invalidate(Rectangle)来自己触发一次重绘
对于第一种 那是系统