J'espère que j'ai placé mon message dans la bonne rubrique.
Sinon, je présente par avance mes excuses aux modérateurs qui
voudront bien placer mon message dans la bonne rubrique.
Ma configuration:
PC portable sous Windows 8.1
Delphi 6 Personal Edition
TWindowsMediaPlayer 12.0.9600.17031 (dernière version à ma connaissance)
Mon projet:
Développement d'une vaste DLL gérant, entre autres, l'objet TWindowsMediaPlayer
de sorte à pouvoir injecter de multiples players dans une fenêtre d'un programme externe.
Tous ces players sont créés en cours d'exécution et jouent simultanément des contenus différents.
Tout cela marche très bien. Un seul point pose problème: mettre un des players en mode "plein écran".
J'ai passé des jours à chercher sur le net. J'ai trouvé quelques propriétés ou méthodes de TWindowsMediaPlayer
qui auraient pu constituer une solution (Fullspace, DisplayRect, ...), mais tout est refusé par le compilateur
comme mot-clé inconnu.
Alors, j'ai fini par trouver cette méthode utilisant les services OLE:
La procédure SmoothResizeMediaPlayer est prise sur le net, sans modification.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 procedure SmoothResizeMediaPlayer(aMediaPlayer: TWindowsMediaPlayer; PosRect,ClipRect:Trect); const IID_IOleInPlaceObject: SYSTEM.TGUID = '{00000113-0000-0000-C000-000000000046}'; var IOIPObj: IOleInPlaceObject; begin SYSTEM.IDispatch(aMediaPlayer.OleObject).QueryInterface(IID_IOleInPlaceObject, IOIPObj); IOIPObj.SetObjectRects(PosRect, ClipRect); end; function CreateMultiPlayer(wnd: HWND; tp,lft,w,h: integer): integer; stdcall; export; var XP: TWindowsMediaPlayer; begin result := -1; try XP := TWindowsMediaPlayer.Create(frm2DLLForm); XP.Top := tp; XP.Left := lft; XP.Width := w; XP.ParentWindow := wnd; result := integer(XP); except end; end; function ResizeMultiPlayer(player,t,l,w,h: integer): integer; stdcall; export; var r: TRect; XP: TWindowsMediaPlayer; a,b,c,d: integer; s: WideString; begin result := 0; XP := TWindowsMediaPlayer(player); if not assigned(XP) then exit; MyClientRect(XP.ParentWindow, r); SmoothResizeMediaPlayer(XP, r, r); end;
La fonction CreateMultiPlayer est écrite par moi. Elle fait partie de la DLL et est chargée
de créer tous ces players multiples. Elle fonctionne parfaitement.
La fonction ResizeMultiPlayer est écrite par moi et fait partie de la DLL.
Le premier paramètre "player" est l'objet TWindowsMediaPlayer créé dans la fonction CreateMultiPlayer
et passé au programme appelant. Ceci me permet de passer cette valeur à toutes les fonctions
gérant les multiples players pour sélectionner celui que lequel il faut agir.
La fonction ResizeMultiPlayer commence par créer un TRect nommé "r" qui contient les dimensions
de la zone client de la fenêtre contenant le player ciblé. J'ai vérifié: les valeurs sont correctes.
La procédure SmoothResizeMediaPlayer redimensionne effectivement le contrôle ActiveX aux bonnes domensions,
MAIS: la vidéo elle-même reste à la même taille, positionnée au centre d'une zone noire remplissant toute
la zone client ciblée. Or, je voulais que la vidéo elle-même soit étirée à ces dimensions, pas uniquement
l'espace qu'occupe le contrôle ActiveX.
J'ai essayé LIBVLC.dll avec le wrapper PASLIBVLC.pas. Et là, ça marche sans problème.
Mais ayant déjà investi beaucoup de temps et efforts sur TWindowsMediaPlayer, j'apprécierais vraiment
trouver une solution, soit par une méthode ou propriété de TWindowsMediaPlayer, soit par une
technique OLE.
Merci beaucoup de votre aide.
Partager