- 积分
- 40165
- 好友
- 记录
- 主题
- 帖子
- 听众
- 收听
|
C#皮肤-用户控件EnterUserControl的实现
导读部分
-------------------------------------------------------------------------------------------------------------
C#皮肤-实现原理系列文章导航
http://www.sufeinet.com/thread-2-1-1.html
最过忙坏了,呵呵,费话不多说开始今天的活吧,EnterUserControl是为EnterFrom1这个用户控件服务的,这是一个用户控件,本身没有意义主要是子类实现,我们先来看看实现的效果吧
这里就是实现 的效果图片, 构造器实现
[code=csharp]public EnterUserControl()
{
this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
InitializeComponent();
this.Controls.Remove(this.pnlRight);
this.Controls.Remove(this.pnlLeft);
this.Controls.Remove(this.pnlBackGroup);
}[/code]
这里就不多说了和之前的实现基本没有任何分别 ,下面是重写的WndProc方法
[code=csharp]protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case Win32.WM_COMMAND:
Win32.SendMessage(Handle, Win32.WM_SYSCOMMAND, (int)m.WParam, (int)m.LParam);
break;
case Win32.WM_SYSCOMMAND:
base.WndProc(ref m);
if (m.WParam.ToInt64() == Win32.SC_RESTORE)
{
this.Height += 6;
this.Width += 6;
}
else if (m.WParam.ToInt64() == Win32.SC_MAXIMIZE)
{
Application.DoEvents();
}
break;
default:
base.WndProc(ref m);
break;
}
}[/code]
在这之后我们再重写一下OnLoad事件就成功一半了
[code=csharp]protected override void OnLoad(EventArgs e)
{
this.Controls.Add(this.pnlRight);
this.Controls.Add(this.pnlLeft);
this.Controls.Add(this.pnlBackGroup);
if (!DesignMode)
{
this.Hide();
}
base.OnLoad(e);
Win32.SetWindowLong(this.Handle, -16,Win32.GetWindowLong(this.Handle,-16) -Win32.WS_MAXIMIZEBOX );
this.Show();
}[/code]
在加载时我添加这三个Panel
[code=csharp]this.Controls.Add(this.pnlRight);
this.Controls.Add(this.pnlLeft);
this.Controls.Add(this.pnlBackGroup);[/code]
为了移动是方便我们加上这两个事件
1.Caption_MouseMove事件
[code=csharp]private void Caption_MouseMove(object sender, MouseEventArgs e)
{
((Control)sender).Cursor = Cursors.Default;
if (e.Button == MouseButtons.Left)
{
Win32.ReleaseCapture();
Win32.SendMessage(Handle, 274, 61440 + 9, 0);
}
}[/code]
2.caption_MouseUp事件
[code=csharp]private void caption_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right && ((Control)sender).Cursor == Cursors.Default && e.Y <= SystemInformation.CaptionHeight)
{
Win32.TrackPopupMenu(Win32.GetSystemMenu(Handle, 0).ToInt32(), 2, Cursor.Position.X, Cursor.Position.Y, 0, Handle, 0);
}
}[/code]
最的我们重写一下Text属性
[code=csharp]public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}[/code]
这个相对来说比较简单一些了
我就不多说什么了,大家把代码调试一下就明白了。感谢大家支持
|
|