forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			130 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//------------------------------------------------------------------------------
 | 
						|
// File: DDMM.cpp
 | 
						|
//
 | 
						|
// Desc: DirectShow base classes - implements routines for using DirectDraw
 | 
						|
//       on a multimonitor system.
 | 
						|
//
 | 
						|
// Copyright (c) 1995-2001 Microsoft Corporation.  All rights reserved.
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
#include <streams.h>
 | 
						|
#include <ddraw.h>
 | 
						|
#include "ddmm.h"
 | 
						|
 | 
						|
/*
 | 
						|
 * FindDeviceCallback
 | 
						|
 */
 | 
						|
typedef struct {
 | 
						|
	LPSTR   szDevice;
 | 
						|
	GUID*   lpGUID;
 | 
						|
	GUID    GUID;
 | 
						|
	BOOL    fFound;
 | 
						|
}   FindDeviceData;
 | 
						|
 | 
						|
BOOL CALLBACK FindDeviceCallback(__in_opt GUID* lpGUID, __in LPSTR szName, __in LPSTR szDevice, __in LPVOID lParam)
 | 
						|
{
 | 
						|
	FindDeviceData *p = (FindDeviceData*)lParam;
 | 
						|
 | 
						|
	if (lstrcmpiA(p->szDevice, szDevice) == 0) {
 | 
						|
	    if (lpGUID) {
 | 
						|
		p->GUID = *lpGUID;
 | 
						|
		p->lpGUID = &p->GUID;
 | 
						|
	    } else {
 | 
						|
		p->lpGUID = NULL;
 | 
						|
	    }
 | 
						|
	    p->fFound = TRUE;
 | 
						|
	    return FALSE;
 | 
						|
	}
 | 
						|
	return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
BOOL CALLBACK FindDeviceCallbackEx(__in_opt GUID* lpGUID, __in LPSTR szName, __in LPSTR szDevice, __in LPVOID lParam, HMONITOR hMonitor)
 | 
						|
{
 | 
						|
	FindDeviceData *p = (FindDeviceData*)lParam;
 | 
						|
 | 
						|
	if (lstrcmpiA(p->szDevice, szDevice) == 0) {
 | 
						|
	    if (lpGUID) {
 | 
						|
		p->GUID = *lpGUID;
 | 
						|
		p->lpGUID = &p->GUID;
 | 
						|
	    } else {
 | 
						|
		p->lpGUID = NULL;
 | 
						|
	    }
 | 
						|
	    p->fFound = TRUE;
 | 
						|
	    return FALSE;
 | 
						|
	}
 | 
						|
	return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * DirectDrawCreateFromDevice
 | 
						|
 *
 | 
						|
 * create a DirectDraw object for a particular device
 | 
						|
 */
 | 
						|
IDirectDraw * DirectDrawCreateFromDevice(__in_opt LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, PDRAWENUM DirectDrawEnumerateP)
 | 
						|
{
 | 
						|
	IDirectDraw*    pdd = NULL;
 | 
						|
	FindDeviceData  find;
 | 
						|
 | 
						|
	if (szDevice == NULL) {
 | 
						|
		DirectDrawCreateP(NULL, &pdd, NULL);
 | 
						|
		return pdd;
 | 
						|
	}
 | 
						|
 | 
						|
	find.szDevice = szDevice;
 | 
						|
	find.fFound   = FALSE;
 | 
						|
	DirectDrawEnumerateP(FindDeviceCallback, (LPVOID)&find);
 | 
						|
 | 
						|
	if (find.fFound)
 | 
						|
	{
 | 
						|
		//
 | 
						|
		// In 4bpp mode the following DDraw call causes a message box to be popped
 | 
						|
		// up by DDraw (!?!).  It's DDraw's fault, but we don't like it.  So we
 | 
						|
		// make sure it doesn't happen.
 | 
						|
		//
 | 
						|
		UINT ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
 | 
						|
		DirectDrawCreateP(find.lpGUID, &pdd, NULL);
 | 
						|
		SetErrorMode(ErrorMode);
 | 
						|
	}
 | 
						|
 | 
						|
	return pdd;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * DirectDrawCreateFromDeviceEx
 | 
						|
 *
 | 
						|
 * create a DirectDraw object for a particular device
 | 
						|
 */
 | 
						|
IDirectDraw * DirectDrawCreateFromDeviceEx(__in_opt LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, LPDIRECTDRAWENUMERATEEXA DirectDrawEnumerateExP)
 | 
						|
{
 | 
						|
	IDirectDraw*    pdd = NULL;
 | 
						|
	FindDeviceData  find;
 | 
						|
 | 
						|
	if (szDevice == NULL) {
 | 
						|
		DirectDrawCreateP(NULL, &pdd, NULL);
 | 
						|
		return pdd;
 | 
						|
	}
 | 
						|
 | 
						|
	find.szDevice = szDevice;
 | 
						|
	find.fFound   = FALSE;
 | 
						|
	DirectDrawEnumerateExP(FindDeviceCallbackEx, (LPVOID)&find,
 | 
						|
					DDENUM_ATTACHEDSECONDARYDEVICES);
 | 
						|
 | 
						|
	if (find.fFound)
 | 
						|
	{
 | 
						|
		//
 | 
						|
		// In 4bpp mode the following DDraw call causes a message box to be popped
 | 
						|
		// up by DDraw (!?!).  It's DDraw's fault, but we don't like it.  So we
 | 
						|
		// make sure it doesn't happen.
 | 
						|
		//
 | 
						|
		UINT ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
 | 
						|
		DirectDrawCreateP(find.lpGUID, &pdd, NULL);
 | 
						|
		SetErrorMode(ErrorMode);
 | 
						|
	}
 | 
						|
 | 
						|
	return pdd;
 | 
						|
}
 |