Вам не нужен OleContainer для запуска презентации внутри контейнера в вашем приложении. Поместите панель контейнер для запуска презентации в вашей форме и попробуйте следующую процедуру:
procedure TForm2.Button3Click(Sender: TObject);
const
ppShowTypeSpeaker = 1;
ppShowTypeInWindow = 1000;
SHOW_FILE = 'C:\Users\jcastillo\Documents\test.pps';
var
oPPTApp: OleVariant;
oPPTPres: OleVariant;
screenClasshWnd: HWND;
pWidth, pHeight: Integer;
function PixelsToPoints(Val: Integer; Vert: Boolean): Integer;
begin
if Vert then
Result := Trunc(Val * 0.75)
else
Result := Trunc(Val * 0.75);
end;
begin
oPPTApp := CreateOleObject('PowerPoint.Application');
oPPTPres := oPPTApp.Presentations.Open(SHOW_FILE, True, True, False);
pWidth := PixelsToPoints(Panel1.Width, False);
pHeight := PixelsToPoints(Panel1.Height, True);
oPPTPres.SlideShowSettings.ShowType := ppShowTypeSpeaker;
oPPTPres.SlideShowSettings.Run.Width := pWidth;
oPPTPres.SlideShowSettings.Run.Height := pHeight;
screenClasshWnd := FindWindow('screenClass', nil);
Windows.SetParent(screenClasshWnd, Panel1.Handle);
end;
У меня нет документации, но я думаю, что Run.Width и Run.Height должны быть указаны в точках, а не в пикселях. Мое бедное решение конвертировать пиксели в точки здесь, и оно работает для меня в моих тестах здесь ... найти правильный способ конвертации в вашей среде зависит от вас.
Предполагается, что вы можете получить дескриптор окна представления из свойства oPPTPres.SlideShowSettings.Run.HWND
, но это не работает для меня, поэтому вызов FindWindow.