要真正的理解和解决这个问题,确实不容易。当我花了好几天时间才搞明白之后(每天都会纠结新的问题),我真想写一本书。
首先说明下让窗口前置的方法非常多,但现有(2011年1月26号)网上(公开中文论坛资料)的99%(还有1%我是没发现)的回答和论点都是不全面或者错误的。所以我觉得写这样一篇文章是由必要的,真理谈不上,就希望给大家点参考,防止走弯路。
以下是我自己钻研出来的经过BCB RAD测试得到的结论。(过程就不说了,两个字:辛酸)
一、原理讨论。(想直接看“实现从属窗体前置”的翻到二部分)
有必要了解Windows 窗口机制的Z 轴坐标的原理才能再实践中更上一层楼。(一部分最后Note里会讲到)
BCB-RAD(其他没有尝试,可能只是部分适用)里要让一个窗体(设为Form)能和任务管理器一样在所有窗口之上,必须具有两个条件:
1.必须是父窗体(主窗体),换句话说Form没有parent form。——这里要说明的是,父窗体可以理解为主窗体MainForm(只是在一定范围内可以,其本质也不相同),但是子窗体不能理解为从属窗体,至于为什么,我只知道MDI子窗体和从属窗体是完全的两回事,没有深究,这里不阐述。
2.必须要用WindowAPI 或者是窗体属性来设置Form的EXSTYLE为TOPMOST。(BCB提供的SetZOrder什么的都没有用)以下是两种方式:
1)API-SetWindowPos:在窗体初始化函数__fastcall TForm::TForm(TComponent* Owner) : TForm(Owner) 里或者Create函数里加上
SetWindowPos(带设置窗体的句柄,ExStyle(HWND_TOPMOST),坐标x,y,xx,yy,Style);
2)参数传递法:添加一个参数传递函数:
在.h文件里TForm类__published成员下添加:
void __fastcall CreateParams(TCreateParams &Param) ;
表示这个参数将在窗体创建的时候传递给窗体,使之按这个参数创建窗口