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里用非模式方法打开的窗体
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();
}
{
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;
}
//重载窗体创建的属性,将窗体置于屏幕最前端
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失去焦点。"
你的主窗体一定要动态创建,前例的frmMain;而且要在调用他的窗体中(可以隐藏)中,写入如上代码,否在就出现 "如果以ShowModal方式打开另外的窗体Form2,切换到别的窗体,再切换回来就看不见Form2,且Form1失去焦点。"
#14
to: GeoPhoenix(天鸽)
My email: yangbing@trasin.net
thanks very much.
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且不出现在任务栏.
双击一个联系人就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,你所强调的好象不是什么问题。(这段代码,是我发布的共享软件中的代码,没有问题的!)
那你简单的用
TForm2 *Form2=new TForm2(NULL);
Form2->ShowModal();
delete Form2;
不就可以了???????????
我给你的例子中frmMain是手动加载的,而frmSys则是自动加载的,并且是系统的主窗体,所调手动创建的frmMain中,可以以任何方式打开任何窗体?没有问题的,其程序效果类似Dreamweaver 4,你所强调的好象不是什么问题。(这段代码,是我发布的共享软件中的代码,没有问题的!)
#17
还有,我很了解你的意思:你一定是遇到了ShowModal()后的窗体会隐藏到调用他的窗体下面,我前面的例子就是解决这个问题的,很完美的!除非你没有理解代码的含义。
i fu le you
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风格的有一个标题。
如果你有兴趣的话,我可以把我的测试程序发给你看看。
我还想问一下:你是从哪里找到这个方法的?
很高兴又看到你回帖了,对你那段代码理解确实有点偏差,我以为: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吗?
大体是我要的效果,但美中不足的是:
你先打开主界面,点两下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
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里用非模式方法打开的窗体
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();
}
{
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;
}
//重载窗体创建的属性,将窗体置于屏幕最前端
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失去焦点。"
你的主窗体一定要动态创建,前例的frmMain;而且要在调用他的窗体中(可以隐藏)中,写入如上代码,否在就出现 "如果以ShowModal方式打开另外的窗体Form2,切换到别的窗体,再切换回来就看不见Form2,且Form1失去焦点。"
#14
to: GeoPhoenix(天鸽)
My email: yangbing@trasin.net
thanks very much.
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且不出现在任务栏.
双击一个联系人就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,你所强调的好象不是什么问题。(这段代码,是我发布的共享软件中的代码,没有问题的!)
那你简单的用
TForm2 *Form2=new TForm2(NULL);
Form2->ShowModal();
delete Form2;
不就可以了???????????
我给你的例子中frmMain是手动加载的,而frmSys则是自动加载的,并且是系统的主窗体,所调手动创建的frmMain中,可以以任何方式打开任何窗体?没有问题的,其程序效果类似Dreamweaver 4,你所强调的好象不是什么问题。(这段代码,是我发布的共享软件中的代码,没有问题的!)
#17
还有,我很了解你的意思:你一定是遇到了ShowModal()后的窗体会隐藏到调用他的窗体下面,我前面的例子就是解决这个问题的,很完美的!除非你没有理解代码的含义。
i fu le you
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风格的有一个标题。
如果你有兴趣的话,我可以把我的测试程序发给你看看。
我还想问一下:你是从哪里找到这个方法的?
很高兴又看到你回帖了,对你那段代码理解确实有点偏差,我以为: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吗?
大体是我要的效果,但美中不足的是:
你先打开主界面,点两下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
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1679831
#28
网易泡泡,Foxmail,MSN都实现了这种效果,但怎么就很少人知道实现方法呢?