我遇到了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;
答案 0 :(得分:0)
奇怪的是,在面板中移动视频不起作用,但移动面板确实如此。 我不想这样做,因为它需要跟踪太多物体,但它必须这样做 移动面板使用与上面相同的代码,但使用其他各种属性。