如何对齐Windows Media Player控件以适合父窗口?

问题描述 投票:2回答:1

我具有Windows媒体播放器ActiveX控件。我希望它与其父级TPanel对齐。无论我尝试什么WMP控件,始终将其设置为初始大小而无法调整大小的问题。

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
    Panel: TPanel;
    MP: TWindowsMediaPlayer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Width := 450;
  Height := 260;

  Panel := TPanel.Create(Self);
  Panel.Parent := Self;
  Panel.Align := alClient;


  MP := TWindowsMediaPlayer.Create(Self);
  // MP.stretchToFit := True;
  MP.Parent := Panel;
  MP.Align := alClient;
  MP.URL := 'https://www.w3schools.com/html/mov_bbb.mp4';
end;

当您打开表单时,WMP控件看起来不错:

enter image description here

但是,当您调整窗体的大小时,WMP控件将无法与父面板对齐:

enter image description here

这实际上是我尝试放大时看到的效果:

enter image description here

如何使WMP控件表现出预期的效果?

我尝试过许多愚蠢的事情,例如:

procedure TForm1.FormResize(Sender: TObject);
begin
  if not Assigned(MP) then Exit;
  MP.Width := Panel.ClientWidth;
  MP.Height := Panel.ClientHeight;
  Panel.Realign;
end;

但是没有任何效果!在此先感谢您的帮助。

delphi delphi-7 windows-media-player wmp
1个回答
0
投票

这是OleCtrls中Delphi 7 TOleControl.SetBounds中的错误。它已在较新版本中修复。

procedure TOleControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var
  LRect: TRect;
begin
  if ((AWidth <> Width) and (Width > 0)) or ((AHeight <> Height) and (Height > 0)) then
  begin
    if (FMiscStatus and OLEMISC_INVISIBLEATRUNTIME <> 0) or
      ((FOleObject.SetExtent(DVASPECT_CONTENT, Point(
        MulDiv(AWidth, 2540, Screen.PixelsPerInch),
        MulDiv(AHeight, 2540, Screen.PixelsPerInch))) <> S_OK)) then
    begin
      AWidth := Width;
      AHeight := Height;
    end;
    { fix start }
    if FOleInplaceObject <> nil then 
    begin
      LRect := Rect(Left, Top, AWidth, AHeight);
      FOleInplaceObject.SetObjectRects(LRect, LRect);
    end;
    { fix end }
  end;
  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;

将其应用于OleCtrls的本地副本后,一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.