原来还有一个getwindowlong函数会返回当前风格的值,我们可以在控件的构造函数中这样调用
oldstyleex:=getwindowlong(application.handle,gwl_exstyle);
这时,oldstyleex:就保存了窗口原来最小化的风格了,窗口最小化,调用setwindowlong,设置了新的最小风格。而当我们触发托盘事件,使窗体恢复大小时,我们在处理函数中调用
setwindowlong(application.handle,gwl_exstyle ,oldstyleex);
这样,窗口又回到了原来的风格,这时我们设factive为false,则窗口就能正常最小化了。
到控件被释放时,我们一定要调用application.unhookmainwindow(appmsghook);来解除钩子
其实这里也有一个不完善的地方,应该再设一个成员变量,确定设置托盘时,窗口是正常最小化,还是最小化到看不见。而我没有这么做,直接如果factive为true,最小化会出现托盘图标,并且窗口最小化到看不见。不过影响不大,有兴趣的朋友看了之后可以帮我完善一下,也当做自己的练习吗。
三 托盘如果处理消息,上面说到,要设置托盘结构,一定要有一个窗口句柄,才能检索托盘消息,那么这个句柄是什么呢,非可视组件没有窗口句柄呀。
如果你有看过ttimer的源码,一定知道这一句代码:
fwindowhandle := allocatehwnd(wndproc);
它创建一个看不见的窗口,返回他的句柄,并指定wndproc为窗口的消息处理过程