Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.09.2019, 22:11
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Sumatra PDF Reader

Здравствуйте уважаемые!

Нашёл в интернете код, который отрисовывает окно программы SumatraPDF на панели формы. Всё переписал вроде бы верно, задал константу, прописал все процедуры. Но чего-то получается не то, что должно быть в итоге. Приложение запускается, программа запускается тоже, файл открывает, НО.....она отображается не на панели, а вне её, как отдельное окно. Вот код собственно:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

const
  Sumatra = 'c:\Test\SumatraPDF.exe';

type
  TForm1 = class(TForm)
    p: TPanel;
    bFile: TButton;
    OpenDialog1: TOpenDialog;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure bFileClick(Sender: TObject);
    procedure pResize(Sender: TObject);
  private
    { Private declarations }
    function StartApp(App: string): TProcessInformation;
    procedure AlignToPanel(const WND: THandle; var Panel: TPanel);
    procedure SetToPanel(const WND: Cardinal; var Panel: TPanel);
    procedure ViewApp;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if p.Tag <> 0 then
    SendMessage(p.Tag, WM_CLOSE, 0, 0);
end;

procedure TForm1.bFileClick(Sender: TObject);
begin
  OpenDialog1.FileName := bFile.Caption;
  if OpenDialog1.Execute then
  begin
    TButton(Sender).Caption := OpenDialog1.FileName;
    ViewApp;
  end;
end;

procedure TForm1.pResize(Sender: TObject);
begin
  AlignToPanel(p.Tag, p);
end;

procedure TForm1.ViewApp;
var
  pi: TProcessInformation;
begin
  pi := StartApp(Sumatra + ' "' + bFile.Caption + '"');
  Sleep(500);

    
  p.Tag := FindWindow(PAnsiChar('SUMATRA_PDF_FRAME'), PAnsiChar(SysUtils.ExtractFileName(bFile.Caption) + ' - SumatraPDF'));
  SetToPanel(p.Tag, p);
end;

procedure TForm1.AlignToPanel(const WND: THandle; var Panel: TPanel);
begin
  if (WND = 0) or (Panel = nil) then
    Exit;
  SetWindowPos(WND, HWND_TOP, Panel.ClientRect.Left, Panel.ClientRect.Top, Panel.ClientRect.Right, Panel.ClientRect.Bottom, SWP_SHOWWINDOW);
end;

procedure TForm1.SetToPanel(const WND: Cardinal; var Panel: TPanel);
begin
  if (WND = 0) or (Panel = nil) then
    Exit;
  Windows.SetParent(WND, Panel.Handle);
{
  SetWindowLong(WND, GWL_STYLE, GetWindowLong(Wnd, GWL_STYLE)
    + WS_MAXIMIZE - WS_BORDER - WS_CAPTION - WS_SYSMENU - WS_THICKFRAME
  );
  SetWindowLong(WND, GWL_EXSTYLE, GetWindowLong(Wnd, GWL_EXSTYLE)
    + WS_EX_CONTROLPARENT - WS_EX_TOOLWINDOW + WS_EX_MDICHILD
  );
}
  SetWindowLong(WND, GWL_STYLE, $56000000);  // STYLE like Panel
  SetWindowLong(WND, GWL_EXSTYLE, $00010200);
  SetWindowPos(WND, HWND_TOP, Panel.ClientRect.Left, Panel.ClientRect.Top, Panel.ClientRect.Right, Panel.ClientRect.Bottom, SWP_SHOWWINDOW);
  Panel.Tag := WND;
end;

function TForm1.StartApp(App: string): TProcessInformation;
var
  si: TStartupInfo;
  sa: TSecurityAttributes;
begin
  GetStartupInfo(si);
  FillChar(si, SizeOf(si), #0);
  si.cb := SizeOf(si);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := 0; //SW_HIDE; //SW_SHOWNORMAL;
  FillChar(sa, SizeOf(sa), #0);
  sa.nLength := SizeOf(SECURITY_ATTRIBUTES);
  sa.bInheritHandle := true;
  sa.lpSecurityDescriptor := nil;
  if not CreateProcess(nil,                 // Module Name Pointer
    PAnsiChar(App),      // Command Line Pointer
    nil,                 // Process Security Attributes Pointer
    nil,                 // Thread Security Attributes Pointer
    true,                // Inheritance Flag
    CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS, //Creation Flags
    nil,                 // Environment Block Pointer
    nil,                 // Current Directory Pointer
    si, Result) then
    RaiseLastOSError;
end;

end.

Тестовый проект прилагаю - Test.7z
Должно получиться что-то подобное Должно.JPG А получается окно вне формы. Что тут не так?
Ответить с цитированием
  #2  
Старый 15.09.2019, 22:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,495
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Отследи что возвращает FindWindow. Похоже, что просто не находит окно, соотв, устанавливает родителем десктоп.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
LIONSMILE (21.09.2019)
  #3  
Старый 21.09.2019, 11:44
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да, всё верно, изменил поиск только по классу окна, второй параметр оставил пустым и всё заработало.
Код:
p.Tag := FindWindow('SUMATRA_PDF_FRAME', nil);
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter