请问有人知道如何制作FoxMail的写新邮件那样的窗口吗?(100分)

  • 主题发起人 主题发起人 zqw0117
  • 开始时间 开始时间
Z

zqw0117

Unregistered / Unconfirmed
GUEST, unregistred user!
FoxMail中的写新邮件、回复邮件、转发邮件、地址簿等窗口弹出的时候,任务栏上就会多出
一个表示该窗口的按钮(就像一个新的应用程序在运行一样),而且你可以把主窗口最小化,
而弹出的子窗口保留在任务栏上,还可以进行切换。请问这样的窗口该如何做?谢谢!

多说一句,我已经找到了用重载CreateParams过程的方法实现了让子窗口出现在任务栏上,
但是我的主窗口的任务栏按钮总是处于按下状态(FoxMail中却不是这样),而且主窗口被
最小化的话,子窗口也会消失不见。不知这是为什么?特请假各位大虾!小弟再次谢过!
 
你说的是托盘嘛??子父窗口控制关键控制好句柄不就可以了?
 
to rockjie:
我说的不是系统托盘图标,而是任务栏按钮。简单的说,你启动一个你写的Project1.exe
文件,任务栏上就会出现一个Project1的按钮,表示这个应用程序。如果你此刻启动另外
一个Project2.exe程序,任务栏上又会出现一个Project2的按钮,表示第二个程序。你可以
通过点击任务栏按钮在Project1和Project2两个程序之间切换。但是如果您的Project1或者
Project2两个程序自己创建一个子窗口,那么任务栏上还是只有Project1和Project2两个按钮。
但是Foxmail中,如果你点击新建邮件按钮,你会发现任务栏上除了有一个Foxmail的按钮外,
还出现了一个"新邮件"的窗口,你可以通过点击这两个按钮在Foxmail主窗口和"新邮件"窗口
之间切换。我问的就是如何实现这样的功能。另外说明的是,我已经知道如何让子窗口像主
窗口那样在任务栏显示表示的按钮的方法。但是我的主窗口按钮却总是处于按下状态,Foxmail
中却是你选择哪个窗口,代表哪个窗口的按钮才处于按下状态,主窗口也是如此。我需要
知道这是如何做到的!谢谢!请知道的大虾帮帮我!
 
哦,你说的就是那种MSN也带的功能啊,简单的做法,2个窗体一个工程啊,加上之间切换嘛!
复杂点2个应用shellExecute嘛!~
 
关键不是两个工程的问题,是一个工程中的两个窗口的问题。例如Form1是主窗口、Form2是
子窗口,我要求弹出Form2时任务栏上也有按钮,而且这时Form1主窗口的按钮可以弹起来
(不是处于按下状态),然后Form2最小化时会缩小到任务栏上。再说明一下,我已经知道如何
让Form2在任务栏上显示按钮,但是关键是Form2弹出后,Form1的任务栏按钮总是处于按下
状态,如何能让它起来?Foxmail的主窗口和子窗口的按钮是可以弹起的。而且Foxmail主
窗口最小化后,子窗口还是可以被显示出来。而我的程序Form1被最小化后,Form2也被
隐藏了。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
Procedure CreateParams(Var Params: TCreateParams); Override;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ Private declarations }

Procedure TForm1.CreateParams(Var Params: TCreateParams);
Begin
Inherited CreateParams(Params);
With Params Do exStyle := exStyle Or WS_EX_APPWINDOW;
end;

end.
//////////////
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm2 = class(TForm)
private
{ Private declarations }
Procedure CreateParams(Var Params: TCreateParams); Override;
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

{ Private declarations }

Procedure TForm2.CreateParams(Var Params: TCreateParams);
Begin
Inherited CreateParams(Params);
With Params Do exStyle := exStyle Or WS_EX_APPWINDOW;
end;

end.
 
to wr960204:
谢谢您的代码,我的方法和您的一样,而且这些我都知道。您运行一下您的程序看看,发现问题
了吗?(怪我上面描述错误,应该是子窗口的按钮处于按下状态,而且无法切换回主窗口)
您的子窗口被显示出来后,再怎么点击主窗口按钮都无效的!

不过刚才经过我的摸索,在Params中加入下面一句:WNDParent:=0就可以实现效果了!

答案我自己找到了!!!!!

to 本版斑竹:
我可以拿回我自己的分数吗?因为问题是我自己解决的!
 
楼上的大虾:我还遇到一个问题,那就是弹出的Form1被隐藏后,代表Form1的按钮却还在,怎么回事?

反正分数拿不回了,答对就给分。
 
你也太赖了.
你看到的不是Form1的.而是Application的.把它隐藏就行了.
在工程中加入
uses
Windows,
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
把Application的任务栏按钮隐藏.

procedure CreateParams(var Params: TCreateParams); override;
来显示主窗体的任务栏按钮.
这样就可以了.例如:

program Project1;

uses
Windows,
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
Application.Initialize;
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure CreateParams(var Params: TCreateParams); override;
public
{ Public declarations }
end;

var
Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin

exStyle := exStyle or WS_EX_APPWINDOW;
WndParent := 0;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Hide;
end;
 
to wr960204:
哦,不是我懒,是真的不知道!太惭愧了!
我下去试试,成功就给分。先谢谢您了!!
 
to wr960204:
谢谢您!以后还请您多多赐教!
 
后退
顶部