我写了个窗体基类,对你有用 代码如下 unit ChildFrm;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus,math,typinfo,DBCtrls ,dbGrids,DBGridEh,ComCtrls; const ScreenHeight=768; //根据你设计时的屏幕分辩率设定 Screenwidth =1024; type TChildForm = class(TForm) Panel1: TPanel; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormDestroy(Sender: TObject); procedure WMWindowPosChanging(var msg:TWMWindowPosChanging); message WM_WINDOWPOSCHANGING; procedure FormResize(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); private FAsChild: Boolean; FTempParent: TWinControl; procedure CentalPanel; procedure SetScaleBy; //自适应分辨率 Procedure SetColor; 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 overriden to return either the main menu // of the form, or nil. function GetFormMenu: TMainMenu; virtual; abstract; function CanChange: Boolean; virtual; end;var ChildForm: TChildForm;implementationuses Main;{$R *.DFM} procedure TChildForm.CentalPanel; var i:Integer; begin if (panel1.Visible) or (panel1.Tag<>0) then begin if panel1.Width < ClientWidth then panel1.Left := (ClientWidth - panel1.Width ) div 2 else panel1.Left := 0; if panel1.Height <ClientHeight then panel1.Top :=(ClientHeight - panel1.Height ) div 2 else panel1.Top := 0; end else begin for i:=0 to self.ComponentCount-1 do begin if (self.Components[i] is Tpanel ) then begin if (((self.Components[i] As Tpanel ).Parent) is TTabSheet) And ((self.Components[i] As Tpanel ).Tag=1)then begin if (self.Components[i] As Tpanel ).Width < (((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientWidth then (self.Components[i] As Tpanel ).Left := ((((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientWidth - (self.Components[i] As Tpanel ).Width ) div 2 else (self.Components[i] As Tpanel ).Left := 0; if (self.Components[i] As Tpanel ).Height <(((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientHeight then (self.Components[i] As Tpanel ).Top :=((((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientHeight - (self.Components[i] As Tpanel ).Height ) div 2 else (self.Components[i] As Tpanel ).Top := 0; end; end; end; end; //SetScaleBy; end; procedure TChildForm.SetScaleBy; //自适应分辨率 var i :integer; begin if (screen.width <> ScreenWidth) then begin height := longint(height) * longint(screen.height) DIV ScreenHeight; width := longint(width) * longint(screen.width) DIV ScreenWidth; scaleBy(screen.width, ScreenWidth); End ; for i := componentCount - 1 downto 0 do with components[i] do begin if GetPropInfo(ClassInfo, 'font') <> nil then font.size := (screen.width DIV screenwidth) * font.size; end; end; procedure TChildForm.WMWindowPosChanging(var msg:TWMWindowPosChanging); var CaptionHeight:integer; begin CaptionHeight := GetSystemMetrics(SM_CYCAPTION); msg.WindowPos ^.cx :=Max(msg.WindowPos ^.cx,panel1.Width+20); msg.WindowPos ^.cy :=Max(msg.WindowPos ^.cy,panel1.Height+20+CaptionHeight); inherited; end;constructor TChildForm.Create(AOwner: TComponent); begin FAsChild := False; inherited Create(AOwner); SetScaleBy; end;constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl); begin FAsChild := True; FTempParent := aParent; inherited Create(AOwner); SetScaleBy; SetColor; 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;procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction); begin action :=cafree; end;procedure TChildForm.FormDestroy(Sender: TObject); begin ChildForm :=nil; end;procedure TChildForm.FormResize(Sender: TObject); begin CentalPanel; end;procedure TChildForm.FormKeyPress(Sender: TObject; var Key: Char); begin {if Key = #13 Then Begin SelectNext(ActiveControl,True,True); Key := #0; End;} end;procedure TChildForm.SetColor; var i,j:integer; begin Panel1.Color:=$00F8E4D8; for i:=0 to self.ControlCount-1 do begin //$00F8E4D8
If (self.Components[i] is TEdit) tHEN Begin (self.Components[i] As TEdit).ImeName:=screen.DefaultIme; End; If (self.Components[i] is TDbEdit) tHEN Begin (self.Components[i] As TdbEdit).ImeName:=screen.DefaultIme; End; If (self.Components[i] is TDBGrid) tHEN Begin For j:=0 to (self.Components[i] As TDBGrid).Columns.Count-1 do Begin (self.Components[i] As TDBGrid).Columns.Items[j].ImeName:=screen.DefaultIme; End; End; If (self.Components[i] is TDBGridEh) tHEN Begin For j:=0 to (self.Components[i] As TDBGridEh).Columns.Count-1 do Begin (self.Components[i] As TDBGridEh).Columns.Items[j].ImeName:=screen.DefaultIme; End; End; end;end;end.
没楼上楼上这么麻烦吧?uses shellapi;procedure TForm1.Button2Click(Sender: TObject); var hSndrec32: HWND; begin hSndrec32 := WIndows.FindWindow(nil, '声音 - 录音机'); if hSndrec32<>0 then begin Windows.SetParent(hSndrec32, Panel1.Handle); Windows.MoveWindow(hSndrec32, 0, 0,panel1.Width,panel1.Height,true); end else showmessage('未发现该程序!'); end;procedure TForm1.FormCreate(Sender: TObject); begin shellexecute(handle,'open','sndrec32.exe',nil,nil,sw_shownormal); end;
能行吗
在Frame里放你的组件,编写你的代码.
然后组件面板上的Standard页面上找Frames组件放到容器窗口上,列表里选择刚才创建的窗口.
代码如下 unit ChildFrm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, Menus,math,typinfo,DBCtrls
,dbGrids,DBGridEh,ComCtrls;
const
ScreenHeight=768; //根据你设计时的屏幕分辩率设定
Screenwidth =1024;
type TChildForm = class(TForm)
Panel1: TPanel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure WMWindowPosChanging(var msg:TWMWindowPosChanging);
message WM_WINDOWPOSCHANGING;
procedure FormResize(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
FAsChild: Boolean;
FTempParent: TWinControl;
procedure CentalPanel;
procedure SetScaleBy; //自适应分辨率
Procedure SetColor;
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 overriden to return either the main menu
// of the form, or nil.
function GetFormMenu: TMainMenu; virtual; abstract;
function CanChange: Boolean; virtual;
end;var
ChildForm: TChildForm;implementationuses Main;{$R *.DFM}
procedure TChildForm.CentalPanel;
var
i:Integer;
begin
if (panel1.Visible) or (panel1.Tag<>0) then
begin
if panel1.Width < ClientWidth then
panel1.Left := (ClientWidth - panel1.Width ) div 2
else
panel1.Left := 0;
if panel1.Height <ClientHeight then
panel1.Top :=(ClientHeight - panel1.Height ) div 2
else
panel1.Top := 0;
end else
begin
for i:=0 to self.ComponentCount-1 do
begin
if (self.Components[i] is Tpanel ) then
begin
if (((self.Components[i] As Tpanel ).Parent) is TTabSheet) And ((self.Components[i] As Tpanel ).Tag=1)then
begin
if (self.Components[i] As Tpanel ).Width < (((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientWidth then
(self.Components[i] As Tpanel ).Left := ((((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientWidth - (self.Components[i] As Tpanel ).Width ) div 2
else
(self.Components[i] As Tpanel ).Left := 0;
if (self.Components[i] As Tpanel ).Height <(((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientHeight then
(self.Components[i] As Tpanel ).Top :=((((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientHeight - (self.Components[i] As Tpanel ).Height ) div 2
else
(self.Components[i] As Tpanel ).Top := 0;
end;
end;
end;
end;
//SetScaleBy;
end;
procedure TChildForm.SetScaleBy; //自适应分辨率
var
i :integer;
begin
if (screen.width <> ScreenWidth) then
begin
height := longint(height) * longint(screen.height) DIV ScreenHeight;
width := longint(width) * longint(screen.width) DIV ScreenWidth;
scaleBy(screen.width, ScreenWidth);
End ;
for i := componentCount - 1 downto 0 do
with components[i] do
begin
if GetPropInfo(ClassInfo, 'font') <> nil then
font.size := (screen.width DIV screenwidth) * font.size;
end;
end;
procedure TChildForm.WMWindowPosChanging(var msg:TWMWindowPosChanging);
var
CaptionHeight:integer;
begin
CaptionHeight := GetSystemMetrics(SM_CYCAPTION);
msg.WindowPos ^.cx :=Max(msg.WindowPos ^.cx,panel1.Width+20);
msg.WindowPos ^.cy :=Max(msg.WindowPos ^.cy,panel1.Height+20+CaptionHeight);
inherited;
end;constructor TChildForm.Create(AOwner: TComponent);
begin
FAsChild := False;
inherited Create(AOwner);
SetScaleBy;
end;constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
FAsChild := True;
FTempParent := aParent;
inherited Create(AOwner);
SetScaleBy;
SetColor;
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;procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action :=cafree;
end;procedure TChildForm.FormDestroy(Sender: TObject);
begin
ChildForm :=nil;
end;procedure TChildForm.FormResize(Sender: TObject);
begin
CentalPanel;
end;procedure TChildForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
{if Key = #13 Then
Begin
SelectNext(ActiveControl,True,True);
Key := #0;
End;}
end;procedure TChildForm.SetColor;
var
i,j:integer;
begin
Panel1.Color:=$00F8E4D8;
for i:=0 to self.ControlCount-1 do
begin
//$00F8E4D8
If (self.Components[i] is TEdit) tHEN
Begin
(self.Components[i] As TEdit).ImeName:=screen.DefaultIme;
End;
If (self.Components[i] is TDbEdit) tHEN
Begin
(self.Components[i] As TdbEdit).ImeName:=screen.DefaultIme;
End;
If (self.Components[i] is TDBGrid) tHEN
Begin
For j:=0 to (self.Components[i] As TDBGrid).Columns.Count-1 do
Begin
(self.Components[i] As TDBGrid).Columns.Items[j].ImeName:=screen.DefaultIme;
End;
End;
If (self.Components[i] is TDBGridEh) tHEN
Begin
For j:=0 to (self.Components[i] As TDBGridEh).Columns.Count-1 do
Begin
(self.Components[i] As TDBGridEh).Columns.Items[j].ImeName:=screen.DefaultIme;
End;
End;
end;end;end.
,也可以独立显示 (Create(AOwner: TComponent); overload; override;)!!
var hSndrec32: HWND;
begin
hSndrec32 := WIndows.FindWindow(nil, '声音 - 录音机');
if hSndrec32<>0 then
begin
Windows.SetParent(hSndrec32, Panel1.Handle);
Windows.MoveWindow(hSndrec32, 0, 0,panel1.Width,panel1.Height,true);
end
else
showmessage('未发现该程序!');
end;procedure TForm1.FormCreate(Sender: TObject);
begin
shellexecute(handle,'open','sndrec32.exe',nil,nil,sw_shownormal);
end;
这里的'声音 - 录音机''是指什么?
我只是想要把窗体显示在panel1上
但是不用frmae就没有办法吗?