仿QQ会员右下角提示框c#实现,提示窗体不获得焦点

先看下苏飞先生的这个

http://www.cnblogs.com/sufei/archive/2010/02/04/1663889.html#commentform

看完之后有一个感觉,QQ说仿也容易,可是细节问题人家处理的太好了.

言归正转,这里面只写了出现和关闭等.我就不再写了

虽说有不获得焦点的窗体的例子,可是我并不知道怎么实现,所以还是让自己的这样 "不获得焦点的窗体"先获得,然后再把焦点还给他之前的那个焦点窗体

刚开始想的不用API,用Application.OpenForms得到自己程序所有窗体,然后再显示自己,当然就会得到焦点,然后以前的

有焦点的就会有失去焦点的事件,但没出来,换API,思路大至一样.

用到API

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern IntPtr GetActiveWindow();//获得当前活动窗体
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern IntPtr SetActiveWindow(IntPtr hwnd);//设置活动窗体

 

QQ的那提示框可以有焦点,只是不点它,不抢焦点而已

      那我要做的就是第一次显示时"不抢焦点"

     写个成员变量

      private IntPtr actform=IntPtr.Zero;//保存自己得到焦点前拥有活动窗体的柄

      private bool isFristShow=true;//标识是否是首次加载

      在构造聚函数里加入

      actform = GetActiveWindow();

      重写Form的OnActivated方法

         protected override void OnActivated(EventArgs e)
        {
            base.OnActivated(e);


            if (hwnd != IntPtr.Zero && isFristShow)
            {
                SetActiveWindow(hwnd);

                //已不再是首次加载,下次就可以有焦点了

                 isFristShow= false;
            }
        }

 

我只想到这么多了,谁有更好的方法教下我QQ:122281069

另还再说一个问题

在上面提到的链接中有一个叫"codingsilence"的说了这个

"用Windows Api实现的效果比你这个好多了,代码是你这个的十分之一"

我也来实现下好了,不过不知道和他想的是否一样,当然有利有弊,先给出代码,再谈得失

先把API 写上

        // 函数功能:该函数能在显示与隐藏窗口时能产生特殊的效果。有两种类型的动画效果:滚动动画和滑动动画

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern void AnimateWindow(IntPtr hwnd, int stime, int style);

可以在加载和关闭还有其它事件里使用这个函数

这里只写一个打开时的效果例子,因为简单,不多写了,在窗体里加入这个

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

             //第二个参数就是渐变的时间了
            AnimateWindow(this.Handle, 2000, 0x80000/*AW_BLEND*/);
        }

哈,强吧,一句话就搞了那么复杂的效果,不过他的缺点就是,这个时间长的话,最好用多线程

因为这个函数要执行里面设置的那以长时间,会造成这一时间段同一线程上的其它界面不响应用户操作的,不过总体来说还是这个好

 

 都看到这了,可不可以顶下啊...

 

你可能感兴趣的:(.net,winform)