顶层窗口与任务栏

larryuan 2000-05-30 02:59:00
form1运行后创建form2,想让form2在顶层,
设置form2的formstyle为fsstayontop,
但只是在form1的顶层,其他程序都可以覆盖它。

又:form2.ParentWindow:=GetDesktopWindow();
可以实现顶层,但form2失去焦点,
而且在任务栏又出现了一个form2的按钮。

如何解决?
解决form2在顶层或是使form2不出现在任务栏均可。
...全文
362 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ExitWnidows 2001-08-08
  • 打赏
  • 举报
回复
up
ace 2000-06-01
  • 打赏
  • 举报
回复

CreateParams是在form的CreateWindow之前调用的,不能再调用了..
还会出现在任务栏,应该是你的form2不是toolwindow吧.

还有要焦点的话
在form2的formshow里
SetWindowPos( ... HWND_TOPMOST...)
SetForegroundWindow(...)
larryuan 2000-06-01
  • 打赏
  • 举报
回复
to ace:
在程序中我需要调用updatewindow,
这样form2又出现在任务栏上。
是不是需要在updatewindow前先调用CreateParams,
那如何获得它的参数呢?
larryuan 2000-06-01
  • 打赏
  • 举报
回复
to ace:
谢谢,这样可以基本解决了。但form2还是没有焦点。
ace 2000-06-01
  • 打赏
  • 举报
回复
我的方法:
直接设置form2的parentwindow是不行的
应该重载CreateParams(var Params: TCreateParams),就可以使form2不出现在
任务栏

procedure CreateParams(var Params: TCreateParams); override;

procedure TDragForm.CreateParams(var Params: TCreateParams);
begin
Inherited;
Params.ExStyle := Params.ExStyle or WS_EX_TOOLWINDOW;
Params.WndParent := GetDeskTopWindow;
end;
larryuan 2000-05-31
  • 打赏
  • 举报
回复
to lin:
这样整个应用就在顶层了,但form1还是可以盖住form2,
而且我只想让form2在定层,其它程序可以盖住form1,
类似网络蚂蚁的窗口。
这该如何实现呢?
larryuan 2000-05-31
  • 打赏
  • 举报
回复
to patpat:
试过好象不行
radish 2000-05-31
  • 打赏
  • 举报
回复
可以实现,很久一起我试过,你看看下面的文章再改改就可以了
做一个多主窗口的应用程序

成都 谢慧强 xiehuiqiang@21cn.com

用过DreamWeaver的人都会发现DreamWeaver将每一个编辑的文件显示在任务栏上,并且用户任意关闭一窗口而不影响其他窗口,好象每一个窗口间没有关联,没有主窗口似的。但我们也能发现其实这些窗口间也有数据是共享的,如存盘的路径。

经过研究我发现其实这些窗口其实是属于同一程序的,并且实现方法也非常的简单。下面我用Inprise公司的C++ Builder为大家举一个简单的例子。

首先我们创建一个普通的应用程序。在这个程序中包含两个Form,其中Form1为主窗口,我们将Form2设为不由应用程序自动创建。在Form1中加入一新的Public的属性: int FormCount; 此属性用于记录系统建立的From2的实例的个数,在Form1的OnCreate事件中加入如下代码:

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);
F->Show();
G->Show();
//注意,改变FORM的ParentWindow和GWL_STYLE FORM的HANDLE值将改变

其中GetWindowLong,SetWindowLong为获取/设置Window属性的API函数,具体请看C++ Builder带的Win32帮助。然后运行程序,我们就能发现程序在任务栏上显示了属于此程序的三个任务条。 接下来我们要做的事情有两个:

1、 隐藏Form1及Application

2、 让Form2的实例关闭应用程序

实现第一件事情的方法在网上很多地方都提到了,即修改WinMain函数下面是具体的代码(粗斜体为加入的代码):

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->ShowMainForm=false;
ShowWindow(Application->Handle, SW_HIDE);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}


