您的位置:首页 > 编程语言 > C#

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

2010-02-06 03:41 666 查看
先看下苏飞先生的这个

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*/);
}

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

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

都看到这了,可不可以顶下啊...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: