EXE中调用融合DLL窗体,一直在EXE大小变化的时候,DLL窗体不会有变化。
现解决了记录下,供大家参考,有更加好的方式也贴出来让大家分享分享。
procedure tabSheetOnResize(Sender: TObject);
procedure TForm1.tabSheetOnResize(Sender: TObject);
begin
  if Sender is TRzTabSheet then
  begin
    // tabSheet发生大小时 发送消息给 子窗体  子窗体大小tabSheet变化
    if TRzTabSheet(Sender).Tag <> 0 then
    begin
      SendMessage(Integer(TRzTabSheet(Sender).Tag), WM_USER + 100,
        TRzTabSheet(Sender).ClientWidth, TRzTabSheet(Sender).ClientHeight);
    end;
  end;
end;
----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  AddFrmTrue
end;
function TForm1.AddFrmTrue: Boolean;
var
  tpage:TRzTabSheet;
  aFormClass : TFormClass;
begin
    tpage := TRzTabSheet.Create(RzPageControl1);
    tpage.PageControl := RzPageControl1;
    aFormClass := ShowForm(Application,tpage);
    aForm := aFormClass.Create(tpage);
    windows.SetParent(aForm.Handle,tpage.Handle);
    aForm.Show;
    tpage.Tag:= aForm.Handle;
    tpage.Caption:=IntToStr(tpage.Tag) ;
    RzPageControl1.ActivePage:=tpage;
    tpage.OnResize:=tabSheetOnResize;
    tpage.OnResize(tpage);
end;
子窗体
DLL
procedure ChangeMsg(var msg: TMessage); message WM_USER + 100;procedure TFormA.ChangeMsg(var msg: TMessage);
begin
  self.Width := msg.WParam;
  self.Height := msg.LParam;
  SetWindowPos(self.Handle, 0, 0, 0, self.Width, self.Height, SWP_NOSIZE);
end;

解决方案 »

  1.   

    依据dll窗口句柄,直接SetWindowPos改变大小,不用每个dll窗口都处理这种消息。
      

  2.   


    不用每个dll窗口都处理这种消息。 是什么意思呢
      

  3.   


    不用每个dll窗口都处理这种消息。 是什么意思呢
    你不是 都搞了WM_USER + 100这种消息。另,这种声明最好统一放一个位置,避免冲突。
      

  4.   


    不用每个dll窗口都处理这种消息。 是什么意思呢
    你不是 都搞了WM_USER + 100这种消息。另,这种声明最好统一放一个位置,避免冲突。
    procedure TForm1.tabSheetOnResize(Sender: TObject);
    begin
      if Sender is TRzTabSheet then
      begin
        // tabSheet发生大小时 发送消息给 子窗体  子窗体大小tabSheet变化
        if TRzTabSheet(Sender).Tag <> 0 then
        begin
          SendMessage(Integer(TRzTabSheet(Sender).Tag), WM_USER + 100,
            TRzTabSheet(Sender).ClientWidth, TRzTabSheet(Sender).ClientHeight);
        end;
      end;
    end;
    谢谢版主啊。我其实把这里修改一下:SetWindowPos(Integer(TRzTabSheet(Sender).Tag), HWND_TOP, 0, 0, TRzTabSheet(Sender).Width, TRzTabSheet(Sender).Height, SWP_SHOWWINDOW) ;SWP_NOSIZE换成 SWP_SHOWWINDOW就不用到DLL窗体里面去处理了。
    没看明白这个参数
      

  5.   

    相关API介绍,就看看MSDN
      

  6.   


    不用每个dll窗口都处理这种消息。 是什么意思呢
    你不是 都搞了WM_USER + 100这种消息。另,这种声明最好统一放一个位置,避免冲突。
    procedure TForm1.tabSheetOnResize(Sender: TObject);
    begin
      if Sender is TRzTabSheet then
      begin
        // tabSheet发生大小时 发送消息给 子窗体  子窗体大小tabSheet变化
        if TRzTabSheet(Sender).Tag <> 0 then
        begin
          SendMessage(Integer(TRzTabSheet(Sender).Tag), WM_USER + 100,
            TRzTabSheet(Sender).ClientWidth, TRzTabSheet(Sender).ClientHeight);
        end;
      end;
    end;
    谢谢版主啊。我其实把这里修改一下:SetWindowPos(Integer(TRzTabSheet(Sender).Tag), HWND_TOP, 0, 0, TRzTabSheet(Sender).Width, TRzTabSheet(Sender).Height, SWP_SHOWWINDOW) ;SWP_NOSIZE换成 SWP_SHOWWINDOW就不用到DLL窗体里面去处理了。
    没看明白这个参数
    这个API功能不错。学习了