代码改变世界

C#仿QQ皮肤-用户控件EnterUserControl的实现

2010-06-14 17:29  苏飞  阅读(4432)  评论(1编辑  收藏  举报

原文地址:http://www.cckan.net/thread-1949-1-1.html  可提供源码下载

导读部分
-------------------------------------------------------------------------------------------------------------
C#仿QQ皮肤-实现原理系列文章导航 最新版源码下载

http://www.cckan.net/thread-2-1-1.html

 

       最过忙坏了,呵呵,费话不多说开始今天的活吧,EnterUserControl是为EnterFrom1这个用户控件服务的,这是一个用户控件,本身没有意义主要是子类实现,我们先来看看实现的效果吧

        这里就是实现 的效果图片,       

     构造器实现

代码
  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);
        }

 

                                                                                                                                                              

         这里就不多说了和之前的实现基本没有任何分别 ,下面是重写的WndProc方法

 

代码
 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;
            }
        }

 

   在这之后我们再重写一下OnLoad事件就成功一半了

 

代码
  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();
        }  

 

           在加载时我添加这三个Panel

 

  this.Controls.Add(this.pnlRight);
            
this.Controls.Add(this.pnlLeft);
            
this.Controls.Add(this.pnlBackGroup);

 

为了移动是方便我们加上这两个事件

1.Caption_MouseMove事件

 

代码
 private void Caption_MouseMove(object sender, MouseEventArgs e)
        {
            ((Control)sender).Cursor 
= Cursors.Default;
            
if (e.Button == MouseButtons.Left)
            {
                Win32.ReleaseCapture();
                Win32.SendMessage(Handle, 
27461440 + 90);
            }
        }

 

 

2.caption_MouseUp事件

 

代码
 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);
            }
        }

 

最的我们重写一下Text属性

 

代码
 public override string Text
        {
            
get
            {
                
return base.Text;
            }
            
set
            {
                
base.Text = value;
            }
        }

 

这个相对来说比较简单一些了

我就不多说什么了,大家把代码调试一下就明白了。感谢大家支持