Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
Relevant replacement documents include:
- Sample Code Project FullScreenWindow
QTFullScreen.c
////////// |
// |
// File: QTFullScreen.c |
// |
// Contains: Functions to display full-screen QuickTime movies. |
// |
// Written by: Tim Monroe |
// |
// Copyright: © 1998 by Apple Computer, Inc., all rights reserved. |
// |
// Change History (most recent first): |
// |
// <4> 03/21/00 rtm changed QTFullScreen_PlayOnFullScreen to use FSSpec parameter |
// <3> 04/30/99 rtm added QTFullScreen_PlayMovieOnFullScreen, to play an existing |
// movie full screen |
// <2> 03/17/98 rtm finally got back to this; now it's working on Mac and Windows |
// <1> 12/22/97 rtm first file |
// |
// This file contains functions that illustrate how to play QuickTime movies full screen. The |
// key elements to displaying full screen movies are the calls BeginFullScreen and EndFullScreen, |
// introduced in QuickTime 2.5. In the function QTFullScreen_PlayOnFullScreen, we open a movie |
// file, get the movie from it, configure it to play full screen, associate a movie controller, |
// and then let the controller handle events. Your application should call the function |
// QTFullScreen_EventLoopAction in its event loop (on MacOS) or when it gets idle events (on Windows). |
// |
// In the function QTFullScreen_PlayMovieOnFullScreen, we take an existing movie and play it full |
// screen; in this function, we use the Movie Toolbox to start the movie and to give it processor |
// time. |
// |
////////// |
#include "QTFullScreen.h" |
// gloabl variables |
WindowPtr gFullScreenWindow = NULL; // the full-screen window |
MovieController gMC = NULL; // movie controller for the full-screen window |
Ptr gRestoreState = NULL; // restore state; used when closing the full-screen window |
////////// |
// |
// QTFullScreen_PlayOnFullScreen |
// Prompt the user for a movie and play it full screen. |
// |
////////// |
OSErr QTFullScreen_PlayOnFullScreen (FSSpecPtr theFSSpecPtr) |
{ |
Movie myMovie = NULL; |
short myRefNum = 0; |
long myFlags = fullScreenDontChangeMenuBar | fullScreenAllowEvents; |
OSErr myErr = noErr; |
myErr = OpenMovieFile(theFSSpecPtr, &myRefNum, fsRdPerm); |
if (myErr != noErr) |
goto bail; |
// now fetch the first movie from the file |
myErr = NewMovieFromFile(&myMovie, myRefNum, NULL, NULL, newMovieActive, NULL); |
if (myErr != noErr) |
goto bail; |
CloseMovieFile(myRefNum); |
// set up for full-screen display |
myErr = BeginFullScreen(&gRestoreState, NULL, 0, 0, &gFullScreenWindow, NULL, myFlags); |
#if TARGET_OS_WIN32 |
// on Windows, set a window procedure for the new window and associate a port with that window |
QTMLSetWindowWndProc(gFullScreenWindow, QTFullScreen_HandleMessages); |
CreatePortAssociation(GetPortNativeWindow(gFullScreenWindow), NULL, 0L); |
#endif |
SetMovieGWorld(myMovie, (CGrafPtr)gFullScreenWindow, GetGWorldDevice((CGrafPtr)gFullScreenWindow)); |
SetMovieBox(myMovie, &gFullScreenWindow->portRect); |
// create the movie controller |
gMC = NewMovieController(myMovie, &gFullScreenWindow->portRect, 0); |
bail: |
return(myErr); |
} |
////////// |
// |
// QTFullScreen_RestoreScreen |
// |
////////// |
OSErr QTFullScreen_RestoreScreen (void) |
{ |
OSErr myErr = noErr; |
#if TARGET_OS_WIN32 |
DestroyPortAssociation((CGrafPtr)gFullScreenWindow); |
#endif |
DisposeMovieController(gMC); |
myErr = EndFullScreen(gRestoreState, 0L); |
return(myErr); |
} |
////////// |
// |
// QTFullScreen_EventLoopAction |
// Do any required event loop action processing. |
// |
////////// |
OSErr QTFullScreen_EventLoopAction (EventRecord *theEvent) |
{ |
return(MCIsPlayerEvent(gMC, theEvent)); |
} |
#if TARGET_OS_WIN32 |
////////// |
// |
// QTFullScreen_HandleMessages |
// Handle Windows messages for the full-screen window. |
// |
////////// |
LRESULT CALLBACK QTFullScreen_HandleMessages (HWND theWnd, UINT theMessage, UINT wParam, LONG lParam) |
{ |
MSG myMsg = {0}; |
EventRecord myMacEvent; |
LONG myPoints = GetMessagePos(); |
myMsg.hwnd = theWnd; |
myMsg.message = theMessage; |
myMsg.wParam = wParam; |
myMsg.lParam = lParam; |
myMsg.time = GetMessageTime(); |
myMsg.pt.x = LOWORD(myPoints); |
myMsg.pt.y = HIWORD(myPoints); |
// translate the Windows message to a Mac event |
WinEventToMacEvent(&myMsg, &myMacEvent); |
// pass the Mac event to the movie controller |
QTFullScreen_EventLoopAction(&myMacEvent); |
return(DefWindowProc(theWnd, theMessage, wParam, lParam)); |
} |
#endif // TARGET_OS_WIN32 |
////////// |
// |
// QTFullScreen_MoviePrePrerollCompleteProc |
// A completion procedure for pre-prerolling movies. |
// |
////////// |
PASCAL_RTN void QTFullScreen_MoviePrePrerollCompleteProc (Movie theMovie, OSErr thePrerollErr, void *theRefcon) |
{ |
#pragma unused(thePrerollErr, theRefcon) |
StartMovie(theMovie); |
} |
////////// |
// |
// QTFullScreen_PlayMovieOnFullScreen |
// Play the specified movie full screen (without a movie controller). |
// |
////////// |
OSErr QTFullScreen_PlayMovieOnFullScreen (Movie theMovie) |
{ |
long myFlags = fullScreenAllowEvents; |
GWorldPtr myOrigGWorld = NULL; |
Rect myRect; |
OSErr myErr = noErr; |
StopMovie(theMovie); |
// set up for full-screen display |
myErr = BeginFullScreen(&gRestoreState, NULL, 0, 0, &gFullScreenWindow, NULL, myFlags); |
#if TARGET_OS_WIN32 |
// on Windows, set a window procedure for the new window and associate a port with that window |
QTMLSetWindowWndProc(gFullScreenWindow, QTFullScreen_HandleMessages); |
CreatePortAssociation(GetPortNativeWindow(gFullScreenWindow), NULL, 0L); |
#endif |
GetMovieBox(theMovie, &myRect); |
GetMovieGWorld(theMovie, &myOrigGWorld, NULL); |
SetMovieGWorld(theMovie, (CGrafPtr)gFullScreenWindow, GetGWorldDevice((CGrafPtr)gFullScreenWindow)); |
SetMovieBox(theMovie, &gFullScreenWindow->portRect); |
PrePrerollMovie(theMovie, GetMovieTime(theMovie, NULL), GetMoviePreferredRate(theMovie), NewMoviePrePrerollCompleteProc(QTFullScreen_MoviePrePrerollCompleteProc), (void *)0L); |
// play the movie through until the end; of course, a real application would probably want |
// to call MoviesTask in its idle routine instead of just looping mindlessly here; this is |
// left as an exercise for the reader |
while (!IsMovieDone(theMovie)) |
MoviesTask(theMovie, 0L); |
StopMovie(theMovie); |
SetMovieGWorld(theMovie, myOrigGWorld, NULL); |
myErr = EndFullScreen(gRestoreState, 0L); |
SetMovieBox(theMovie, &myRect); |
bail: |
return(myErr); |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14