Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


sergey999

Вопрос

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

Ссылка на комментарий

Рекомендуемые сообщения

  • 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
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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