1 (edited by pavlenko.vladimir.v 2023-09-29 14:32:23)

Topic: сторонее приложение в форме

В общем я помещаю sumatraPDF в форму
если я использую размеры формы

SetWindowPos( h, 0, -10, -40, Form1.Width+15, Form1.Height+10, SWP_SHOWWINDOW); 

то, появляется какая-то нагрузка (или что-то в этом роде) в общем управлять формой становиться тяжело
но если не применять размеры формы

SetWindowPos( h, 0, 0, 0, 0, 0, SWP_SHOWWINDOW); 

то проблем в управлении окном не возникает
   
Так же не могу понять как убрать рамки внедряемого приложения.
 
https://drive.google.com/file/d/1b-9c-L … sp=sharing

Re: сторонее приложение в форме

pavlenko.vladimir.v wrote:

В общем я помещаю sumatraPDF в форму
если я использую размеры формы

SetWindowPos( h, 0, -10, -40, Form1.Width+15, Form1.Height+10, SWP_SHOWWINDOW); 

то, появляется какая-то нагрузка (или что-то в этом роде) в общем управлять формой становиться тяжело
но если не применять размеры формы

SetWindowPos( h, 0, 0, 0, 0, 0, SWP_SHOWWINDOW); 

то проблем в управлении окном не возникает

Походу применяешь в каком-то "попиксельном" событии...

pavlenko.vladimir.v wrote:

Так же не могу понять как убрать рамки внедряемого приложения.

Смотря какие рамки... А так вообще - SetWindowLong

3 (edited by sparrow 2023-09-29 14:01:52)

Re: сторонее приложение в форме

Попробуйте так


          SetWindowLong(h, -16, GetWindowLong(h, -16) and not 8000000 and not 40000 and not 400000 );
          SetWindowPos( h, 0, 0,0,Form1.Width, Form1.Height, SWP_SHOWWINDOW);
          SetParent( FindWindow('', 'SumatraPDF'), Form1.Handle);

Re: сторонее приложение в форме

sparrow wrote:

Попробуйте так


          SetWindowLong(h, -16, GetWindowLong(h, -16) and not 8000000 and not 40000 and not 400000 );
          SetWindowPos( h, 0, 0,0,Form1.Width, Form1.Height, SWP_SHOWWINDOW);
          SetParent( FindWindow('', 'SumatraPDF'), Form1.Handle);

 
Спасибо! До этой части я бы долго доходил ( and not 8000000 and not 40000 and not 400000 )
   
Я так понимаю, что все это (CallWindowProc, GetWindowLong, GetWindowWord, RegisterClass, SetParent, SetWindowWord, WindowProc, SetWindowLong, SetWindowPos) из одной оперы?

Re: сторонее приложение в форме

Сам учусь

В MVD определены не все константы поэтому приходится их искать. В нормальном состоянии вместо цифр
было бы GWL_STYLE где -16 и т.д.


https://learn.microsoft.com/ru-ru/windo … indowlongw

Re: сторонее приложение в форме

pavlenko.vladimir.v wrote:

если я использую размеры формы

SetWindowPos( h, 0, -10, -40, Form1.Width+15, Form1.Height+10, SWP_SHOWWINDOW); 

то, появляется какая-то нагрузка (или что-то в этом роде) в общем управлять формой становиться тяжело

Решил, не?

7 (edited by pavlenko.vladimir.v 2023-10-02 11:02:29)

Re: сторонее приложение в форме

vovka3003 wrote:

Решил, не?

вариант  от sparrow  так и оставил, вроде все работает как нужно.
Вот эту часть

 and not 8000000 and not 40000 and not 400000

Все равно не могу понять, почему такие высокие значения?..
 
