DLL窗口的控制总结 (

1.DLL子窗口的式样必须设置为无框(BORDERSTYLE:=BSNONE;FORMSTYLE:=FSNORMAL)可以在DLL.DPR中代码控制
 
2.DLL.DPR代码
 
{$R *.res}
var
  DLLApp: TApplication;
  DLLScr: TScreen;

function CreateDLLForm(App: TApplication;Scr:TScreen;Left:Integer=0;Top:Integer=0;Width:Integer=0;Height:Integer=0):TForm;
var
  ptr:PLongInt;
begin
  Application := App;
  Screen := Scr;
  frmDLLForm :=TfrmDllForm.Create(Application);
  //Application.CreateForm(TfrmDLLForm, frmDLLForm);
  frmDLLForm.Top :=Top;
  frmDLLForm.Left:=Left;
  frmDLLForm.Width :=Width;
  frmDLLForm.Height:=Height;
  frmDLLForm.BorderStyle :=bsNone;
  frmDLLForm.FormStyle    :=fsNormal;
//  frmDLLForm.Show; //定位好后在调用时候显示可以防止窗口忽闪
  Result:=frmDLLForm;
end;
 
procedure ExitDLL(Reason: Integer);
begin
  if Reason = DLL_PROCESS_DETACH then
  begin
      Application := DLLApp;
      Screen := DLLScr;
  end;
end;

exports
  CreateDLLForm;
begin
  DLLApp := Application;
  DLLScr := Screen;
  DLLProc := @ExitDLL;
end.

 
3.Exe.DPR主窗口调用代码
type
  InvokeDLLForm = function(App: TApplication;Scr: TScreen): TForm;
  InvokeDLLForm = function(App:TApplication; Scr:TScreen;Left,Top,Width,Height:Integer):TForm ;//都可以
var
  frmMain: TfrmMain;
  DLLForm: TForm;
implementation

{$R *.dfm}
procedure TForm1.Panel1Click(Sender:TObject);
var
  DLLHandle: THandle;
  DLLSub: InvokeDLLForm;
begin
  DLLHandle :=LoadLibrary('SysNewsRead.dll');
  if DLLHandle <> 0 then
  begin
      @DLLSub :=GetProcAddress(DLLHandle, 'CreateDLLForm');
      if Assigned(DLLSub) then
      begin
          if not Assigned(DllForm) then
          begin
                DLLForm:= DLLSub(Application,Screen,Panel1.Left,Panel1.Top,Panel1.Width,Panel1.Height);
            SetWindowPos(DLLForm.Handle, 0, 0, 0, Panel1.Width ,Panel1.Height, SWP_NOZORDER);//可以去掉
       DllForm.ParentWindow:=Panel1.Handle;//将容器设置为父窗口
       windows.SetParent(DLLForm.Handle,Panel1.Handle);
                DllForm.Show;//这里显示出窗口
        end;
      end;
  end;
end;
procedure TForm1.ApplicationEvents1Messag e(varMsg: tagMSG;var Handled:Boolean);
begin
  if Assigned(DllForm) then      ifIsDialogMessage(DLLForm.Handle,Msg)thenHandled:=True ;//通过该代码转发DLL窗口的消息。
end;
 
procedure TForm1.Panel1Enter(Sender:TObject);
begin
//将DLL窗口设置为前景窗口 
  SetForegroundWindow(DllForm.Handle);
  Windows.SetFocus(DllForm.Handle);
end;
procedure TForm1.Panel1Resize(Sender:TObject);
begin
  if Assigned(DllForm) then
          SetWindowPos(DLLForm.Handle, 0, 0,0, Panel1.Width , Panel1.Height, SWP_NOZORDER);
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值