Lecteur de clips vidéo

5/5 (37 avis)

Vue 26 577 fois - Téléchargée 2 400 fois

Description

Voici le code source d'un lecteur de clips vidéo utilisant l'Activex "Windows Media Player". Il permet d'afficher un clip vidéo dans la fenêtre de notre programme. Il est réduit au strict minimum (ouvrir, lire, pause et arrêter). Vous pouvez le perfectionner en utilisant les autres interfaces de cet activex (voir MSDN). Projet réalisé sous Visual 6. En cas de problème avec les autres compilateurs, n'hésiter pas à le signaler car on peut rendre le code tout à fait portable après quelques petites modifications.
Testé sous Windows XP avec Windows Media Player 8, 9 et 10.

Source / Exemple :


#include <windows.h>

#ifndef EXTERN_GUID
#define EXTERN_GUID(g,l1,s1,s2,c1,c2,c3,c4,c5,c6,c7,c8) // Pour Dev-C++
#endif

#include "wmpdef.h"
#include "wmp.h"

// Variables globales:
IWMPControls *pMPControls;
IWMPPlayer   *pMPPlayer;
HWND         hConteneur;

//------------------- Procédure de notre fenêtre principale -----------------------//
LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
{	
	// Déclaration des variables:
	static HWND hOuvrir,hLire,hArret,hPause, hQuitter,hCadre;

	// Interception et traitement des messages:
	switch(messg)
	{
		case WM_CREATE:
			{
			// Créer tous les controles:
			hOuvrir=CreateWindow("BUTTON","Ouvrir",WS_CHILD | WS_VISIBLE,20,428,90,20,hWnd,0,0,0);
			hLire=CreateWindow("BUTTON","Lire",WS_CHILD | WS_VISIBLE,170,428,90,20,hWnd,0,0,0);
			hPause=CreateWindow("BUTTON","Pause",WS_CHILD | WS_VISIBLE,270,428,90,20,hWnd,0,0,0);
			hArret=CreateWindow("BUTTON","Arrêter",WS_CHILD | WS_VISIBLE,370,428,90,20,hWnd,0,0,0);
			hQuitter=CreateWindow("BUTTON","Quitter",WS_CHILD | WS_VISIBLE,520,428,90,20,hWnd,0,0,0);			
			hCadre=CreateWindow("BUTTON","",BS_GROUPBOX | WS_CHILD | WS_VISIBLE,15,415,600,37,hWnd,0,0,0);
			break;
			}

		case WM_COMMAND:
			if( (HWND)lParam ==  hOuvrir)
			{
				// Déclarer et intialiser un buffer:
				char tampon[MAX_PATH];
				tampon[0]=0;
				// Déclarer une structure OPENFILENAME:
				OPENFILENAME ofn;
                // Mettre tous les membres de la structure à 0:
                memset( &ofn, 0, sizeof(OPENFILENAME) );
                // Définir les membres:
                ofn.lStructSize = sizeof(OPENFILENAME);
				ofn.hwndOwner = hWnd;
                ofn.lpstrFilter = "Clips Vidéo\0*.avi;*.mpg;*.mpeg;*.wmv\0\0";
                ofn.lpstrFile = tampon;
                ofn.nMaxFile = MAX_PATH;
                ofn.lpstrTitle = "Choisir un clip :";
                ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
                // Lancer la boite de dialogue pour choisir un fichier:
                if(!GetOpenFileName(&ofn)) break;				
				// Convertir le chemin en UNICODE:
				WCHAR fichier[MAX_PATH];
				MultiByteToWideChar (CP_ACP, 0, tampon, -1, fichier, MAX_PATH+1);
				pMPPlayer->put_URL(fichier);
				break;
			}
			
			// Clic sur le bouton "Lire":
			if((HWND)lParam ==  hLire)
			{				
				pMPControls->play();	
				break;
			}
			// Clic sur le bouton "Pause":
			if((HWND)lParam ==  hPause)
			{
				pMPControls->pause();
				break;
			}
			// Clic sur le bouton "Arrêter":
			if((HWND)lParam ==  hArret)
			{
				pMPControls->stop();	
				break;
			}
			// Clic sur le bouton "Quitter":
			if((HWND)lParam ==  hQuitter)
			{
				// Envoi du message WM_CLOSE à notre fenêtre:
				SendMessage(hWnd,WM_CLOSE,0,0);
			}
			break;

		case WM_CLOSE:
			// Envoi du message de fermeture du programme:
			PostQuitMessage(0);
			break;
	
		default:
			//Retour à la procédure par défaut:
			return( DefWindowProc( hWnd, messg, wParam, lParam ) );
	}
	return 0;
}
//---------------------------------------------------------------------------------//

