• 0
Авторизация  
sergey999

встраивание Fire Monkey в Windows приложение

Вопросы

Подскажите пожалуйста, каким образом можно встроить фрейм Fire Monkey в окно Windows приложения в DLL?  Есть HWND родительского окна и форма Fire Monkey должна отображаться как дочернее окно. Если возможно дать ссылку на пример C++ Builder XE7. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 ответа на этот вопрос

  • 0

Посмотри у GunSmoker, но только для Delphi. Там довольно хорошо разжевано. И есть рабочий пример. Однако на XE7, он не пошел (как всегда уже все поменяли).  Но по крайней мере ты поймешь как и что надо делать.

http://www.gunsmoker.ru/2011/12/delphi.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Делаем так, в dll метод создания формы может быть таким

procedure Init(ParentWindow: HWND; const Rect: Windows.TRect); stdcall;
begin
  try
    StartupInput.DebugEventCallback := nil;
    StartupInput.SuppressBackgroundThread := False;
    StartupInput.SuppressExternalCodecs   := False;
    StartupInput.GdiplusVersion := 1;
    GdiplusStartup(gdiplusToken, @StartupInput, nil);

    Form1 := TForm1.Create(nil);
    Form1.Show;

    if ParentWindow <> 0 then
    begin
      //Скроем иконку приложения с панели задач
      ShowWindow(ApplicationHWND, SW_HIDE);

      //Сменим стиль окна что бы оно не перехватывало фокус с родительского окна
      SetWindowLong(FmxHandleToHWND(Form1.Handle), GWL_STYLE,
        GetWindowLong(FmxHandleToHWND(Form1.Handle), GWL_STYLE) and (not WS_POPUP) OR WS_CHILD);

      //Встроим окно в родительское
      Windows.SetParent(FmxHandleToHWND(Form1.Handle), ParentWindow);

      //Установим размеры окна такими которыми инициализирована DLL
      SetWindowPos(FmxHandleToHWND(Form1.Handle), 0, Rect.Left, Rect.Top,
        RectWidth(Rect), RectHeight(Rect), 0);
    end;
  except
    on E: Exception do
      MessageBox(0, PChar(E.Message), '', 0);
  end;
end;

Эта функция создаст форму и встроит ее на хост в vcl приложении. У формы в dfm должен быть убраны границы что бы оно вписалось. Так же для того что бы форма изменяла размеры вписываясь в хост экспортируем функцию получения хэндла

function GetFormHandle: HWND; stdcall;
begin
  Result := 0;

  try
    Result := FormToHWND(Form1);
  except
    on E: Exception do
      MessageBox(0, PChar(E.Message), '', 0);
  end;
end;

Собственно в хосте загружаем dll, и создаем форму кидая ее на панель 

Init(panel1.Handle, panel1.ClientRect);

Что бы форма меняла размер как и панель - нужно создать обработчик изменения размеров панели и там менять размер встроенной формы

procedure THostForm.Panel1Resize(Sender: TObject);
var
  h: HWND;
  Rect: Windows.TRect;
begin
  h := 0;
  Rect := Panel1.ClientRect;

  if Assigned(FGetFormHandleProc) then
    h := FGetFormHandleProc;

  if h <> 0 then
    SetWindowPos(h, 0, Rect.Left, Rect.Top,
      RectWidth(Rect), RectHeight(Rect), 0);
end;

 

Вот так получается втсроить FMX форму из Dll в VCL приложение

Изменено пользователем vic85

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу