创建两个窗口,要求子窗口也能显示在任务栏中,可以切换

时间:2022-02-02 08:05:46
创建两个窗口,要求子窗口也能显示在任务栏中(不是右下角),可以在主窗口和子窗口之间切换。当前我是这样解决的

void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
    TForm::CreateParams(Params);
    Params.ExStyle  |= WS_EX_APPWINDOW;
    Params.WndParent = GetDesktopWindow();
}

但是有个问题,如果我在Form1中打开OpenDialog或以ShowModal方式打开另外的窗体,则Form1就隐藏不见了,ShowMessage可以这样解决:
MessageBox(Handle,Msg,Caption,MB_YESNOCANCEL);

如果去掉  Params.WndParent = GetDesktopWindow(); 
就没有上面这个问题,但是又出新问题了。如果以ShowModal方式打开另外的窗体Form2,切换到别的窗体,再切换回来就看不见Form2,且Form1失去焦点。

我摸索了好久,查了好多地方,还是没解决。哪位老兄知道如何解决这个问题?请指教。

28 个解决方案

#1


1,在Form2的.h文件里加:
void __fastcall CreateParams(Controls::TCreateParams &Params);
2,在Form2的.cpp文件里加:
void __fastcall TForm2::CreateParams(TCreateParams &Params)
{
    TForm::CreateParams(Params);
    Params.WndParent = NULL;
}

//Form2为你在Form1里用非模式方法打开的窗体

#2


如果我必须要ShowModal呢?

#3


也可以!我刚才试了

#4


学了点招呀!有空了试试!:)

#5




  MDI里面ShowModal吗?

#6


Give me you email ,i send you a demo program

#7


学习

#8


ok

#9


学习

#10


Is very good Study

#11


void __fastcall TfrmSys::CreateBrowser()
{
  TfrmMain *frmMain=new TfrmMain(Application);
  long dwStyle=::GetWindowLong(frmMain->Handle,GWL_STYLE);
  frmMain->ParentWindow=::GetDesktopWindow();
  ::SetWindowLong(frmMain->Handle,GWL_STYLE,dwStyle);
  Image_frmMain=frmMain;
  frmMain->Show();
  
}

#12


忘了补充:显示问题:

//重载窗体创建的属性,将窗体置于屏幕最前端
void __fastcall TfrmSys::CreateParams(TCreateParams &Params)
{
  //如果Form的Owner不为0,就不会在任务栏会出现此窗体的标题
    TWinControl* parent;
    TForm::CreateParams(Params);
    parent=dynamic_cast<TWinControl*>(Owner);
    Params.WndParent=parent ? parent->Handle : 0;
    Params.ExStyle=WS_EX_TOOLWINDOW;
}

#13


不好意思,再次补充:

你的主窗体一定要动态创建,前例的frmMain;而且要在调用他的窗体中(可以隐藏)中,写入如上代码,否在就出现  "如果以ShowModal方式打开另外的窗体Form2,切换到别的窗体,再切换回来就看不见Form2,且Form1失去焦点。"



#14


to: GeoPhoenix(天鸽)
  My email: yangbing@trasin.net
  thanks very much.

#15


我再把我想要的效果说清楚。举个例子,大家都常用MSN吧。
   双击一个联系人就Show一个窗体,且标题出现在任务栏,可以点击这些标题在多个联系人间切换。
 
 在每个联系人的窗体Form1上,点“邀请某人到对话”就ShowModal一个窗体Form2,Form2不在任务栏中出现标题。此时Form1显示在Form2的背后,如果切换到别的联系人窗体,再切换回来,Form2仍可见且显示在Form1的前面。
  
 在每个联系人的窗体Form1上,点“发送文件或照片”,显示一个OpenDialog,这个OpenDialog的显示效果同上面的Form2.

tp: yyfzy(singler) 
  Params.WndParent = NULL;
  这样Form2的标题会显示在任务栏,而我希望它不显示在任务栏。

to:Friecin(雪客) 
  按照你提供的方法,动态创建窗体Form1,用ShowModal打开Form2,Form2的标题会显示在任务栏,且切换时不灵活,必须点任务栏上的标题切换,点Form1窗体不行。