//------------------------------ Fonction WinMain -----------------------------------------//
int WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
{
	// Définir type de pointeur pour la fonction AtlAxAttachControl:
	typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**);
	// Charger la atl.dll:
	HINSTANCE hDLL = LoadLibrary("atl.dll");
	// Si dll non chargée alors quitter:
	if (!hDLL) return 1;
	// Obtenir pointeur sur la fonction AtlAxAttachControl:
	PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL, "AtlAxAttachControl");
	// Déclarer notre classe de fenêtre et définir ses membres:
	WNDCLASS wc;
	char NomClasse[]    = "Lecteur_Clips";
	wc.lpszClassName 	= NomClasse;
	wc.hInstance 		= hInst;
	wc.lpfnWndProc		= WndProc;
	wc.hCursor			= LoadCursor( 0, IDC_ARROW );
	wc.hIcon			= LoadIcon( 0, IDI_APPLICATION );
	wc.lpszMenuName	    = 0;
	wc.hbrBackground	= GetSysColorBrush(COLOR_BTNFACE);
	wc.style			= 0;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	// Enregistrer la classe de notre fenêtre:
	if (!RegisterClass(&wc)) return 1;
	// Obtenir la hauteur de la barre de titre:
	int barre=GetSystemMetrics(SM_CYCAPTION);
	// Créer notre fenêtre principale:
	HWND hWnd = CreateWindow( NomClasse," Lecteur de clips vidéo",WS_SYSMENU | WS_MINIMIZEBOX  ,0,0,640,460+barre, 0, 0, hInst,0);
	// Montrer la fenêtre:
	ShowWindow(hWnd, nCmdShow );
	UpdateWindow( hWnd );
	// Créer notre STATIC conteneur:
	hConteneur=CreateWindow("STATIC","",WS_CHILD  ,0,0,638,420,hWnd,0,0,0);
	// Initialiser la librairie COM:
	CoInitialize(0);
	// Créer une instance du composant WindowsMediaPlayer et l'interface IWMPPlayer:
	HRESULT res=CoCreateInstance(CLSID_WindowsMediaPlayer,0,CLSCTX_ALL,IID_IWMPPlayer,(void**)&pMPPlayer);
	// Si échec alors quitter le programme:
	if(res) return 1;
	// Attacher l'interface IWMPCore à notre conteneur:
	res =AtlAxAttachControl(pMPPlayer,hConteneur,NULL); 
	// Obtenir un pointeur sur l'interface IWMPControls:
	res=pMPPlayer->get_controls(&pMPControls);
	// Choisir l'affichage sans boutons etc...:
	char mode[5]={"none"};
	WCHAR wmode[5];
	MultiByteToWideChar (CP_ACP, 0, mode, -1, wmode, 6);
	res=pMPPlayer->put_uiMode(wmode);
	// Afficher le conteneur:
	ShowWindow(hConteneur,1);
	// Boucle des messages:
	MSG Msg;
	while( GetMessage(&Msg, 0, 0, 0))
	{
		TranslateMessage( &Msg );
		DispatchMessage( &Msg );
	}
	// Libérer toutes les interfaces;
	pMPControls->Release();	
	pMPPlayer->Release();
	// Détruire la fenêtre:
	DestroyWindow(hWnd);
	// Fermer la librairie COM:
	CoUninitialize();
	// Libérer la DLL:
	FreeLibrary(hDLL);
	// Quitter le programme:
	return( Msg.wParam);
}

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_omnia
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009

7 nov. 2007 à 18:38
SAlut, une petite question, l'interface affiché par défaut si on ne récupère pas le pointeur vers les boutons (pause, lecture, ..)

saurais-tu comment l'activer ? car les boutons restent figés --_--' juste a tout hazard, très bonne source :p
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
14
25 mars 2006 à 03:39
Salut,
Il suffit de libérer toutes les interfaces de l'activex utilisées par notre programme pour qu'il soit détaché de son conteneur. Il ne faut jamais détruire le conteneur avant, sinon crash.
lagw
Messages postés
4
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2008

1 mars 2006 à 15:16
merci ca marche.

il y a la fonction AtlAxAttachControl mais pas de Detach ?
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
14
1 mars 2006 à 01:44
Salut,
Dans le SDK de WMP10, tu trouveras un exemple "WMPHost" qui contient deux fichiers "CWMPEventDispatch.h" et "CWMPEventDispatch.cpp". Tu peux adapter ces deux fichiers pour pouvoir les utiliser sans ATL. Mon code source "Navigateur Web" utilise une classe implémentant l'interception des événements. Le principe est le même avec WMP.
lagw
Messages postés
4
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2008

28 févr. 2006 à 12:01
comment peut on utiliser les evenements ? avec IWMPEvents ou _WMPOCXEvents ?
je ne vois pas comment on peut se servir de ces objets.
merci.
Afficher les 37 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.