C# .Net Winform窗口特效处理

本文基于.Net开发,使用C#作为开发语言,分别包含以下效果:
移动无边框窗口、窗口移动限制(限制在屏幕内)、桌面贴边自动隐藏(仿QQ隐藏窗口)

1、移动无边框窗口
采用了消息的方式,可以实现通过窗口内的任何控件来移动窗口

  1. private const int WM_NCLBUTTONDOWN = 0x00A1;
  2. private const int HT_CAPTION = 0x002;
  3.  
  4. private void Form_MouseDown(object sender, MouseEventArgs e)
  5. {
  6.    if (e.Button == MouseButtons.Left)
  7.    {
  8.        ((Control)sender).Capture = false;
  9.        Message msg = Message.Create(Handle, WM_NCLBUTTONDOWN, (IntPtr)HT_CAPTION, IntPtr.Zero);
  10.        base.WndProc(ref   msg);
  11.    }
  12. }

使用方法:
将以上代码复制到Form的class内,将Form或Form中需要控制Form移动的控件的MouseDown事件关联到这个方法上,如:
对于Form:this.MouseDown+=new System.Windows.Forms.MouseEventHandler(Form_MouseDown);
对于其它控件:Control.MouseDown+=new System.Windows.Forms.MouseEventHandler(Form_MouseDown);

2、窗口移动限制

  1. private const int WM_MOVING = 0x0216;
  2. protected override void WndProc(ref Message m)
  3. {
  4.    switch (m.Msg)
  5.    {
  6.        case WM_MOVING: // 窗体移动的消息,控制窗体不会移出屏幕外
  7.            int left = Marshal.ReadInt32(m.LParam, 0);
  8.            int top = Marshal.ReadInt32(m.LParam, 4);
  9.            int right = Marshal.ReadInt32(m.LParam, 8);
  10.            int bottom = Marshal.ReadInt32(m.LParam, 12);
  11.            left = Math.Min(Math.Max(0, left), Screen.PrimaryScreen.Bounds.Width - Width);
  12.            top = Math.Min(Math.Max(0, top), Screen.PrimaryScreen.Bounds.Height - Height);
  13.            right = Math.Min(Math.Max(Width, right), Screen.PrimaryScreen.Bounds.Width);
  14.            bottom = Math.Min(Math.Max(Height, bottom), Screen.PrimaryScreen.Bounds.Height);
  15.            Marshal.WriteInt32(m.LParam, 0, left);
  16.            Marshal.WriteInt32(m.LParam, 4, top);
  17.            Marshal.WriteInt32(m.LParam, 8, right);
  18.            Marshal.WriteInt32(m.LParam, 12, bottom);
  19.            break;
  20.    }
  21.    base.WndProc(ref m);
  22. }

使用方法:
添加using System.Runtime.InteropServices;
在Form类定义中加入以上代码即可
3、桌面贴边自动隐藏

  1. public class FormAutoDock
  2. {
  3. public static void SideHideOrShow(Form DockableForm, ref int DockFormHeight, Timer _dockTimer)
  4. {
  5. if (DockableForm.WindowState != FormWindowState.Minimized)
  6. {
  7. _dockTimer.Interval = 1500;
  8. if (Cursor.Position.X > DockableForm.Left - 1 && Cursor.Position.X < DockableForm.Right && Cursor.Position.Y > DockableForm.Top - 1 && Cursor.Position.Y < DockableForm.Bottom)
  9. {
  10. if (DockableForm.Top <= 0 && DockableForm.Left > 5 && DockableForm.Left < Screen.PrimaryScreen.WorkingArea.Width - DockableForm.Width)
  11. {
  12. DockableForm.Top = 0;
  13. }
  14. else if (DockableForm.Left <= 0)
  15. {
  16. DockableForm.Left = 0;
  17. }
  18. else if (DockableForm.Left + DockableForm.Width >= Screen.PrimaryScreen.WorkingArea.Width)
  19. {
  20. DockableForm.Left = Screen.PrimaryScreen.WorkingArea.Width - DockableForm.Width;
  21. }
  22. else
  23. {
  24. if (DockFormHeight > 0)
  25. {
  26. DockableForm.Height = DockFormHeight;
  27. DockFormHeight = 0;
  28. }
  29. }
  30. }
  31. else
  32. {
  33. if (DockFormHeight < 1)
  34. {
  35. DockFormHeight = DockableForm.Height;
  36. }
  37. if (DockableForm.Top <= 4 && DockableForm.Left > 5 && DockableForm.Left < Screen.PrimaryScreen.WorkingArea.Width - DockableForm.Width)
  38. {
  39. DockableForm.Top = 3 - DockableForm.Height;
  40. if (DockableForm.Left <= 4)
  41. {
  42. DockableForm.Left = -5;
  43. }
  44. else if (DockableForm.Left + DockableForm.Width >= Screen.PrimaryScreen.WorkingArea.Width - 4)
  45. {
  46. DockableForm.Left = Screen.PrimaryScreen.WorkingArea.Width - DockableForm.Width + 5;
  47. }
  48. }
  49. else if (DockableForm.Left <= 4)
  50. {
  51. DockableForm.Left = 3 - DockableForm.Width;
  52. }
  53. else if (DockableForm.Left + DockableForm.Width >= Screen.PrimaryScreen.WorkingArea.Width - 4)
  54. {
  55. DockableForm.Left = Screen.PrimaryScreen.WorkingArea.Width - 3;
  56. }
  57. _dockTimer.Interval = 200;
  58. }
  59. }
  60. }
  61. }

使用方法:
将FormAutoDock.cs文件复制到与需要处理的Form相同目录下,并添加到项目中
在Form的类中增加以下内容:
private Timer _dockTimer = null;
private int DockFormHeight = 0;
private void DockTimerAutoHide_Tick(object sender, EventArgs e)
{
FormAutoDock.SideHideOrShow(this, ref DockFormHeight, _dockTimer);
Application.DoEvents();
}

在Form类构造方法中添加以下内容:
_dockTimer = new Timer();
_dockTimer.Enabled = false;
_dockTimer.Interval = 200;
_dockTimer.Tick += new EventHandler(DockTimerAutoHide_Tick);
_dockTimer.Start();

posted @ 2009-06-25 20:57  【Nanao】  阅读(1016)  评论(1编辑  收藏  举报