先请各位高手看一段源码。//******************************** dll **************************
TChildForm = class(TForm)
private
FAsChild: Boolean;
FTempParent: TWinControl;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce; overload;
{ The method below must be overridden to return either the main menu
of the form, or nil. }
function CanChange: Boolean; virtual;
{ The method below must be overridden to return a caption for this form }
function GetCaption: String; virtual; Abstract; end;constructor TChildForm.Create(AOwner: TComponent);
begin
FAsChild := False;
inherited Create(AOwner);
end;constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
if AParent <> nil then begin
FAsChild := True;
FTempParent := aParent;
end else
FAsChild := False;
inherited Create(AOwner);
end;procedure TChildForm.Loaded;
begin
inherited;
if FAsChild then begin
align := alClient;
BorderStyle := bsNone;
BorderIcons := []; //********** 注意这一句 ****************
Parent := FTempParent; Position := poDefault;
end;
end;procedure TChildForm.CreateParams(var Params: TCreateParams);
Begin
Inherited CreateParams(Params);
if FAsChild then Params.Style := Params.Style or WS_CHILD;
end;function TChildForm.CanChange: Boolean;
begin
Result := True;
end;
type
Tf_child = class(TChildForm)
Image1: TImage;
private
{ Private declarations }
public
{ Public declarations }
end;function CreateChild(AHandle: THandle; AParent: TWinControl):TChildForm; stdcall;function CreateChild(AHandle: THandle; AParent: TWinControl):TChildForm; stdcall;
var
v_Child: TChildForm;
begin
if Application.Handle <> AHandle then Application.Handle := AHandle;
v_Child := Tf_child.Create(Application, AParent);
if AParent = nil then begin
Result := nil;
try
v_Child.ShowModal;
finally
v_Child.Free;
end;
end else
Result := v_Child;
end;//******************* Dll输出 **********************
exports CreateChild;//***************** 调用 ****************************
FLocateWin := CreateChild(Application.Handle, Self);
FLocateWin.Show;
结果 子窗体已经创建,但在主窗体中没有任何显示。这是什么原因?如果将 Parent := FTempParent; 改为
ParentWindow := FTempParent.Handle;
结果会使子窗体覆盖主窗体的菜单和工具条。如果改为
ParentWindow := TForm(FTempParent).ClientHandle;
对其他TWinControl容器没有通用性,该如何解决。还有如何从动态库中调用一个MDI子窗体?希望那位大虾可以帮助我。将非常感谢。
TChildForm = class(TForm)
private
FAsChild: Boolean;
FTempParent: TWinControl;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce; overload;
{ The method below must be overridden to return either the main menu
of the form, or nil. }
function CanChange: Boolean; virtual;
{ The method below must be overridden to return a caption for this form }
function GetCaption: String; virtual; Abstract; end;constructor TChildForm.Create(AOwner: TComponent);
begin
FAsChild := False;
inherited Create(AOwner);
end;constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
if AParent <> nil then begin
FAsChild := True;
FTempParent := aParent;
end else
FAsChild := False;
inherited Create(AOwner);
end;procedure TChildForm.Loaded;
begin
inherited;
if FAsChild then begin
align := alClient;
BorderStyle := bsNone;
BorderIcons := []; //********** 注意这一句 ****************
Parent := FTempParent; Position := poDefault;
end;
end;procedure TChildForm.CreateParams(var Params: TCreateParams);
Begin
Inherited CreateParams(Params);
if FAsChild then Params.Style := Params.Style or WS_CHILD;
end;function TChildForm.CanChange: Boolean;
begin
Result := True;
end;
type
Tf_child = class(TChildForm)
Image1: TImage;
private
{ Private declarations }
public
{ Public declarations }
end;function CreateChild(AHandle: THandle; AParent: TWinControl):TChildForm; stdcall;function CreateChild(AHandle: THandle; AParent: TWinControl):TChildForm; stdcall;
var
v_Child: TChildForm;
begin
if Application.Handle <> AHandle then Application.Handle := AHandle;
v_Child := Tf_child.Create(Application, AParent);
if AParent = nil then begin
Result := nil;
try
v_Child.ShowModal;
finally
v_Child.Free;
end;
end else
Result := v_Child;
end;//******************* Dll输出 **********************
exports CreateChild;//***************** 调用 ****************************
FLocateWin := CreateChild(Application.Handle, Self);
FLocateWin.Show;
结果 子窗体已经创建,但在主窗体中没有任何显示。这是什么原因?如果将 Parent := FTempParent; 改为
ParentWindow := FTempParent.Handle;
结果会使子窗体覆盖主窗体的菜单和工具条。如果改为
ParentWindow := TForm(FTempParent).ClientHandle;
对其他TWinControl容器没有通用性,该如何解决。还有如何从动态库中调用一个MDI子窗体?希望那位大虾可以帮助我。将非常感谢。
----------------------------------------------------------------
FLocateWin := CreateChild(Application.Handle, Self);
FLocateWin.Show;
结果 子窗体已经创建,但在主窗体中没有任何显示。这是什么原因?