在dotnet中开发控件(三)
老实说,把msdn研究完,发现一个事实,在vs 2005中继承一个已有控件进行进行扩展很简单,哪怕什么设计时的问题也容易解决。
其实最郁闷的问题还是自绘控件的问题。本来我想去DevExpress的代码中找出点蛛丝马迹来,但是,DevExpress的代码实在嵌套层次太多了。加上我逆向工程没有得到类图。郁闷得不得了。搞了半天,搞了个半成品。代码如下:
namespace DevApp
{
[ToolboxItem(true),DesignerCategory("tianmo")]
public partial class MyTextBox : System.Windows.Forms.TextBox
{
public MyTextBox()
{
InitializeComponent();
this.SetStyle(ControlStyles.UserPaint, true);
this.BorderStyle = BorderStyle.None;
}
protected override void OnPaint(PaintEventArgs pe)
{
// TODO: 在此处添加自定义绘制代码
Graphics g = pe.Graphics;
//g.DrawRectangle(new Pen(System.Drawing.Color.Red,0.5f), new Rectangle(0, 0, this.Width-1, this.Height-1));
ControlPaint.DrawBorder(g, new Rectangle(0, 0, this.Width - 1, this.Height - 1), System.Drawing.Color.Red, ButtonBorderStyle.Solid);
// 调用基类 OnPaint
base.OnPaint(pe);
}
}
}
本来,只重载个OnPaint一点效果都没有,多亏大侠支持,才晓得要SetStyle,还要把BorderStyle设为None。不然,不用。但是,就是如此,还有大问题。
有人推荐不要重载OnPaint方法。在WndProc方法中推截消息比较好。我试了,代码如下:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case Win32Helper.WM_NCPAINT:
case Win32Helper.WM_PAINT:
{
Graphics g = this.CreateGraphics();
Rectangle rc = this.ClientRectangle;
rc.Height = rc.Height - 1;
rc.Width = rc.Width - 1;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.DrawRectangle(new Pen(System.Drawing.Color.Red, 1), rc);
break;
}
}
}
在dotnet中开发控件(三)其中Win32Helper是我在网上找的一位大侠写的类,里面封装了所有的关于窗体、控件的消息。蛮有用的。但是,用这种方法,我仍然没能解决问题。