zoukankan      html  css  js  c++  java
  • 模拟窗体附顶停靠隐藏

    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);
                */
            }
    
        }
    
    }
  • 相关阅读:
    hdu 1058
    hdu 1003
    hdu 1500
    hdu 1083 最大匹配
    hdu 1370 中国剩余定理
    hdu 1299 数论 分解素因子
    hdu 1299
    poj 1144 求割点
    hdu 1068 最大独立集合
    hdu 1054
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/4217727.html
Copyright © 2011-2022 走看看