再强调一下我的要求:Form1的标题要出项在任务栏,用ShowModal方式打开Form2且不出现在任务栏.

#16


晕!
那你简单的用
TForm2 *Form2=new TForm2(NULL);
Form2->ShowModal();
delete Form2;
不就可以了???????????

我给你的例子中frmMain是手动加载的,而frmSys则是自动加载的,并且是系统的主窗体,所调手动创建的frmMain中,可以以任何方式打开任何窗体?没有问题的,其程序效果类似Dreamweaver 4,你所强调的好象不是什么问题。(这段代码,是我发布的共享软件中的代码,没有问题的!)

#17


还有,我很了解你的意思:你一定是遇到了ShowModal()后的窗体会隐藏到调用他的窗体下面,我前面的例子就是解决这个问题的,很完美的!除非你没有理解代码的含义。

i fu le you

#18


to:Friecin(雪客) 
      很高兴又看到你回帖了,对你那段代码理解确实有点偏差,我以为:TfrmSys相当于Form1,frmMain相当于Form2,现在看来frmMain才是相当于Form1.

我重新试验了一下,你的方法确实没有我说的那两种问题。但有这样两个缺点:
1.如果有多个Form1且Form1上ShowModal了Form2,那么这多个Form1之间不能切换。
2.我希望我的主窗体能最小化,最大化,WS_EX_TOOLWINDOW风格的窗体不能做到这一点。我换了几种别的风格,在程序启动后任务栏上有两个标题,只有WS_EX_TOOLWINDOW风格的有一个标题。

如果你有兴趣的话,我可以把我的测试程序发给你看看。
我还想问一下:你是从哪里找到这个方法的?

#19


MS 在 Win2000里面增加了支持MTI窗口的功能,原来是SDI, MDI,你看看MS Office 现在样子就知道了,他不再是MDI了,但是他却能在Windows菜单里面枚举,可能就是你需要的。

#20


mark

#21


学习

#22


学习

#23


www.netspider.8u8.com/xfiles.rar

你看看是不是你要的效果。

#24


蹭分

#25


to:Friecin(雪客) 
    大体是我要的效果,但美中不足的是:
   你先打开主界面,点两下New按钮,任务栏就有了两个Docment,我把它称为
Docment1和Docment2,在Docment1中点右边的Browse按钮,你看看还能切换到Docment2吗?

#26


这是个问题!我尝试解决。

#27


http://www.delphibbs.com/delphibbs/dispq.asp?lid=1799653
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1679831

#28


网易泡泡,Foxmail,MSN都实现了这种效果,但怎么就很少人知道实现方法呢?

#1


1,在Form2的.h文件里加:
void __fastcall CreateParams(Controls::TCreateParams &Params);
2,在Form2的.cpp文件里加:
void __fastcall TForm2::CreateParams(TCreateParams &Params)
{
    TForm::CreateParams(Params);
    Params.WndParent = NULL;
}

//Form2为你在Form1里用非模式方法打开的窗体

#2


如果我必须要ShowModal呢?

#3


也可以!我刚才试了

#4


学了点招呀!有空了试试!:)

#5




  MDI里面ShowModal吗?

#6


Give me you email ,i send you a demo program

#7


学习

#8


ok

#9


学习

#10


Is very good Study

#11


void __fastcall TfrmSys::CreateBrowser()
{
  TfrmMain *frmMain=new TfrmMain(Application);
  long dwStyle=::GetWindowLong(frmMain->Handle,GWL_STYLE);
  frmMain->ParentWindow=::GetDesktopWindow();
  ::SetWindowLong(frmMain->Handle,GWL_STYLE,dwStyle);
  Image_frmMain=frmMain;
  frmMain->Show();
  
}

#12


忘了补充:显示问题:

//重载窗体创建的属性,将窗体置于屏幕最前端
void __fastcall TfrmSys::CreateParams(TCreateParams &Params)
{
  //如果Form的Owner不为0,就不会在任务栏会出现此窗体的标题
    TWinControl* parent;
    TForm::CreateParams(Params);
    parent=dynamic_cast<TWinControl*>(Owner);
    Params.WndParent=parent ? parent->Handle : 0;
    Params.ExStyle=WS_EX_TOOLWINDOW;
}

