A telecharger
Transcription
A telecharger
Win32 : Multimédia Manipulation des images, sons et vidéos Manipulation des images ! Une image peut être une ressource (dans ce cas, difficilement modifiable dynamiquement) ! Accès par son identifiant " L'image doit faire partie des ressources " Chargement par LoadBitmap() ! Si un contrôle de type bitmap à été placé sur une boite de dialogue, on peut actualiser cet affichage en envoyant un message à ce contrôle " Utilisation de SendDlgItemMessage() HANDLE hBitmap; hBitmap = LoadBitmap(TheInstance, MAKEINTRESOURCE(IDB_BITMAP1)); SendDlgItemMessage(hwnd, IDC_BITMAP, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP,(LPARAM) (HANDLE) hBitmap); 1 Chargement dynamique des images ! Facile pour les fichiers BMP " Proche de la structure interne (DIB) utilisé pour afficher les images avec l'interface GDI (interface classique de Windows) " Support existant pour le JPEG et le PNG " Ecrire le code pour les autres formats ! ! L'affichage GDI support les palettes, le mode "true color" et (théoriquement) la transparence (alpha chanel) avec GDI+ ! Après avoir créé un DIB en mémoire, plusieurs fonctions de l'API Win32 permettent d'afficher cette image dans la zone client. Le format BMP (1/3) ! Format typé Microsoft ! Extension du DIB (format interne pour affichage GDI) • • • • Images 2 couleurs utilisant 1 bit par pixel (1 octet=8 pixels) Images 16 couleurs utilisant 4 bits par pixel (1 octet=2 pixels) Images 256 couleurs utilisant 8 bits par pixel (1 octet=index de la palette) Images en couleurs réelles (24 bits par pixel) 3 octets par pixel (ATTENTION : ordre bleu, vert et rouge). ! Structure • • • • En-tête du fichier (file header) En-tête du bitmap (bitmap information header) Palette (optionnelle) Corps de l'image ! Signature (sur 2 octets) : BM, 424D en hexadécimal 2 Le format BMP (2/3) ! Compression RLE possible BMP DIB ! Structures (BITMAPINFO, BITMAPINFOHEADER, …) prédéfinies dans "windows.h" Le format BMP (3/3) /* Structure BITMAPFILEHEADER */ typedef struct tagBITMAPFILEHEADER { // bmfh WORD bfType; /* Specifies the file type. It must be BM */ DWORD bfSize; /* Specifies the size, in bytes, of the bitmap file */ WORD bfReserved1; /* Reserved; must be zero */ WORD bfReserved2; /* Reserved; must be zero */ DWORD bfOffBits; /* Specifies the offset, in bytes, from the BITMAPFILEHEADER structure to the bitmap bits */ } BITMAPFILEHEADER; /* Structure BITMAPINFOHEADER */ typedef struct tagBITMAPINFOHEADER{ // bmih DWORD biSize; /* Specifies the number of bytes required by the structure */ LONG biWidth; /* Specifies the width of the bitmap, in pixels */ LONG biHeight; /* Specifies the height of the bitmap, in pixels */ WORD biPlanes; /* Specifies the number of planes for the target device. This value must be set to 1 */ WORD biBitCount /* Specifies the number of bits per pixel */ DWORD biCompression; /* Specifies the type of compression */ DWORD biSizeImage; /* Specifies the size, in bytes, of the image */ LONG biXPelsPerMeter; /* Specifies the horizontal resolution, in pixels per meter, of the target device for the bitmap */ LONG biYPelsPerMeter; /* Specifies the vertical resolution, in pixels per meter, of the target device for the bitmap */ DWORD biClrUsed; /* Specifies the number of color indexes in the color table that are actually used by the bitmap */ DWORD biClrImportant; /* Specifies the number of color indexes that are required for displaying the bitmap */ } BITMAPINFOHEADER; 3 Lecture BMP ! Lecture entête BMP et affichage FILE *fp; BITMAPFILEHEADER h; fp = fopen("toto.bmp","rb"); fread(&h,1,sizeof(BITMAPFILEHEADER),fp); printf("\nTaille du fichier %d",h.bfSize); char *c; c = (char*)(h.bfType); printf("\nSignature : %c%c",c[0],c[1]); BITMAPINFOHEADER h; ! Lecture entête DIB fread(&ih,1,sizeof(BITMAPINFOHEADER),fp); ! Allocation et lecture données (si image couleur 24 bits) char* data; data = (char*)malloc(ih.biWidth * ih.biHeight * 3); fread(data,1, ih.biWidth * ih.biHeight * 3,fp); Manipulation des DIB : StretchDIBits The StretchDIBits function copies the color data for a rectangle of pixels in a DIB to the specified destination rectangle. If the destination rectangle is larger than the source rectangle, this function stretches the rows and columns of color data to fit the destination rectangle. If the destination rectangle is smaller than the source rectangle, this function compresses the rows and columns by using the specified raster operation. Windows 98/Me, Windows 2000/XP: StretchDIBits has been extended to allow a JPEG or PNG image to be passed as the source image. int StretchDIBits( HDC hdc, int XDest, int YDest, int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth, int nSrcHeight, CONST VOID *lpBits, CONST BITMAPINFO *lpBitsInfo, UINT iUsage, DWORD dwRop ); // // // // // // // // // // // // // handle to DC x-coord of destination upper-left corner y-coord of destination upper-left corner width of destination rectangle height of destination rectangle x-coord of source upper-left corner y-coord of source upper-left corner width of source rectangle height of source rectangle bitmap bits bitmap data usage options raster operation code 4 Raster Operations ! Raster operation Boolean operation R2_BLACK 0 R2_COPYPEN P R2_MASKNOTPEN DPna R2_MASKPEN DPa R2_MASKPENNOT PDna R2_MERGENOTPEN DPno R2_MERGEPEN DPo R2_MERGEPENNOT PDno R2_NOP D R2_NOT Dn R2_NOTCOPYPEN Pn R2_NOTMASKPEN DPan R2_NOTMERGEPEN DPon R2_NOTXORPEN DPxn R2_WHITE 1 R2_XORPEN DPx Raster Operations ! Raster Operations specify how the current PEN and BRUSH colors will be combined with the colors on the screen. » Par exemple : R2_NOTXORPEN ! R2_NOTXOR is really NOT (XOR (current_color, screen_color)). For two one bit numbers, the truth table is, • • • • • X 0 0 1 1 Y 0 1 0 1 XOR(X,Y)NOT(XOR(X,Y)) 0 1 1 0 1 0 0 1 5 Utilisation pour la sélection d'une zone ! Tracé de rectangle de sélection, … " Eviter de mémoriser la zone sous le tracé " Utiliser des "modifications réversibles" MCI (Multimedia Control Interface) ! MCI provides applications with device-independent capabilities for controlling audio and visual peripherals. Your application can use MCI to control any supported multimedia device, including waveform-audio devices, MIDI sequencers, CD audio devices, and digital-video (video playback) devices. ! 2 possibilités : " Envoi de commandes MCI • Remplir une structure, envoyer la commande avec la structure en paramètres " Envoi d'ordre MCI sous forme de chaînes de caractères • MCISendString 6 Commandes spécifiques MCI ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! acmDriverAdd acmDriverClose acmDriverDetails acmDriverEnum acmDriverEnumCallback acmDriverID acmDriverMessage acmDriverOpen acmDriverPriority acmDriverProc acmDriverRemove acmFilterChoose acmFilterChooseHookProc acmFilterDetails acmFilterEnum acmFilterEnumCallback acmFilterTagDetails acmFilterTagEnum ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! acmFilterTagEnumCallback acmFormatChoose acmFormatChooseHookProc acmFormatDetails acmFormatEnum acmFormatEnumCallback acmFormatSuggest acmFormatTagDetails acmFormatTagEnum acmFormatTagEnumCallback acmGetVersion acmMetrics acmStreamClose acmStreamConvert acmStreamConvertCallback acmStreamMessage acmStreamOpen acmStreamPrepareHeader acmStreamReset Commandes spécifiques MCI ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! auxGetDevCaps auxGetNumDevs auxGetVolume auxOutMessage auxSetVolume AVIBuildFilter AVIClearClipboard AVIFileAddRef AVIFileCreateStream AVIFileEndRecord AVIFileExit AVIFileGetStream AVIFileInfo AVIFileInit AVIFileOpen AVIFileReadData AVIFileRelease AVIFileWriteData ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! AVIGetFromClipboard ... AVISave AVISaveOptions AVISaveOptionsFree ... AVIStreamGetFrameOpen AVIStreamInfo AVIStreamLength AVIStreamOpenFromFile AVIStreamRead ... AVIStreamSetFormat AVIStreamStart AVIStreamTimeToSample AVIStreamWrite AVIStreamWriteData 7 Commandes spécifiques MCI ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! capControlCallback capCreateCaptureWindow capErrorCallback ... CreateEditableStream DllGetClassObject DrawDibBegin DrawDibChangePalette DrawDibClose DrawDibDraw DrawDibEnd DrawDibGetBuffer DrawDibGetPalette DrawDibOpen DrawDibProfileDisplay ... DrawDibTime ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! EditStreamClone EditStreamCopy EditStreamCut EditStreamPaste EditStreamSetInfo EditStreamSetName GetOpenFileNamePreview GetSaveFileNamePreview ICClose ICCompress ICCompressorChoose ICCompressorFree ICDecompress ICDecompressEx ICDecompressExBegin ICDecompressExQuery ICDraw Commandes spécifiques MCI ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ICDrawBegin ICDrawSuggestFormat ICGetDisplayFormat ICGetInfo ICImageCompress ICImageDecompress ICInfo ICInstall ICLocate ICOpen ICOpenFunction ICRemove ICSendMessage ICSeqCompressFrame ICSeqCompressFrameEnd ICSeqCompressFrameStart ICSetStatusProc IOProc ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! joyConfigChanged joyGetDevCaps joyGetNumDevs joyGetPos joyGetPosEx joyGetThreshold joyReleaseCapture joySetCapture joySetThreshold mciExecute mciGetCreatorTask mciGetDeviceID mciGetDeviceIDFromElementID mciGetErrorString mciGetYieldProc mciSendCommand mciSendString mciSetYieldProc 8 Commandes spécifiques MCI ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! midiConnect midiDisconnect midiInAddBuffer midiInClose midiInGetDevCaps midiInGetErrorText midiInGetID midiInGetNumDevs midiInMessage midiInOpen midiInPrepareHeader MidiInProc midiInReset midiInStart midiInStop midiInUnprepareHeader midiOutCacheDrumPatches midiOutCachePatches midiOutClose ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! mixerClose mixerGetControlDetails mixerGetDevCaps mixerGetID mixerGetLineControls mixerGetLineInfo mixerGetNumDevs mixerMessage mixerOpen mixerSetControlDetails mmioAdvance mmioAscend mmioClose mmioCreateChunk ... ... mmioSeek mmioSendMessage mmioSetBuffer Commandes spécifiques MCI ! ! ! ! ! ! ! ! ! ! ! ! MyStatusProc PlaySound sndPlaySound StretchDIB timeBeginPeriod timeEndPeriod timeGetDevCaps timeGetSystemTime timeGetTime timeKillEvent TimeProc timeSetEvent ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! waveInAddBuffer waveInClose waveInGetDevCaps waveInGetErrorText waveInGetID waveInGetNumDevs waveInGetPosition waveInMessage waveInOpen waveInPrepareHeader waveInProc waveInReset waveInStart waveInStop waveInUnprepareHeader waveOutBreakLoop waveOutClose waveOutGetDevCaps waveOutGetErrorText 9 Exemple : PlaySound ! PlaySound() Header: mmsystem.h Import Library: winmm.lib BOOL PlaySound( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound ); PlaySound("ding.wav",NULL, SND_FILENAME); Format WAV ? ! CODEC COdeur/DECodeur ou COmpresseur/DECompresseur ! Software / Hardware ! Avec ou sans perte ! Format d’encapsulation : WAV " Le format WAV (comme les AVI) est un fichier RIFF (Ressource Interchange File Format) ! Portabilité du fichier ? 10 Autre possibilité de son : norme MIDI ! MIDI : Musical Instrument Digital Interface " Standard de connectivité (PC, instruments,…) ! La première chose à faire lorsqu’on veut envoyer et recevoir des messages MIDI, c'est-à-dire de jouer ou enregistrer des morceaux, c’est de repérer le nombre de devices MIDI. Ces devices sont sur les cartes son enfichées dans le PC. Ils peuvent être de plusieurs types : " MOD_MIDIPORT : port hardware matérialisant une voie de communication avec des instruments extérieurs " MOD_SQSYNTH : synthétiseur interne de signaux carrés " MOD_FMSYNTH :synthétiseur FM interne. Permet de simuler des instruments de musique " MOD_MAPPER : Microsoft MIDI mapper ! Si on veut communiquer avec un instrument MIDI extérieur (clavier, synthétiseur), il faut rechercher un MOD_MIDIPORT. Si on veut simuler les instruments sur le synthé FM de la carte son, on cherchera un MOD_FMSYNTH. Commandes MIDI ! En premier on recherche le nombre de devices MIDI int NbreDevs = midiOutGetNumDevs() ; ! On effectue ensuite une boucle sur le nombre précédent pour rechercher le ou les devices qui correspondent au type de sortie que l’on veut faire : MIDIOUTCAPS OutCaps ; int wDeviceID ; for(wDeviceID=0 ; wDeviceID<NbreDevs ; wDeviceID++) { midiOutGetDevCaps(wDeviceID, &OutCaps, sizeof(OutCaps) ) ; if( OutCaps.wTechnology==MOD_FMSYNTH ) break ; } ! par exemple. En sortie de la routine, la variable wDeviceID contient l’ID du 1er device MIDI du type FMSYNTH présent sur une des cartes son du PC. 11 Commandes MIDI ! Envoyer un message MIDI NoteOn : DWORD lNoteOn = 0x00ddnn9c ; dd = volume sonore =[0 ;7F] nn = n° note : 0=do-3 ; 7F=sol8 c = canal = [0 ; NbreNotesMax] ! Envoi au synthé FM par : midiOutShortMsg( hMidiOut, lNoteOn ) ; ! Pour arrêter une note, il faut envoyer le message Note Off : DWORD lNoteOff = 0x0000nn8c midiOutShortMsg( hMidiOut, lNoteOff ) ; ! Lorsque l’utilisation du port MIDI prend fin, il faut le fermer avec : midiOutClose( h MidiOut ) ; Commandes MIDI ! Pour changer l’instrument associé à un canal, il suffit d’utiliser le message " program change " : DWORD message = 0x0000ppcc pp = n° du programme = [0 ; 127] cc = 0xC0 + n° canal ! et d’envoyer un midiOutShortMsg 12 Et la vidéo ? (1/3) ! De façon très simple, utiliser des commandes MCI : " Lecture dans une fenêtre externe : szCommandString = "Play AVIFile fullscreen wait" mciSendString (szCommandString, NULL, 0, NULL); " Lecture plein écran szCommandString = "Play AVIFile wait" mciSendString (szCommandString, NULL, 0, NULL); Vidéo (2/3) ! Dans une fenêtre de l’IHM wsprintf(szCommandString,"open skiing.avi alias mov style child parent %d", (int)GetDlgItem(hwnd,IDC_ANIMATE1)); mciSendString(szCommand, NULL, 0, NULL); mciSendString("window mov state show", NULL, 0, NULL); mciSendString("play mov notify", NULL, 0, hwnd); 13 Vidéo (3/3) ! Format d’encapsulation : AVI " Le format AVI (comme les .WAV) est un fichier RIFF (Ressource Interchange File Format) ! Codec COdeur/DECodeur ou COmpresseur/DECompresseur " Software / Hardware " Avec ou sans perte La prochaine fois… les objets COM et directX 14 Windows : les DLL ! Les bibliothèques de liens dynamiques (ou DLL : dynamic link library), comme winmm.dll, sont des fichiers séparés des programmes ! Ces fichiers contiennent du code binaire correspondant à des fonctions qui peuvent être appelées par des programmes ou par d'autres DLL ! Une bibliothèque ne devient active que lorsqu'elle est appelée ! Windows lui-même fonctionne avec trois bibliothèques de liens dynamiques qui correspondent à trois parties de Windows : Kernel, User et GDI. Windows : utilité des DLL ! Plusieurs programmes peuvent se partager le code binaire d’une fonction si celle-ci est dans une DLL (plutôt que de répéter dans chaque programme la même portion de code source) ! Les programmes se branchent à l'exécution sur les DLL correspondantes (d'ou le nom de lien dynamique). ! Lors de l ’édition de liens, il faut lier le programme avec une bibliothèque d'importation ou 'bibliothèque de référencement' (Elle possède elle aussi l'extension '.lib ’) " Celle-ci ne contient pas de code mais des informations pour les liens dynamiques afin d'indiquer dans quelles DLL se trouvent le code binaire des fonctions utilisées 15 Edition de liens avec une bibliothèque statique Edition de liens avec une bibliothèque dynamique 16 Réutilisation du code... ! Lorsque l'on écrit une DLL en C++, par exemple, l'algorithme propriétaire de C++, qui dénature les noms, rend impossible l'utilisation de la DLL par autre chose qu'un client composé avec le même compilateur. ! Cet objet n'est utilisable ni avec Visual Basic ni par des clients Java. ! Si un développeur modifie et redéploie une DLL, il doit s'assurer qu'aucun numéro de la DLL n'a changé, auquel cas les liaisons statiques à cette DLL provoqueraient une incompatibilité avec le client. Le concept COM… ! Component Object Model (modèle d'objets composants) ! Structure de composants logiciels (propre à Microsoft !) pouvant être appelés et exécutés dans les environnements Windows récents. Distributed COM (ou DCOM) permet de lancer l'exécution des objets à distance. Dans l'environnement Web, les objets COM sont appelés Control ActiveX. ! COM est une spécification très largement respectée, destinée à offrir des interfaces de programmation réutilisables et indépendantes du langage. Binaire réutilisable ! 17 ! COM réalise cette opération magique en fournissant une matrice de pointeurs vers les méthodes exportées par l'interface Classe de base IUnknow ! Toutes le interfaces COM reposent sur l'interface IUnknow qui joue le role d'une classe de base abstraite en C++ pour fournir un jeu de fonctions à implémenter et pour permettre l'ajout de fonctions complémentaires par chaque interface. La définition de IUnknow inclut trois fonctions : " QueryInterface() • Sert à atteindre les pointeurs dirigeant vers les interface dérivées de l'interface en cours. " AddRef • Incrémente le compteur de références de l'interface en cours. " Release • Sert à libérer une interface qui n'est plus utilisée. Décrémente le compteur de références et détruit l'objet lorsque le compte atteint zéro. 18 Les objets COM ! L'interface de base, qu'il est obligatoire d'implémenter pour un objet, est l'interface IUnknown. Cette interface est disponible pour tous les objets OLE/COM. ! L'interface IUnknown possède, entre autres, une méthode appelée QueryInterface() qui permet à un programme utilisant l'objet considéré de prendre connaissance de l'existence d'une interface implémentée dans l'objet. Si l'interface demandée existe, la méthode QueryInterface() renvoie un pointeur sur celle-ci afin que l'objet demandeur puisse l'utiliser. ! Chaque interface d'un objet est identifiée de façon unique par un GUID (Globally Unique IDentifier) attribué par Microsoft pour éviter tout conflit d'identifiant. Ce dernier, codé sur 128 bits, est stocké dans la base des registres de Windows. Dans cette base, pour chaque GUID, on trouve le nom et la localisation du serveur (DLL par exemple) fournissant l'objet dont on veut accéder à l'une de ses interfaces. On trouve également pour chaque interface un certain nombre d'informations telles que sa version, les types de données reconnus, etc. Demande d'interface 19 Quel est le lien entre COM et les IHM ! ! Avec Windows 95, Microsoft a voulu créer une meilleure plateforme pour les jeux. Cela a pris la forme de pilotes qui permettent un accès direct aux fonctionnalités matérielles des unités graphiques, audio et vidéo; les développeurs n'ont plus besoin d'écrire leurs propres pilotes. " Souvent, un pilote par type de carte graphique / carte son ! La SDK directX est entièrement basée sur des objets COM DirectX : Les éléments ! DirectDraw DirectDraw permet d'exploiter les capacités 2D d'une carte graphique tout en autorisant l'utilisant des services du GDI (Graphic Device Interface), l'API graphique de Windows. ! Direct3D Direct3D permet de créer des scènes de 3D, d'en manipuler les objets avec une palette de services et de les afficher en utilisant les capacités 3D d'une carte graphique quand elle en dispose. Direct3D dispose de deux modes de d'utilisation: " Le mode immédiat permet de gérer la transformation, l'illumination et le rendu de simples primitives (triangles, points, droites). " Le mode retenu met à la disposition du développeur un moteur 3D complet capable de gérer des objets. 20 DirectX : Les éléments ! DirectSound DirectSound permet d'exploiter les capacités d'entrée-sortie d'une carte son pour numériser, mixer des échantillons sonores et en restituer le résultat, éventuellement agrémenté d'effets 3D perfectionnés. ! DirectInput DirectInput permet de récupérer les informations transmises par l'utilisateur, que ce soit par l'intermédiaire de la souris, du clavier ou du joystick. Elle permet aussi de renvoyer des données vers des périphériques à retour de force. ! DirectPlay DirectPlay permet de mettre en place et d'administrer un dialogue point à point ou client-serveur entre plusieurs utilisateurs désirant évoluer simultanément dans un même contexte ; par exemple pour une interactivité entre joueurs connectés par Internet, par un réseau local ou par une connexion directe (modem ou câble série). Éléments DirectMedia ! DirectX Transform DirectX Transform pour la création d'effets graphiques dynamiques en 2D et en 3D, notamment pour la fusion des couches alpha et les distorsions de surface. ! DirectAnimation DirectAnimation est un ensemble de contrôles (chemins de déplacement, sprites, éléments de 3D, séquenceurs) qu'il est possible de référencer depuis une page Web. Ces contrôles disposent d'API qui permettent de les manipuler via un script JScript ou VBscript ou encore une applet Java. Il est possible d'intégrer ces contrôles dans une application développée en Java, en Visual Basic ou en C++. ! DirectShow DirectShow permet de jouer des séquences vidéo et audio (accédés en local ou à distance) et d'en capturer via des périphériques spécialistes. DirectShow supporte de nombreux formats : MPEG-1, WAV, MIDI, MPEG-2, PCM, DSS, AVI, … 21 DirectX ! L'avantage des fonctions de DirectX pour les programmeurs est que celles-ci utilisent (si possible) un algorithme alternatif (confié au processeur) quand le matériel installé ne gère pas ce type de traitement. Il fonctionne comme une surcouche de Windows, évitant théoriquement aux programmeurs de devoir s'occuper des différences matérielles qui existent entre les différents PCs. Par exemple, si une carte vidéo n'a pas de fonctions dédiées à la 3D, DirectX demandera au processeur de s'occuper du rendu d'une image de synthèse ou le rendu 3D en temps réel. DirectShow et MCI ! Les premières versions de DirectX n'eurent pas d'effet sur les applications multimédia; DirectSound, la partie de DirectX chargée de jouer le son, n'était pas prévu pour de telles applications et ne pouvait pas enregistrer le son. ! Depuis, Microsoft a ajouté DirectShow qui rend plus facile la programmation des applications multimédia. ! DirectShow encapsule l'interface MCI 22 DirectX ! Ne pas avoir peur de COM… ! L'accès bas niveau aux objets est souvent masqué par des fonctions de + haut niveau. g_pDisplay = new CDisplay(); g_pDisplay->CreateFullScreenDisplay( hWnd, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP ); // Create a surface, and draw a bitmap resource on it. hr = g_pDisplay->CreateSurfaceFromBitmap( &g_pAnimationSurface, MAKEINTRESOURCE(IDB_ANIMATE_SHEET ), SPRITE_DIAMETER * 5, SPRITE_DIAMETER * 6 ); if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) ) return E_FAIL; . . . D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f,-5.0f ), &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView ); DirectX ! Attention : DirectX n'inclut pas les objets / méthodes pour la réalisation / gestion des IHM (pas de contrôles prédéfinis). 23 Perspectives IHM ! Les applications interactives sont de plus en plus souvent implémentées au-dessus de librairies graphiques évoluées telles qu'OpenGL ou DirectX. ! Toutefois, jusque très récemment, la plupart des systèmes de fenêtrage étaient toujours basés sur des modèles graphiques vieux de plus de 15 ans, tels que GDI, QuickDraw ou la Xlib. Aqua, l'interface utilisateur de MacOS X donne pourtant une petite idée de ce que pourrait être un système de fenêtrage reposant sur un modèle graphique évolué incluant la transparence, le placage de textures, des transformations 3D ou l'éclairage. Interface Aqua 24 AVALON ! Les prochaines versions de Windows sont annoncées avec une fusion du GDI et de DirectX : Nom de code AVALON ! L'interface reposera sur les WGF (Windows Graphic Foundation). ! Fera partie du successeur de XP (Nom de code longhorn) prévu pour 2006 AVALON 25 26 27