www.pudn.com > bookcode.rar > main.cpp


//Example1_3 
//main.cpp 
//Ernest Pazera 
//05OCT2001 
//TGO-01-F 
//Libs: d3d8.lib 
 
#include 	//include windows stuff 
#include 		//standard input/output 
#include "D3D8.h"	//include direct3d8 stuff 
#include "d3dfmtutils.h"	//include format utility functions 
 
//constants 
	//window class name 
	const char* WINDOWCLASS = "3D42DGP" ; 
	//window title 
	const char* WINDOWTITLE = "Example 1.3 (TGO-01-F): Enumerating Adapter Display Modes" ; 
 
//globals 
	//instance handle 
	HINSTANCE g_hInstance = NULL ; 
	//window handle 
	HWND g_hWnd = NULL ; 
	//IDirect3D8 pointer 
	IDirect3D8* g_pd3d = NULL ; 
 
//function prototypes 
	//winmain 
	int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nShowCmd ) ; 
	//window procedure 
	LRESULT CALLBACK TheWindowProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam ) ; 
	//initialization 
	void Prog_Init ( ) ; 
	//clean up 
	void Prog_Done ( ) ; 
 
 
//window procedure 
LRESULT CALLBACK TheWindowProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam ) 
{ 
	//which message did we get? 
	switch ( uMsg ) 
	{ 
	case WM_DESTROY : //window being destroyed 
		{ 
			//quit 
 
			PostQuitMessage ( 0 ) ; 
 
			//message handled, return 0 
 
			return ( 0 ) ; 
 
		} break ; 
	default:  //all other messages, send to default handler 
		return ( DefWindowProc ( hWnd , uMsg , wParam , lParam ) ) ; 
	} 
} 
 
//winmain 
int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nShowCmd ) 
{ 
	//grab instance handle 
	g_hInstance = hInstance ; 
 
	//redirect stderr and stdout output 
	freopen ( "stdout.txt" , "w" , stdout ) ; 
 
	//fill in window class 
	WNDCLASSEX wc ; 
	wc.cbClsExtra = 0 ;	//no extra class information 
	wc.cbSize = sizeof ( WNDCLASSEX ) ; //size of structure 
	wc.cbWndExtra = 0 ;	//no extra window information 
	wc.hbrBackground = ( HBRUSH ) GetStockObject ( BLACK_BRUSH ) ;	//black brush 
	wc.hCursor = NULL ;	//no cursor 
	wc.hIcon = NULL ;	//no icon 
	wc.hIconSm = NULL ;	//no small icon 
	wc.hInstance = g_hInstance ;	//instance handle 
	wc.lpfnWndProc = TheWindowProc ;	//window procedure 
	wc.lpszClassName = WINDOWCLASS ;	//name of class 
	wc.lpszMenuName = NULL ;	//no menu 
	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC ;	//class styles 
 
	//register window class 
	RegisterClassEx ( &wc ) ; 
 
	//create window 
	g_hWnd = CreateWindowEx ( 0 , WINDOWCLASS , WINDOWTITLE , WS_OVERLAPPEDWINDOW , 0 , 0 , 320 , 240 , NULL , NULL , g_hInstance , NULL ) ; 
 
	//show the window 
	ShowWindow ( g_hWnd , nShowCmd ) ; 
 
	//initialization 
	Prog_Init ( ) ; 
 
	MSG msg ; 
	//message pump 
	for ( ; ; )  
	{ 
		//check for a message 
		if ( PeekMessage( &msg , NULL , 0 , 0 , PM_REMOVE ) ) 
		{ 
			//message exists 
 
			//check for quit message 
			if ( msg.message == WM_QUIT ) break ; 
 
			//translate the message 
			TranslateMessage ( &msg ) ; 
 
			//dispatch the message 
			DispatchMessage ( &msg ) ; 
		} 
	} 
 
	//clean up 
	Prog_Done ( ) ; 
 
	//exit 
	return ( msg.wParam ) ; 
} 
 
//initialization 
void Prog_Init ( )  
{ 
	//create the IDirect3D8 object 
	g_pd3d = Direct3DCreate8 ( D3D_SDK_VERSION ) ; 
 
	//error check 
	if ( g_pd3d ) 
	{ 
		//success 
		fprintf ( stdout , "IDirect3D8 object created successfully.\n" ) ; 
	} 
	else 
	{ 
		//failure 
		fprintf ( stdout , "IDirect3D8 object creation failed.\n" ) ; 
 
		//cannot proceed, so return 
		return ; 
	} 
 
	//enumerate display adapters 
 
	//get the number of display adapters for the system 
	UINT nAdapterCount = g_pd3d->GetAdapterCount ( ) ; 
 
	//structure for retrieving data 
	D3DADAPTER_IDENTIFIER8 ident ; 
 
	//loop through display adapters 
	for ( UINT nAdapter = 0 ; nAdapter < nAdapterCount ; nAdapter ++ )  
	{ 
		//grab adapter identifier 
		g_pd3d->GetAdapterIdentifier ( nAdapter , 0 , &ident ) ; 
 
		//report identifier information 
		//ordinal 
		fprintf ( stdout , "Adapter#%d\n" , nAdapter ) ; 
 
		//driver name 
		fprintf ( stdout , "\tDriver:%s\n" , ident.Driver ) ; 
 
		//description 
		fprintf ( stdout , "\tDescription:%s\n\n" , ident.Description ) ; 
 
		//enumerate adapter display modes 
 
		//get number of modes 
		UINT nModeCount = g_pd3d->GetAdapterModeCount ( nAdapter ) ; 
 
		//structure for receiving data 
		D3DDISPLAYMODE mode ; 
 
		//temporary string for holding format name 
		char temp [ 40 ] ; 
 
		//loop through modes 
		for ( UINT nMode = 0 ; nMode < nModeCount ; nMode ++ ) 
		{ 
			//grab display mode 
			g_pd3d->EnumAdapterModes ( nAdapter , nMode , &mode ) ; 
 
			//report information about mode: 
			//# of mode 
			fprintf ( stdout , "\tMode#%d\n" , nMode ) ; 
 
			//width 
			fprintf ( stdout , "\t\tWidth:%d\n" , mode.Width ) ; 
 
			//height 
			fprintf ( stdout , "\t\tHeight:%d\n" , mode.Height ) ; 
 
			//grab name of the format 
			GetFormatName ( mode.Format , temp ) ; 
 
			//format 
			fprintf ( stdout , "\t\tFormat:%s\n\n" , temp ) ; 
		} 
	} 
 
} 
 
//clean up 
void Prog_Done ( )  
{ 
	//safe release of IDirect3D8 object 
	if ( g_pd3d ) 
	{ 
		//release 
		g_pd3d->Release ( ) ; 
 
		//set to null 
		g_pd3d = NULL ; 
 
		//report action 
		fprintf ( stdout , "IDirect3D8 object released.\n" ) ; 
	} 
}