首页 > 代码库 > 模拟窗体附顶停靠隐藏

模拟窗体附顶停靠隐藏

using System.Runtime.InteropServices;/*        Winform的 FormBorderStyle=None; */namespace Windows_API_实现屏幕右下角_消息框_{    public partial class QQHide : Form    {        #region WinAPI http://msdn.microsoft.com/en-us/library/ms632669%28VS.85%29.aspx        /// <summary>        /// Enables you to produce special effects when showing or hiding windows. There are four types of animation: roll, slide, collapse or expand, and alpha-blended fade.        /// </summary>        /// <param name="handle">A handle to the window to animate. The calling thread must own this window.</param>        /// <param name="time">The time it takes to play the animation, in milliseconds. Typically, an animation takes 200 milliseconds to play. </param>        /// <param name="type">The type of animation. This parameter can be one or more of the following values. Note that, by default, these flags take effect when showing a window. To take effect when hiding a window, use AW_HIDE and a logical OR operator with the appropriate flags. </param>        /// <returns>If the function succeeds, the return value is nonzero.</returns>        [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "AnimateWindow")]        private static extern bool AnimateWindow(IntPtr handle, int time, AnimationType type);        [DllImport("user32.dll")]        public static extern bool ReleaseCapture();        [DllImport("user32.dll")]        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);        public const int WM_SYSCOMMAND = 0x0112;        public const int SC_MOVE = 0xF010;        public const int HTCAPTION = 0x0002;          #endregion        #region 获取全局鼠标位置  http://msdn.microsoft.com/en-us/library/ms648390(VS.85).aspx        /// <summary>        /// Retrieves the position of the mouse cursor, in screen coordinates.        /// </summary>        /// <param name="p">A pointer to a POINT structure that receives the screen coordinates of the cursor.</param>        /// <returns>Returns nonzero if successful or zero otherwise. To get extended error information, call GetLastError.</returns>        [DllImport("user32.dll")]        private static extern bool GetCursorPos(ref Point p);                #endregion               public QQHide()        {            InitializeComponent();        }        private void QQHide_Load(object sender, EventArgs e)        {            MessageBox.Show("模拟窗体附顶停靠隐藏");        }        int Y;        int SimulateY;        private void QQHide_LocationChanged(object sender, EventArgs e)        {            Y = this.Location.Y;            this.lblX.Text = this.Location.X.ToString();            this.lblY.Text = this.Location.Y.ToString();            label1.Text = "X:" + MousePosition.X + "Y:" + MousePosition.Y;            label2.Text = "X:" + (MousePosition.X - this.Location.X) + "Y:" + SimulateY;        }        /// <summary>        /// 窗体原来位置        /// </summary>        Point SourcePoint;        /// <summary>        /// 窗体非激活状态        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void QQHide_Deactivate(object sender, EventArgs e)        {            if (HideConditionOfOne)            {///满足条件隐藏窗体                AnimateWindow(this.Handle, 150, AnimationType.AW_HIDE | AnimationType.AW_VER_NEGATIVE | AnimationType.AW_SLIDE);                SourcePoint = this.Location;                HideConditionOfOne = false;            }        }        /// <summary>        /// 隐藏条件之一:窗体上边缘贴近屏幕上边缘        /// </summary>        bool HideConditionOfOne;        new bool IsEnter;        private void QQHide_MouseEnter(object sender, EventArgs e)        {            IsEnter = true;        }        /// <summary>        /// 鼠标离开窗体时更改条件变量值        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void QQHide_MouseLeave(object sender, EventArgs e)        {            if (IsEnter && Y < 3)            {                Point p = new Point(this.Location.X, 0);                this.PointToScreen(p);                this.Location = p;                ///保存窗体位置并满足隐藏条件                HideConditionOfOne = true;            }            IsEnter = false;        }        /// <summary>        /// 鼠标按下时模拟窗体顶部边框拖拉窗体        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void QQHide_MouseDown(object sender, MouseEventArgs e)        {            SimulateY = (MousePosition.Y - this.Location.Y);            ///模拟窗体拖拉框             if (SimulateY > 30)                return;            ReleaseCapture();            SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);        }        /// <summary>        /// 实时更新鼠标位置        /// </summary>        Point MousePoint = new Point();        private void tMonitor_Tick(object sender, EventArgs e)        {            GetCursorPos(ref MousePoint);            ///Y方向符合显示窗体            if (MousePoint.Y > 3)                return;            ///X方向符合显示窗体            if (MousePoint.X > SourcePoint.X && MousePoint.X < (this.Width + SourcePoint.X))                AnimateWindow(this.Handle, 100, AnimationType.AW_ACTIVATE | AnimationType.AW_SLIDE | AnimationType.AW_VER_POSITIVE);            /*            if (MousePosition.Y > 3)                return;            if (MousePosition.X > SourcePoint.X && MousePosition.X < (this.Width + SourcePoint.X))                AnimateWindow(this.Handle, 100, AnimationType.AW_ACTIVATE | AnimationType.AW_SLIDE | AnimationType.AW_VER_POSITIVE);            */        }    }}

 

模拟窗体附顶停靠隐藏