zoukankan      html  css  js  c++  java
  • C#Winform窗口特效源码(1)

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

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

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

    使用方法: 将以上代码复制到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();

  • 相关阅读:
    用工具爬虎牙星秀VS用代码
    mysql简单的操作
    MySQL5.1的安装过程
    MySQL的安装
    SQL server 2008 的安装
    数据库基础知识
    HTTP协议
    TCP协议
    web系统基础
    软件测试缺陷的定义、产生原因、缺陷报告格式、缺陷报告
  • 原文地址:https://www.cnblogs.com/sczw-maqing/p/3251139.html
Copyright © 2011-2022 走看看