MediaPlayer返回错误的鼠标位置

时间:2014-07-19 20:17:00

标签: delphi mouse

我遇到了MediaPlayer组件的一个奇怪问题 这似乎是API或Delphi的错误。 我直接在Form2画布上显示视频并允许 用户在窗口内缩放和拖动视频。 我使用Form2.MouseDown和MouseUp事件进行拖动。

阻力表现不稳定,我追踪了问题 在事件中不一致地使用窗口坐标。 MPG或WMV视频(压缩)将报告MouseDown 相对于视频的坐标,但MouseUp相对 到形式。 AVI视频(未压缩)将报告两者 相对于表格。

我在Windows 7上使用Delphi XE3。 有没有其他人遇到这种异常,我怎么能 得到一致的X,Y坐标?

添加了7/20:

我不知道MCVE是什么意思,但我添加了一些代码以防万一 想尝试复制问题。 Label1& Label2报告鼠标坐标,以及视频是否移动 在(0,0)位置之外,坐标将像鼠标一样跳跃 进入或退出视频。它应该不应该这样做 始终报告相对于窗口的坐标,而不是视频。 FormMouseUp将始终相对于窗口进行报告。 FormMouseDown和FormMouseMove来回跳转。

procedure TForm1.MFLoadFileClick(Sender: TObject);
begin
  MediaPlayer1.Open;
  MediaPlayer1.Display := Form2;
end;

procedure TForm2.FormMouseDown(Sender: TObject; 
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Label1.Caption := IntToStr(X); {diag}
  Label2.Caption := IntToStr(Y); {diag}
  VidLoc := Form1.MediaPlayer1.DisplayRect;
  mX := X;   mY := Y;
  MouseDown := True;
end;

procedure TForm2.FormMouseMove(Sender: TObject; 
  Shift: TShiftState; X, Y: Integer);
begin
  Label1.Caption := IntToStr(X); {diag}
  Label2.Caption := IntToStr(Y); {diag}
end;

procedure TForm2.FormMouseUp(Sender: TObject; 
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var  VL : tRect;
begin
  Label1.Caption := IntToStr(X); {diag}
  Label2.Caption := IntToStr(Y); {diag}
  if (MouseDown and Form1.Loaded) then begin
    VL := VidLoc;
    VL.Left := VidLoc.Left - mX + X;
    VL.Top  := VidLoc.Top  - mY + Y;
    Form1.MediaPlayer1.DisplayRect := VL;
    Form1.MediaPlayer1.Step;
  end;
  MouseDown := False;
end;

1 个答案:

答案 0 :(得分:0)

奇怪的是,在面板中移动视频不起作用,但移动面板确实如此。 我不想这样做,因为它需要跟踪太多物体,但它必须这样做 移动面板使用与上面相同的代码,但使用其他各种属性。