先看下苏飞先生的这个
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*/);
}
哈,强吧,一句话就搞了那么复杂的效果,不过他的缺点就是,这个时间长的话,最好用多线程
因为这个函数要执行里面设置的那以长时间,会造成这一时间段同一线程上的其它界面不响应用户操作的,不过总体来说还是这个好
都看到这了,可不可以顶下啊...