CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

请问如何让子窗口永远在最前面?

楼主szhunter(hunter)2002-08-25 14:34:46 在 C++ Builder / 基础类 提问

我想做一个类似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

相关问题

  • 怎么让窗口永远在最前面?
  • 如果让PB的一个窗口永远处在最前面
  • 子窗口始终位于父窗口前面的问题?
  • 请问,怎样用JS实现弹出的窗口永远在最前面?
  • C#怎样让一个web窗口,永远在前面!请教高手
  • 在java中怎么让一个窗口永远在另一个窗口的前面,谢谢!
  • 如何使程序窗口永远在windows最前面(不被其他窗口挡住)
  • 请问怎样把MDI子窗口放在主窗口的控件的前面?
  • 主窗口的TreeView總在子窗口的前面,如何讓他總顯示在子窗口的後面?
  • 为什么我的帖子前面没有红方块?而且永远被放在前面?

关键词

  • 桌面
  • ws
  • swp
  • createparams
  • 窗体
  • topmost
  • tcreateparams
  • exstyle
  • tform
  • 主

得分解答快速导航

  • 帖主:szhunter
  • codecb
  • cdws222
  • songhtao
  • joshstone
  • xuby5228
  • SessionEnum

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo