home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1996 December
/
PCWKCD1296.iso
/
wtest
/
macromed
/
action
/
drivers
/
qtw111
/
pviewer
/
viewmain.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-29
|
17KB
|
522 lines
// ---------------------------------------------------------------------
//
// ViewMain.c - Picture Viewer - QuickTime for Windows
//
// Version 1.0
//
// (c) 1988-1992 Apple Computer, Inc. All Rights Reserved.
//
// ---------------------------------------------------------------------
// Includes
// --------
#include <Windows.h> // Required by Windows
#include <qtw.h> // Interface to QuickTime
#include <qtole.h> // Interface to qtole dll
#include "common.h" // Interface to common.c routines
#include "viewer.h" // Interface to other *.c files
#include "viewer.hr" // Defines used in *.rc files
#include "picture.h" // Needed for registering
// child window controls
// Message-Persistent Data
// -----------------------
static struct // Hungarian notation: g
{HINSTANCE hInstance; // Instance handle
HINSTANCE hResources; // Resource-only DLL handle
HWND hwndFrame; // Frame window handle
HWND hwndClient; // MDI client window
HMENU hMenu; // Frame window menu
HACCEL hAccel; // Frame window accelerators
HWND hActiveModelessDlg; // Handle of active modeless dlg if any
BOOL fPalettized; // Palettized device
QTOLE_OLEDATA qtoleOleData; // OLE data struct
} g;
// Internal Function Declarations
// ------------------------------
static LPSTR NEAR ViewerParseCmdLine (LPSTR);
static BOOL NEAR ViewerInitAppl (VOID);
static HWND NEAR ViewerInitInst (HINSTANCE, LPSTR, int);
static LONG NEAR ViewerTerminateInst (VOID);
static BOOL NEAR DoQuickTimeInit (HINSTANCE, LPSTR, LPINT);
static VOID NEAR KillQuickTime (VOID);
// Function: WinMain - Required Windows "Main" Routine
// --------------------------------------------------------------------
// Parameters: As required by Microsoft Windows
//
// Returns: As required by Microsoft Windows
// --------------------------------------------------------------------
int PASCAL WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
// Define function data
{
MSG msg; // Message
g.hInstance = hInstance; // Initialize global data
// Load resource-only DLL
if( !(g.hResources = CommonGetLocalizedResources
( VIEWER_ROOT_NAME, hInstance, VIEWER_STRING_NOMEMORY )))
return 0;
// Perform one-time initialization
if( !hPrevInstance && !ViewerInitAppl() )
return 0;
// Perform initializations that apply to a specific instance and
// create window
if( !ViewerInitInst( hPrevInstance, lpCmdLine, nCmdShow ))
return 0;
// main message loop
while( GetMessage( &msg, NULL, NULL, NULL )) {
if( !g.hActiveModelessDlg ||
!IsDialogMessage( g.hActiveModelessDlg, &msg )) {
if( !g.hwndClient ||
!TranslateMDISysAccel( g.hwndClient, &msg )) {
if( !g.hwndFrame ||
!TranslateAccelerator( g.hwndFrame, g.hAccel, &msg )) {
TranslateMessage(&msg);
DispatchMessage (&msg);
}
}
}
}
// Cleanup Picture Viewer
ViewerTerminateInst();
return msg.wParam;
}
// Function: ViewerInitAppl - Perform One-time Initialization
// --------------------------------------------------------------------
// Parameters: None
//
// Returns: TRUE if OK, else FALSE
// --------------------------------------------------------------------
static BOOL NEAR ViewerInitAppl( VOID )
{
WNDCLASS wc; // Window class information
// Register the frame (main) window class
wc.style = 0;
wc.lpfnWndProc = ViewerFrameWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = g.hInstance;
wc.hIcon = LoadIcon( g.hResources,
MAKEINTRESOURCE( VIEWER_VIEWER_ICON ));
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH) ( COLOR_APPWORKSPACE + 1 );
wc.lpszMenuName = NULL;
wc.lpszClassName = VIEWER_FRAME_CLASS;
if( !RegisterClass( &wc ))
return FALSE;
// Register the picture window class
wc.style = 0;
wc.lpfnWndProc = ViewerPictureWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof( VOID NEAR * );
wc.hInstance = g.hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = PICBACKGRNDBRUSH;
wc.lpszMenuName = NULL;
wc.lpszClassName = VIEWER_PICTURE_CLASS;
if( !RegisterClass( &wc ))
return FALSE;
// Register the child classes used by the picture windows
// This function is in PictKids.c
if( !RegisterChildControls( g.hInstance ))
return FALSE;
return TRUE;
}
// Function: ViewerInitInst - Perform Instance Initialization
// --------------------------------------------------------------------
// Parameters: HINSTANCE hPrevInstance; Previous instance
// LPSTR lpCmdLine; -->Command line arguments
// int nCmdShow; Parameter for first ShowWindow()
//
// Returns: HWND hwndFrame; Frame window handle
// or NULL if initialization failed
// --------------------------------------------------------------------
static HWND NEAR ViewerInitInst
( HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HDC hdcIC;
// Do QuickTime Initializations.
if( !DoQuickTimeInit( hPrevInstance, lpCmdLine, &nCmdShow ))
return NULL;
// Is this a palettized device?
if( hdcIC = CreateIC( "DISPLAY", NULL, NULL, NULL )) {
g.fPalettized =
( GetDeviceCaps( hdcIC, RASTERCAPS ) & RC_PALETTE );
DeleteDC( hdcIC );
}
// get menu and accelerators from localized resource
g.hAccel = LoadAccelerators( g.hResources,
MAKEINTRESOURCE( VIEWER_ACCELERATORS ));
g.hMenu = LoadMenu( g.hResources,
MAKEINTRESOURCE( VIEWER_FRAME_MENU ));
if( !g.hAccel || !g.hMenu ) {
CommonTellUser( g.hResources, VIEWER_STRING_NOACCELORMENU,
VIEWER_STRING_CAPTION, MB_OK );
return NULL;
}
// Create a main window for this application instance.
if( !(g.hwndFrame = CreateWindow( VIEWER_FRAME_CLASS, "",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, g.hMenu, g.hInstance, NULL ))) {
CommonTellUser( g.hResources, VIEWER_STRING_NOWINDOW,
VIEWER_STRING_CAPTION, MB_OK );
return NULL;
}
// Tell qtole.dll the server hwnd
QTOLE_SetApplicationHwnd( &g.qtoleOleData, g.hwndFrame );
// save MDI client window created during WM_CREATE message processing
g.hwndClient = ViewerQueryClientWindow(); // this is in FrameWnd.c
// Display the frame window
// If ole started the app, the window will be initially hidden
ShowWindow( g.hwndFrame, nCmdShow );
if( nCmdShow != SW_HIDE )
UpdateWindow( g.hwndFrame );
// Check command line for picture file.
// Note: this must come after ShowWindow, UpdateWindow
if( lpCmdLine = ViewerParseCmdLine( lpCmdLine ))
SendMessage( g.hwndFrame,
WM_VIEWER_CMDLINE, 0, (LPARAM) lpCmdLine );
return g.hwndFrame;
}
// Function: ViewerParseCmdLine - Parse the command line. Return -> to
// first argument and ignore any extras.
// The default extension is added if there
// is no extension
// --------------------------------------------------------------------
// Parameters: LPSTR lpCmdLine command line pointer
//
// Returns: LPSTR lpCmdLine command line pointer to first
// argument, else NULL
// --------------------------------------------------------------------
static LPSTR NEAR ViewerParseCmdLine( LPSTR lpCmdLine )
{
LPSTR lpTemp; // Temp pointer
char szExtension[FILE_EXT_LEN + 1]; // Default file extension
BOOL bExtension; // Extension flag
// Command line is already in Ansi char set even if entered from
// DOS command line
// remove any leading blanks
while( *lpCmdLine == ' ' )
lpCmdLine = AnsiNext( lpCmdLine );
if( *lpCmdLine == '\0' )
return NULL;
// look for blank or end of string
bExtension = FALSE;
lpTemp = lpCmdLine;
while( *lpTemp && (*lpTemp != ' ' )) {
if( *lpTemp == '.' )
bExtension = TRUE;
lpTemp = AnsiNext( lpTemp );
}
*lpTemp = '\0';
if( !bExtension ) {
LoadString( g.hResources,
VIEWER_STRING_FILEEXT, szExtension, sizeof( szExtension ));
lstrcat( lpCmdLine, szExtension );
}
return lpCmdLine;
}
// Function: ViewerTerminateInst - Terminate Instance
// --------------------------------------------------------------------
// Parameters: VOID
//
// Returns: Always 0L
// --------------------------------------------------------------------
static LONG NEAR ViewerTerminateInst( VOID )
{
// Clean up OLE
if( g.qtoleOleData.lpqtoleServer )
QTOLE_OLECleanUp( &g.qtoleOleData );
// Cut the connections to QuickTime.
KillQuickTime();
// Free the resource-only DLL
if( g.hResources && ( g.hInstance != g.hResources ))
FreeLibrary( g.hResources );
return 0L;
}
// The next two functions are used to initialize and kill QuickTime
// Function: DoQuickTimeInit - Establishes connections to QuickTime
// --------------------------------------------------------------------
// Parameters: HINSTANCE hPrevInstance Previous instance
// LPSTR lpCmdLine -> command line
// LPINT lpnCmdShow Parameter for first ShowWindow()
//
// Returns: BOOL TRUE if OK, else FALSE
// --------------------------------------------------------------------
static BOOL NEAR DoQuickTimeInit
( HINSTANCE hPrevInstance, LPSTR lpCmdLine, LPINT lpnCmdShow )
{
OSErr oserr; // Temp return value
WORD wIDString; // ID of error message string
QTOLE_INIT qtoleInit;
QTOLE_ERR qtole_err;
char szCaption[30];
LoadString( g.hResources, VIEWER_STRING_CAPTION,
szCaption, sizeof( szCaption ));
// Do OLE initialization before QTInitialize so we
// don't have to kill qt for install only
if( !( qtoleInit.fpServerCallBack =
(QTOLEPROC) MakeProcInstance
( (FARPROC) QTOLEServerCallBack, g.hInstance ))) {
CommonTellUser( g.hResources, VIEWER_STRING_NOMEMORY,
VIEWER_STRING_CAPTION, MB_OK );
return FALSE;
}
else {
qtoleInit.lStructSize = sizeof( qtoleInit );
qtoleInit.lVersion = VERSION_1;
qtoleInit.hInstance = g.hInstance;
qtoleInit.hResources = g.hResources;
qtoleInit.lpCmdLine = lpCmdLine;
qtoleInit.lpClassName = VIEWER_FRAME_CLASS;
qtoleInit.lpServerCaption = szCaption;
qtoleInit.lpnCmdShow = lpnCmdShow;
qtoleInit.wIDFirstString = OLE_STRING_FIRST;
qtoleInit.wIDFirstDlg = OLE_DLG_FIRST;
qtoleInit.bMultipleObjectServer = TRUE;
g.qtoleOleData.lStructSize = sizeof( g.qtoleOleData );
g.qtoleOleData.lVersion = VERSION_1;
g.qtoleOleData.wObjectType = PICTURE_OBJECT;
if( QTOLE_OK !=
( qtole_err = QTOLE_Initialize( &g.qtoleOleData, &qtoleInit ))) {
if( QTOLE_INSTALL_ONLY != qtole_err )
CommonTellUser( g.hResources,
VIEWER_STRING_OLEINITFAILED,
VIEWER_STRING_CAPTION, MB_OK );
return FALSE;
}
}
if( ( oserr = QTInitialize( NULL )) != QTI_OK ) {
switch( oserr ) {
case QTI_FAIL_NOEXIST:
wIDString = VIEWER_STRING_QTWNOEXIST;
break;
case QTI_FAIL_CORRUPTDLL:
wIDString = VIEWER_STRING_QTWBADDLL;
break;
case QTI_FAIL_286:
wIDString = VIEWER_STRING_QTW286;
break;
case QTI_FAIL_WIN30:
wIDString = VIEWER_STRING_QTWWIN30;
break;
default:
wIDString = VIEWER_STRING_QTWFAILED;
break;
}
CommonTellUser( g.hResources, wIDString,
VIEWER_STRING_CAPTION, MB_OK );
return FALSE;
}
// This function call is necessary to make possible the use of
// the function GetMovieStickyError() that returns the error code
// for certain QTW functions.
if( EnterMovies() ) {
CommonTellUser( g.hResources, VIEWER_STRING_ENTMOVFAILED,
VIEWER_STRING_CAPTION, MB_OK );
return FALSE;
}
return TRUE;
}
// Function: KillQuickTime - Cuts the connections to QuickTime
// --------------------------------------------------------------------
// Parameters: VOID
//
// Returns: VOID
// --------------------------------------------------------------------
static VOID NEAR KillQuickTime( VOID )
{
ExitMovies();
QTTerminate();
return;
}
// This function is called by other modules whenever a modeless dialog
// is activated or deactivated
// Function: ViewerSetActiveModeless - Set handle of active modeless dlg
// --------------------------------------------------------------------
// Parameters: WPARAM wParam WA_ flag defined in Windows.h
// HWND hModelessDlg Handle of dlg being activated or
// deactivated
//
// Returns: VOID
// --------------------------------------------------------------------
VOID FAR ViewerSetActiveModeless( WPARAM wParam, HWND hModelessDlg )
{
if( wParam != WA_INACTIVE )
g.hActiveModelessDlg = hModelessDlg;
else if( g.hActiveModelessDlg == hModelessDlg )
g.hActiveModelessDlg = NULL;
return;
}
// Function: ViewerNoMoreWindow - Sets global handles to NULL. Called during
// frame window WM_DESTROY message processing
// This is needed for accelerator tests in
// main message loop after window is destroyed
// --------------------------------------------------------------------
// Parameters: VOID
//
// Returns: VOID
// --------------------------------------------------------------------
VOID FAR ViewerNoMoreWindow( VOID )
{
g.hwndFrame = NULL;
g.hwndClient = NULL;
return;
}
/// The remaining functions are the query functions called by other modules
// Function: ViewerQueryInstance - Query Instance Handle
// --------------------------------------------------------------------
// Parameters: None.
//
// Returns: HINSTANCE hInstance; Application instance handle
// --------------------------------------------------------------------
HINSTANCE FAR ViewerQueryInstance( VOID )
{
return g.hInstance;
}
// Function: ViewerQueryResources - Query Resource-Only DLL Handle
// --------------------------------------------------------------------
// Parameters: None.
//
// Returns: HINSTANCE hResources Resource-only DLL handle
// --------------------------------------------------------------------
HINSTANCE FAR ViewerQueryResources( VOID )
{
return g.hResources;
}
// Function: ViewerQueryFrameWindow - Query Frame Window Handle
// --------------------------------------------------------------------
// Parameters: None.
//
// Returns: HWND hwndFrame; Frame window handle
// --------------------------------------------------------------------
HWND FAR ViewerQueryFrameWindow( VOID )
{
return g.hwndFrame;
}
// Function: ViewerIsPalettized - Are we running on a palettized device?
// --------------------------------------------------------------------
// Parameters: None.
//
// Returns: BOOL fPalettized; TRUE if palettized device
// --------------------------------------------------------------------
BOOL FAR ViewerIsPalettized( VOID )
{
return g.fPalettized;
}
// Function: ViewerQueryOleData - Query -> to Ole Data struct
// --------------------------------------------------------------------
// Parameters: None.
//
// Returns: LPQTOLE_OLEDATA -> ole data struct
// --------------------------------------------------------------------
LPQTOLE_OLEDATA FAR ViewerQueryOleData( VOID )
{
return &g.qtoleOleData;
}