#13


不好意思,再次补充:

你的主窗体一定要动态创建,前例的frmMain;而且要在调用他的窗体中(可以隐藏)中,写入如上代码,否在就出现  "如果以ShowModal方式打开另外的窗体Form2,切换到别的窗体,再切换回来就看不见Form2,且Form1失去焦点。"



#14


to: GeoPhoenix(天鸽)
  My email: yangbing@trasin.net
  thanks very much.

#15


我再把我想要的效果说清楚。举个例子,大家都常用MSN吧。
   双击一个联系人就Show一个窗体,且标题出现在任务栏,可以点击这些标题在多个联系人间切换。
 
 在每个联系人的窗体Form1上,点“邀请某人到对话”就ShowModal一个窗体Form2,Form2不在任务栏中出现标题。此时Form1显示在Form2的背后,如果切换到别的联系人窗体,再切换回来,Form2仍可见且显示在Form1的前面。
  
 在每个联系人的窗体Form1上,点“发送文件或照片”,显示一个OpenDialog,这个OpenDialog的显示效果同上面的Form2.

tp: yyfzy(singler) 
  Params.WndParent = NULL;
  这样Form2的标题会显示在任务栏,而我希望它不显示在任务栏。

to:Friecin(雪客) 
  按照你提供的方法,动态创建窗体Form1,用ShowModal打开Form2,Form2的标题会显示在任务栏,且切换时不灵活,必须点任务栏上的标题切换,点Form1窗体不行。

再强调一下我的要求:Form1的标题要出项在任务栏,用ShowModal方式打开Form2且不出现在任务栏.

#16


晕!
那你简单的用
TForm2 *Form2=new TForm2(NULL);
Form2->ShowModal();
delete Form2;
不就可以了???????????

我给你的例子中frmMain是手动加载的,而frmSys则是自动加载的,并且是系统的主窗体,所调手动创建的frmMain中,可以以任何方式打开任何窗体?没有问题的,其程序效果类似Dreamweaver 4,你所强调的好象不是什么问题。(这段代码,是我发布的共享软件中的代码,没有问题的!)

#17


还有,我很了解你的意思:你一定是遇到了ShowModal()后的窗体会隐藏到调用他的窗体下面,我前面的例子就是解决这个问题的,很完美的!除非你没有理解代码的含义。

i fu le you

#18


to:Friecin(雪客) 
      很高兴又看到你回帖了,对你那段代码理解确实有点偏差,我以为:TfrmSys相当于Form1,frmMain相当于Form2,现在看来frmMain才是相当于Form1.

我重新试验了一下,你的方法确实没有我说的那两种问题。但有这样两个缺点:
1.如果有多个Form1且Form1上ShowModal了Form2,那么这多个Form1之间不能切换。
2.我希望我的主窗体能最小化,最大化,WS_EX_TOOLWINDOW风格的窗体不能做到这一点。我换了几种别的风格,在程序启动后任务栏上有两个标题,只有WS_EX_TOOLWINDOW风格的有一个标题。

如果你有兴趣的话,我可以把我的测试程序发给你看看。
我还想问一下:你是从哪里找到这个方法的?

#19


MS 在 Win2000里面增加了支持MTI窗口的功能,原来是SDI, MDI,你看看MS Office 现在样子就知道了,他不再是MDI了,但是他却能在Windows菜单里面枚举,可能就是你需要的。

#20


mark

#21


学习

#22


学习

#23


www.netspider.8u8.com/xfiles.rar

你看看是不是你要的效果。

#24


蹭分

#25


to:Friecin(雪客) 
    大体是我要的效果,但美中不足的是:
   你先打开主界面,点两下New按钮,任务栏就有了两个Docment,我把它称为
Docment1和Docment2,在Docment1中点右边的Browse按钮,你看看还能切换到Docment2吗?

#26


这是个问题!我尝试解决。

#27


http://www.delphibbs.com/delphibbs/dispq.asp?lid=1799653
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1679831

#28


网易泡泡,Foxmail,MSN都实现了这种效果,但怎么就很少人知道实现方法呢?