关于多个窗口的always on top

kxy 2000-02-28 07:16:00
要实现类似winamp的窗口效果
1)设置 FormStyle 的方法不予考虑,因为有严重的抖动。
2)SetwindowPos对一个窗口有效,对多个窗口同时设置会很奇怪,
always on top有时会失去作用,如 Form1,Form2都使用setwindowpos
来设置使他们Topmost, (Form2是Form1 show出来的),移动Form2后
Topmost失去了作用.
3)试图使用windows api 的 SetWindowLong ,但是没有作用,返回值也正确。

应该怎样做??
...全文
516 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxy 2000-03-01
  • 打赏
  • 举报
回复
经过Lin的验证,是delphi 4本身的问题:)
radish的方法比较怪异:-)
所以分数瓜分之.
kxy 2000-02-29
  • 打赏
  • 举报
回复
radish 隐藏窗口不好,
kxy 2000-02-29
  • 打赏
  • 举报
回复
to lin
ok kxy@csdn.net
Lin 2000-02-29
  • 打赏
  • 举报
回复
To kxy & hcat1999:
建议用SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYEL) or WS_EX_TOPMOST);
我试过行的,不知你为什么不行。要不给我你的EM,将我的测试程序给你G过去?
radish 2000-02-29
  • 打赏
  • 举报
回复
KXY的想法真的好玩,我刚用C++ buILDER 试通了一种方法:
1、将主窗口隐藏起来,然后将要显示的子窗口变为主窗口(象DREAMWEAVER,具体实现方法请到
WWW.CCW.COM.CN 的技巧中看)
2、然后在显示子窗口时使用setwindowPos就可以
kxy 2000-02-29
  • 打赏
  • 举报
回复
to Lin好像还是不行:(
AlwaysOnTop是一个开关选项
hcat1999 2000-02-29
  • 打赏
  • 举报
回复
SetWindowLong设置GWL_STYLE 现在对窗口属性好象都不起作用,
MSDN建议用SetWindowsPos
问题是不能在Oncreate时设置,因为ALways On top可以设置开关
jll 2000-02-29
  • 打赏
  • 举报
回复
Delphi 4 以前的版本在封装Form和Application时有点奇怪,大家可以实验一下,最小化一个窗口,它会直接最小化而不显示动画效果,也没有声音提示。但从Delphi 5 开始好象完全封装了Form和Application,有动画效果和声音提示了。
实现所有的窗口都stay on top,听起来有点意思。即使是Error Message窗口好象有多个的时候也会一个压着一个。怎么办啊?!……~_~
radish 2000-02-29
  • 打赏
  • 举报
回复
最后一点改进。
KXY,我猜想你只想在任务栏里显示一个主窗口,你可以把FormCount去掉(这是用于控制多个虚拟主窗口程序退出的),把FORM2的SIZE属性变为TOOLSWINDOS。
这样就只有一个主窗口,退出等也不用修改。
kxy 2000-02-29
  • 打赏
  • 举报
回复
FormCount不是read-only吗?
这段代码是写在什么位置:)
radish 2000-02-29
  • 打赏
  • 举报
回复
不会的,我试了,我还在上面放了一副图片,会不会是DT的问题呢。
我的代码如下,您看看您的呢?
int i=GetWindowLong(this->Handle,GWL_STYLE);
TForm2 *F,*G;
F=new TForm2(NULL);
G=new TForm2(NULL);
F->ParentWindow=GetDesktopWindow();
F->Caption="F";
G->ParentWindow=GetDesktopWindow();
G->Caption="G";
this->FormCount=2;
SetWindowLong(G->Handle,GWL_STYLE,i);
SetWindowLong(F->Handle,GWL_STYLE,i);
SetWindowPos(this->Handle,HWND_TOPMOST,220,220,100,100,SWP_SHOWWINDOW);
SetWindowPos(F->Handle,HWND_TOPMOST,10,10,100,100,SWP_SHOWWINDOW);
SetWindowPos(G->Handle,HWND_TOPMOST,120,120,100,100,SWP_SHOWWINDOW);
F->Show();
G->Show();

radish 2000-02-29
  • 打赏
  • 举报
回复
不会的,我试了,我还在上面放了一副图片,会不会是DT的问题呢。
kxy 2000-02-29
  • 打赏
  • 举报
回复
我想实现的是类似winamp的窗口表现
radish如果显示一个子窗口就把他弄成主的,显示多个子的和他们关闭的
控制岂不是太麻烦了.
kxy 2000-02-29
  • 打赏
  • 举报
回复
radish :
子窗口显示出来后,你移动一下子窗口,:( 你就会发现On Top没了.
radish 2000-02-29
  • 打赏
  • 举报
回复
那就把隐藏去掉,也是可以的(我刚才是拿原来的程序改的)
Firing_Sky 2000-02-28
  • 打赏
  • 举报
回复
kxy:不好意思,我到现在还没能搞定。不过看来Lin应该是给了你一个满意的答案
Lin 2000-02-28
  • 打赏
  • 举报
回复
kxy: D5可以的。OnCreate中加SetWindowLong
kxy 2000-02-28
  • 打赏
  • 举报
回复
哦,use SetWindowLong为何不行?(Delphi 4)
Delphi 5 可以吗?SetWindowLong
Lin 2000-02-28
  • 打赏
  • 举报
回复
To kxy:
1、刚才讲的只是主Form。另外注意TApplicationEvents的OnDeactivate事件中设置的窗口句柄为Application.Handle而不是Form1的Handle
2、如果还有其他子Form1, 只需在重载子Form的CreateParams过程,设置:
Params.ExStyle := Params.ExStyle or WS_EX_TOPMOST;
即可。
kxy 2000-02-28
  • 打赏
  • 举报
回复
如果Form1,Form2都按这样写,或Form2 TopMost
Form1这样写,Form2不会获得焦点。
加载更多回复(2)

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