Так же пытался найти информацию  по Вашему ответу ("попиксельном" событии.) , но видимо правильно искать так и не научился ((

Re: сторонее приложение в форме

Я про тормоза формы...

Re: сторонее приложение в форме

vovka3003 wrote:

Я про тормоза формы...

все ок, легко работает

Re: сторонее приложение в форме

решение попалось на одном из форумов
Теперь почитал
Высокие значения Long формат

а правильная запись

SetWindowLong(h, -16, GetWindowLong(h, -16) and not $00800000 and not $00040000 and not $00400000);

Здесь какие константы WindowStyle
https://learn.microsoft.com/en-us/windo … dow-styles

11 (edited by vovka3003 2023-10-02 14:18:16)

Re: сторонее приложение в форме

pavlenko.vladimir.v wrote:
vovka3003 wrote:

Я про тормоза формы...

все ок, легко работает

И в ресайзе с якорями?

https://i.imgur.com/56nsOBi.gif

12 (edited by pavlenko.vladimir.v 2023-10-02 14:25:20)

Re: сторонее приложение в форме

vovka3003 wrote:
pavlenko.vladimir.v wrote:
vovka3003 wrote:

Я про тормоза формы...

все ок, легко работает

И в ресайзе с якорями?

Блин, я и не заметил, я мышкой не могу менять размеры

13 (edited by vovka3003 2023-10-02 14:32:39)

Re: сторонее приложение в форме

//_OnResize
SetWindowPos( ..... , SWP_ASYNCWINDOWPOS or SWP_NOACTIVATE); 

14 (edited by pavlenko.vladimir.v 2023-10-02 14:42:45)

Re: сторонее приложение в форме

vovka3003 wrote:
//_OnResize
SetWindowPos( ..... , SWP_ASYNCWINDOWPOS or SWP_NOACTIVATE); 

SWP_NOACTIVATE - Не активизирует окно,  потому я даже и не думал его применять, думал вообще не будет работать
SWP_ASYNCWINDOWPOS - тут я думал, что не будет связи со вторым потоком, потому прошел мимо этого флажка
ну и вишенка - or,  я опять же думал, что тут вариант только с +
   
Как же еще много нужно изучать ...

Re: сторонее приложение в форме

Всем добрый день! Подскажите есть возможность поймать событие закрытия встроенного таким способом окна?

Re: сторонее приложение в форме

indigen wrote:

Всем добрый день! Подскажите есть возможность поймать событие закрытия встроенного таким способом окна?

Для чего?

Re: сторонее приложение в форме

Для того чтобы закрыть вкладку в которую программа была встроена. Не оставлять же ее пустой.

Re: сторонее приложение в форме

Вкладку?

Re: сторонее приложение в форме

Перед открытием другой программы создается экземпляр TabSheet. В него вставляется окно вызываемой программы.
При закрытии вложенной программы нужно удалить вкладку. Пример связки закинул к посту.

В примере: Запускаем, идем на вкладку Проекты -> Жмем "плюс" -> Появляется новая вкладка. На той форме есть кнопка закрыть. Если ее нажать вкладка станет пустой, а надо ее удалить.

Post's attachments

Attachment icon PMr.zip 581.86 kb, 71 downloads since 2023-10-20 

Re: сторонее приложение в форме

Уже лучше...

21 (edited by vovka3003 2023-10-20 13:45:36)

Re: сторонее приложение в форме

var
  OT:TTimer;

procedure OnTimer(Sender: TObject);
var ts:TTabSheet;
begin
  ts := TTabSheet(TWinControl(Sender).Owner);
  if GetWindowLong(ts.tag,-16)=0 then
  ts.Free;
end;

procedure Observe(ts:TTabSheet);
begin
  OT := TTimer.Create(ts);
  OT.Interval := 200;
  OT.OnTimer := @OnTimer;
end;


///////////////////////////////


//..
Tab.Tag := h;
//..
SetParent(h, Tab.Handle);
//..
Observe(Tab);
//...

https://i.imgur.com/B9t1ijQ.gif

P.S. А вообще странно, что надо убивать сначала процесс а потом вкладку... Обычно бывает наоборот.

Re: сторонее приложение в форме

Огромное спасибо! Идеально!

З.Ы. Я бы с удовольствием пошел от обратного, но у вкладок нет кнопочки "Закрыть".

Еще можно попробовать через postmessage наверно, но как создать свой обработчик не понятно (Application.OnMessage не доступен)