QQ登陆画面的最小化显示机制(使程序不在任务栏显示)

2007-05-21 19:17

QQ登陆画面的最小化显示机制(使程序不在任务栏显示)

本页例程下载

怎么使自己的程序不在任务栏显示?去网上找一下答案,关于Delphi的无非是以下一句:

SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOWINDOW);

在Application窗口的窗口属性中添加工具窗口属性,这样它就不会在任务栏显示了.在Delphi中,主窗口最小化的时候,实际上应该是隐藏了,只有Application窗口显示出来,这时候在屏幕的左下角就会出现最小化的一个标题栏:

系统菜单的样子: 我感觉这样很不好看,这就是标准的Windows中的ToolWindow.QQ的登陆界面在运行时也不出现在任务栏,但是它最小化之后是什么样子呢? 系统菜单的样子: 这样比ToolWindow风格漂亮的多了,但是这是怎么实现的呢?我们来研究研究.使用VC的Spy++工具找到登陆界面窗口 这是一个对话框(#32770)的窗口,试着定位到它的密码框,发现这个编辑框居然是个对话框!怪不得功能这么强大呢: 还有"隐身登陆"和"自动登陆"两个复选框居然是Button: 不过这不是我们要关注的,下面我们看一写登陆界面窗口的窗口属性: 发现登陆界面是有一个父窗口的,也就是说登陆界面不是单独存在的,它很有可能只是一个弹出窗口,点击父窗口的句柄,查看父窗口的属性: 这个父窗口是一个不可用的不可见的后台窗口,我们使用ShouWindow函数把它强制显示出来: 图中的黑线标识的部分是父窗口句柄,看到左上角那个标题为ChenkIdle的窗口了吧,那个就是父窗口,因为正常使用中它不会显示,所以连背景刷子都没有定义,它的界面是不重新绘制的,它只是一个有标题的父窗口而已.父窗口显示以后,尝试用鼠标去激活它,发现登陆界面窗口在闪烁,登陆界面分明就是一个模态弹出的窗口.父窗口率先启动,然后把登陆界面模态显示出来,自己始终不可见.我们使用Delphi尝试模拟这种效果,首先设计不可见的也不在任务栏显示的父窗口,窗体的大小无关紧要: 添加一个Form2为弹出窗口,这个窗口会由Form1弹出来,和QQ登陆界面的地位相同,注意在这个窗口关闭时通知它的父窗口关闭: 下面是Form1弹出Form2的问题,直接在Form1的创建过程中弹出Form2这样不行,因为这样的效果会比较像Form2成了Application的主窗体,最小化之后依然是ToolWindow的样子.还容易想到的是在Form1的OnShow中添加代码,但是这样也行不通,因为Form1根本就不会显示出来,它是不可见的.这里我采用了使用定时器的办法,在Form1中添加一个定时器,响应的时间间隔很小,而且只需响应一次就够了.在响应代码中使这个不再有用的定时器无效,然后再弹出Form2: 注意在这里Form在动态创建的,首先要把它从工程的自动创建窗体列表中把它删除.这样编译运行我们的程序,最小化它,发现这正是我们想要的效果: 多运行几个看看,最小化的小窗口的排列是有序的,这些都由系统自动完成:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值