深入研究: TMediaPlayer控件使用、流、TNMUdp(分数不够,可以再加...欢迎加入讨论)
//说明:1、2 为重点讨论内容。
1、MediaPlayer组件怎么播放指定的缓存流?而不是通过文件名指定?
此问题的来源于:在设计两台主机通讯时,使用Udp协议;
2、TNMUdp在播放流媒体时,是怎么处理缓存的(UDP最大缓存:2048 Bytes),怎么分割流?
3、附带小问题:
//写在前面:
//程式要求实现,在单击Bitbtn时,popmenu弹出点在BitBtn的(left,top)
//处,调用API:TrackPopupMenu(self.PopupMenu1.Handle,TPM_LEFTALIGN or
// TPM_BOTTOMALIGN,sp.x,sp.y,0,self.Handle,nil);
// 已实现,不过这样很没劲。希望有另解:
//以下程式实现:
//通过计算PopupMenu的高度而实现它的具体定位的,
//此程式有bug,就是第一次单击PopMenu出现在屏幕的不定区域,不知何故?
//程式要求实现,在第一次单击Bitbtn时,popmenu弹出点在BitBtn的(left,top)
//处,
//程式还在完善当中。
//如果能重载PopupMenu中的方法,实现弹出点在PopupMenu的左下角或者右下
//角,问题就好办了,期待高手...
//以下是我的实现方式,请改善之,谢过了先
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
BitBtn1: TBitBtn;
Open: TMenuItem;
Save: TMenuItem;
N1: TMenuItem;
Exit: TMenuItem;
N2: TMenuItem;
N21: TMenuItem;
N51: TMenuItem;
N61: TMenuItem;
N3: TMenuItem;
N71: TMenuItem;
procedure BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
Function GetPopMenuHeight(Sender: TObject): Integer;
//获得PopupMenu菜单项的总高度
{ Public declarations }
end;
var
Form1: TForm1;
tHeight: Integer;
implementation
{$R *.DFM}
//获得PopupMenu菜单项的总高度
Function TForm1.GetPopMenuHeight(Sender: TObject): Integer;
var
i,mHeight,sHeight: Integer;
vRect: TRect;
begin
sHeight := 0;
//mHeight := 0;
for i := 0 to PopupMenu1.Items.Count - 1 do
begin
GetMenuItemRect(self.Handle, PopupMenu1.Handle, PopupMenu1.Items[i].MenuIndex, vRect);
mHeight := vRect.Bottom - vRect.Top; //每个菜单项的高度
sHeight := sHeight + mHeight;
end;
result := sHeight;
end;
procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ScrP: TPoint;
begin
tHeight := GetPopMenuHeight(self);
x := BitBtn1.Left;
y := BitBtn1.Top - tHeight;
ScrP := ClientToScreen(point(x,y));
if Button = mbleft then
PopupMenu1.Popup(scrp.x,ScrP.y);
end;
end.
//the end of program