请问如何让子窗口永远在最前面?
我想做一个类似Flashget的drapzone的小窗口
可以当主form被最小化的时候,子form也自动消失了,
请问有什么办法使得子form一直留在最前面?
thanks!
问题点数:100、回复次数:17Top
1 楼codecb(阿星)回复于 2002-08-25 14:41:42 得分 5
BOOL SetWindowPos(
HWND hWnd, // handle to window
HWND hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
UINT uFlags // window-positioning flags
);
SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE);//设置窗口在最上。
SetWindowPos(Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE);//取消窗口在最上的设置
Top
2 楼codecb(阿星)回复于 2002-08-25 14:42:32 得分 0
还可以用BCB的stayontop
Top
3 楼szhunter(hunter)回复于 2002-08-25 14:59:11 得分 0
都用过了
现在的问题是,那个拖拽区域是另外一个form,由我的主form设置其是否
可见,在这个子form的OnShow里,我用了如下函数:
// TCreateParams Params;
// TForm::CreateParams(Params);
// Params.ExStyle |= WS_EX_TOPMOST;
// Params.WndParent = GetDesktopWindow();
SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE);
当主form在其他窗体前面的时候,它的确是在"最上面"的,
但是如果我切换其他程序为当前窗体的时候,子form就会隐藏到后面了.
请问有什么办法让我的"drop zone" form不会隐藏到后面?thanks!
Top
4 楼sjd163(sjd163)回复于 2002-08-25 15:42:45 得分 0
关注Top
5 楼our(书呆子)回复于 2002-08-25 16:01:04 得分 0
我也碰到过这个问题
当把主窗体隐藏后
子窗体也不能总在最上
关注中。。。。Top
6 楼hillhero789(丘)回复于 2002-08-25 18:09:32 得分 0
我也想知道,不知道可不可以在运行期使子窗口变成主窗口呢?Top
7 楼lizsss(沉睡火山)回复于 2002-08-25 18:48:29 得分 0
同意楼上!
听起来象是handle引起的问题
把悬浮窗制定给桌面试试!或者其他
我乱说的Top
8 楼cdws222(二当家)回复于 2002-08-25 19:14:57 得分 5
只有一个办法:重载子窗体的CreatParmas然后将它的Parment设为桌面(句柄为0)Top
9 楼szhunter(hunter)回复于 2002-08-25 21:04:27 得分 0
是这些吗?
// TCreateParams Params;
// TForm::CreateParams(Params);
// Params.ExStyle |= WS_EX_TOPMOST;
// Params.WndParent = GetDesktopWindow();
我试过了,因为不行,所以注释掉了Top
10 楼szhunter(hunter)回复于 2002-08-25 22:08:17 得分 0
没人知道吗?我加分~请高手出谋!Top
11 楼songhtao(三十年孤独)回复于 2002-08-26 22:20:58 得分 5
BOOL SetForegroundWindow(
HWND hWnd // handle of window to bring to foreground
);
Top
12 楼joshstone(软体动物)回复于 2002-08-26 22:30:14 得分 70
void __fastcall TForm1::CreateParams(TCreateParams & Param)
{
//调用基类
TForm::CreateParams(Param);
//去掉窗口标题区 当然你也可以不去掉 具体请参考帮助
Param.Style=Param.Style & ~WS_CAPTION;
Param.Style=Param.Style | WS_POPUP;
//设为总在最上面
Param.ExStyle=Param.ExStyle | WS_EX_TOPMOST;
// 设Windows Owner为Desktop Window 即桌面 这样它就不受你的主窗口限制了 相当于把它过继给桌面了
Param.WndParent=GetDesktopWindow();
}
试试吧!
H:
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
private: // User declarations
virtual void __fastcall CreateParams(TCreateParams & Param);//主要是把这个写上
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Top
13 楼xuby5228(潇湘大少)回复于 2002-08-26 22:31:13 得分 10
void __fastcall TForm1::CreateParams(TCreateParams & Param)
{
//调用基类
TForm::CreateParams(Param);
//设为总在最上边
Param.ExStyle=Param.ExStyle | WS_EX_TOPMOST;
//设WINDOWS OWNER为DESKTOP WINDOWS
Param.WndParent=GetDesktopWindow();
}
这样都不行吗?
我先试一试,等待中。。。。。。Top
14 楼joshstone(软体动物)回复于 2002-08-26 22:56:26 得分 0
应该可以的把!
Top
15 楼SessionEnum(寂寞如歌)回复于 2002-08-26 23:04:44 得分 5
mark,
你可以在最小化时,把你的主Form Hide起来,
自己改写一下系统菜单,扑捉最小化事件.
Top
16 楼SessionEnum(寂寞如歌)回复于 2002-08-26 23:10:16 得分 0
你看一看 叶秋枫的那个 秋枫贴图,
在 http://www.txrj.com/ 上有,
他就实现了你要的这个功能.Top
17 楼szhunter(hunter)回复于 2002-08-27 22:33:06 得分 0
to joshstone:
你的方法果然可以,多谢多谢~~~
Top