在这个地方要注意的是光用"Application->ShowMainForm=false;"是不能隐藏主Form(Form1)的,必须将Form1的Visibled属性变为false。 实现第二件事情需要用到Application的Terminate方法(结束应用程序)。我们只要在TForm2的OnClose事件中简单加入以下几句程序:
if (Form1->FormCount>1)
Form1->FormCount--;
else
Application->Terminate();


运行程序,你就能发现程序在有任务拦上有两个提示,窗口F及窗口G,而且这两个窗口看起来就象独立的应用程序。 至此,一个多主窗口程序就做完了,是不是很简单呢。




Lin 2000-05-31
  • 打赏
  • 举报
回复
Larryuan:
Application.Handle是程序的主窗口,其他所有的窗口都是他的子窗口。使用SetWindowPos(Application.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);应该可以达到目的。
patpat 2000-05-30
  • 打赏
  • 举报
回复
用Api: ShowWINDOW试试 设为TOPMOST
larryuan 2000-05-30
  • 打赏
  • 举报
回复
这个handle是form1还是Application的一个内置窗口?
如何用这个handle?
Lin 2000-05-30
  • 打赏
  • 举报
回复
很好解决:设置Application.Handle所代表的窗口Always on top就可以了。
《精通Visual C++实效编程280例》光盘源代码 精通Visual C++实效编程280例(附光盘)的目录介绍 内容介绍 作者介绍 目录介绍 商品目录: 返回商品页面 第1章 窗口   1.1 实例1:通过HWND获得CWnd指针   1.2 实例2:获得应用程序主窗口的指针   1.3 实例3:获得指定点的窗口   1.4 实例4:最大化和最小化窗口   1.5 实例5:关闭窗口   1.6 实例6:设置窗口的大小和位置   1.7 实例7:居中显示窗口   1.8 实例8:顶层显示窗口   1.9 实例9:设置窗口图标   1.10 实例10:获得和设置窗口的标题   1.11 实例11:显示或隐藏窗口的标题栏   1.12 实例12:改变窗口形状   1.13 实例13:设置窗口的透明区域   1.14 实例14:透明窗口   1.15 实例15:窗口闪烁   1.16 实例16:图片窗口   1.17 实例17:动画窗口   1.18 实例18:桌面窗口   1.19 实例19:最小化桌面所有窗口   1.20 实例20:获取任务栏窗口   1.21 实例21:显示或隐藏任务栏   1.22 实例22:枚举桌面所有顶层窗口  第2章 菜单和光标   2.1 实例23:动态添加和删除菜单项   2.2 实例24:在系统菜单中添加和删除菜单项   2.3 实例25:禁用关闭按钮   2.4 实例26:启用和禁用菜单项   2.5 实例27:设置菜单项的检查状态   2.6 实例28:快捷菜单   2.7 实例29:获取光标的坐标   2.8 实例30:限制光标的移动范围   2.9 实例31:自定义光标   2.10 实例32:等待光标  第3章 控制栏   3.1 实例33:创建工具栏   3.2 实例34:设置工具栏标题   3.3 实例35:停靠工具栏   3.4 实例36:设置工具栏位图   3.5 实例37:为工具栏按钮添加文本标签   3.6 实例38:为工具栏按钮添加下拉箭头   3.7 实例39:为工具栏按钮设置热点图像   3.8 实例40:启用或禁用工具栏的工具提示   3.9 实例41:在工具栏中添加组合框   3.10 实例42:创建状态栏   3.11 实例43:在状态栏中添加进度条   3.12 实例44:显示或隐藏工具栏和状态栏   3.13 实例45:使用组合栏  第4章 对话框  第5章 框架和文档视图  第6章 通用控件  第7章 GDI  第8章 文件  第9章 打印  第10章 多线程  第11章 网络  第12章 ADO数据库  第13章 动态链接库  第14章 系统  第15章 设备管理  第16章 数据类型及转换

5,379

社区成员

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

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