www.pudn.com > 3DÓÎÏ·Source.rar > demo10_6.cpp


// DEMO10_6.CPP DirectMusic/DirectSound mixed mode Example 
// make sure to link T3DLIB3.CPP and DEMO10_6.RC 
 
// INCLUDES /////////////////////////////////////////////// 
 
#define INITGUID 
 
#define WIN32_LEAN_AND_MEAN  // just say no to MFC 
 
#include    // include important windows stuff 
#include   
#include  
#include  // include important C/C++ stuff 
#include  
#include  
#include  
#include  
#include  
#include  
#include   
#include  
#include  
#include  
#include  
#include  
 
#include  
#include  // include dsound, dmusic 
#include  
#include  
#include  
#include  
 
#include "T3DLIB3.H" 
#include "DEMO10_6RES.H" 
 
// DEFINES //////////////////////////////////////////////// 
 
// defines for windows  
#define WINDOW_CLASS_NAME "WINCLASS1" 
 
// default screen size 
#define SCREEN_WIDTH    640  // size of screen 
#define SCREEN_HEIGHT   480 
#define SCREEN_BPP      8    // bits per pixel 
#define MAX_COLORS      256  // maximum colors 
 
 
// TYPES ////////////////////////////////////////////////////// 
 
// basic unsigned types 
typedef unsigned short USHORT; 
typedef unsigned short WORD; 
typedef unsigned char  UCHAR; 
typedef unsigned char  BYTE; 
 
// MACROS ///////////////////////////////////////////////// 
 
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) 
 
// PROTOTYPES ///////////////////////////////////////////// 
 
// GLOBALS //////////////////////////////////////////////// 
 
HWND      main_window_handle = NULL; // globally track main window 
HINSTANCE main_instance      = NULL; // globally track hinstance 
 
int midi_ids[10]; // hold storage for 10 songs ids 
int sound_ids[4]; // storage for 4 sound fx ids 
 
char buffer[80];                     // general printing buffer 
 
// FUNCTIONS ////////////////////////////////////////////// 
 
LRESULT CALLBACK WindowProc(HWND hwnd,  
						    UINT msg,  
                            WPARAM wparam,  
                            LPARAM lparam) 
{ 
// this is the main message handler of the system 
PAINTSTRUCT		ps;		// used in WM_PAINT 
HDC				hdc;	// handle to a device context 
char buffer[80];        // used to print strings 
 
// what is the message  
switch(msg) 
	{	 
	case WM_CREATE:  
        { 
		// do initialization stuff here 
        // return success 
		return(0); 
		} break; 
 
     case WM_COMMAND: 
         { 
          switch(LOWORD(wparam)) 
                { 
                // handle the FILE menu 
                case MENU_FILE_ID_EXIT: 
                     { 
                     // terminate window 
                     PostQuitMessage(0); 
                     } break; 
 
                // handle the HELP menu 
                case MENU_HELP_ABOUT:                  
                     { 
                     //  pop up a message box 
                     MessageBox(hwnd, "Menu MIDI Demo",  
                               "About MIDI Menu", 
                                MB_OK | MB_ICONEXCLAMATION); 
                     } break; 
 
                // handle each of midi files 
                case MENU_PLAY_ID_0: 
                case MENU_PLAY_ID_1: 
                case MENU_PLAY_ID_2: 
                case MENU_PLAY_ID_3: 
                case MENU_PLAY_ID_4: 
                case MENU_PLAY_ID_5: 
                case MENU_PLAY_ID_6: 
                case MENU_PLAY_ID_7: 
                case MENU_PLAY_ID_8: 
                case MENU_PLAY_ID_9: 
                     { 
                     // play the midi file 
                     int id =  LOWORD(wparam) - MENU_PLAY_ID_0; 
                      
                     DMusic_Play(midi_ids[id]); 
         
                     // get the device context 
                     HDC hdc = GetDC(hwnd); 
 
                     // set the foreground color to random 
                     SetTextColor(hdc, RGB(0,255,0)); 
 
                     // set the background color to black 
                     SetBkColor(hdc, RGB(0,0,0)); 
 
                     // finally set the transparency mode to transparent 
                     SetBkMode(hdc, OPAQUE); 
 
                     sprintf(buffer,"Playing MIDI segment [%d]   ",id); 
  
                     // draw the midi file 
                     TextOut(hdc,8,200,buffer, strlen(buffer)); 
 
                     ReleaseDC(hwnd, hdc); 
 
                     } break; 
 
                // handle each of digtial files 
                case MENU_PLAY_ID_10: 
                case MENU_PLAY_ID_11: 
                case MENU_PLAY_ID_12: 
                case MENU_PLAY_ID_13: 
                     { 
                     // play the digital file 
                     int id =  LOWORD(wparam) - MENU_PLAY_ID_10; 
                      
                     DSound_Play(sound_ids[id]); 
         
                     // get the device context 
                     HDC hdc = GetDC(hwnd); 
 
                     // set the foreground color to random 
                     SetTextColor(hdc, RGB(0,255,0)); 
 
                     // set the background color to black 
                     SetBkColor(hdc, RGB(0,0,0)); 
 
                     // finally set the transparency mode to transparent 
                     SetBkMode(hdc, OPAQUE); 
 
                     sprintf(buffer,"Playing DIGITAL WAV [%d]   ",id); 
  
                     // draw the midi file 
                     TextOut(hdc,8,216,buffer, strlen(buffer)); 
 
                     ReleaseDC(hwnd, hdc); 
 
                     } break; 
 
                default: break; 
 
             } // end switch wparam 
 
          } break; // end WM_COMMAND 
    
	case WM_PAINT:  
		{ 
		// simply validate the window  
   	    hdc = BeginPaint(hwnd,&ps);	  
         
        // end painting 
        EndPaint(hwnd,&ps); 
 
        // return success 
		return(0); 
   		} break; 
 
	case WM_DESTROY:  
		{ 
 
		// kill the application, this sends a WM_QUIT message  
		PostQuitMessage(0); 
 
        // return success 
		return(0); 
		} break; 
 
	default:break; 
 
    } // end switch 
 
// process any messages that we didn't take care of  
return (DefWindowProc(hwnd, msg, wparam, lparam)); 
 
} // end WinProc 
 
/////////////////////////////////////////////////////////// 
 
int Game_Main(void *parms = NULL, int num_parms = 0) 
{ 
// this is the main loop of the game, do all your processing 
// here 
 
int index; 
 
// get the device context 
HDC hdc = GetDC(main_window_handle); 
 
// for now test if user is hitting ESC and send WM_CLOSE 
if (KEYDOWN(VK_ESCAPE)) 
   SendMessage(main_window_handle,WM_CLOSE,0,0); 
 
// return success or failure or your own return code here 
return(1); 
 
} // end Game_Main 
 
/////////////////////////////////////////////////////////// 
 
int Game_Init(void *parms = NULL, int num_parms = 0) 
{ 
// this is called once after the initial window is created and 
// before the main event loop is entered, do all your initialization 
// here 
int index; 
 
// initialize directsound 
DSound_Init(); 
 
// initialize directmusic 
DMusic_Init(); 
 
 
// load in the digital sound 
sound_ids[0] = DSound_Load_WAV("DEACTIVATE1.WAV"); 
sound_ids[1] = DSound_Load_WAV("EXP0.WAV"); 
sound_ids[2] = DSound_Load_WAV("INCORRECT1.WAV"); 
sound_ids[3] = DSound_Load_WAV("UPLINK1.WAV"); 
 
// load the midi segments 
for (index=0; index<10; index++) 
    { 
    // build up string name 
    sprintf(buffer,"MIDIFILE%d.MID",index); 
    // load midi file 
    midi_ids[index] = DMusic_Load_MIDI(buffer); 
    } // end for index 
 
 
// return success or failure or your own return code here 
return(1); 
 
} // end Game_Init 
 
///////////////////////////////////////////////////////////// 
 
int Game_Shutdown(void *parms = NULL, int num_parms = 0) 
{ 
// this is called after the game is exited and the main event 
// loop while is exited, do all you cleanup and shutdown here 
 
// stop all sounds 
DSound_Stop_All_Sounds(); 
 
// delete all sounds 
DSound_Delete_All_Sounds(); 
 
// shutdown directsound 
DSound_Shutdown(); 
 
// delete all the music 
DMusic_Delete_All_MIDI(); 
 
// shutdown directmusic 
DMusic_Shutdown(); 
 
// return success or failure or your own return code here 
return(1); 
 
} // end Game_Shutdown 
 
// WINMAIN //////////////////////////////////////////////// 
 
int WINAPI WinMain(	HINSTANCE hinstance, 
					HINSTANCE hprevinstance, 
					LPSTR lpcmdline, 
					int ncmdshow) 
{ 
 
WNDCLASSEX winclass; // this will hold the class we create 
HWND	   hwnd;	 // generic window handle 
MSG		   msg;		 // generic message 
HDC        hdc;      // graphics device context 
 
// first fill in the window class stucture 
winclass.cbSize         = sizeof(WNDCLASSEX); 
winclass.style			= CS_DBLCLKS | CS_OWNDC |  
                          CS_HREDRAW | CS_VREDRAW; 
winclass.lpfnWndProc	= WindowProc; 
winclass.cbClsExtra		= 0; 
winclass.cbWndExtra		= 0; 
winclass.hInstance		= hinstance; 
winclass.hIcon			= LoadIcon(hinstance, MAKEINTRESOURCE(ICON_T3DX)); 
winclass.hCursor		= LoadCursor(hinstance, MAKEINTRESOURCE(CURSOR_CROSSHAIR));  
winclass.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH); 
winclass.lpszMenuName	= "SoundMenu"; 
winclass.lpszClassName	= WINDOW_CLASS_NAME; 
winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION); 
 
// save hinstance in global 
main_instance = hinstance; 
 
// register the window class 
if (!RegisterClassEx(&winclass)) 
	return(0); 
 
// create the window 
if (!(hwnd = CreateWindowEx(NULL,                  // extended style 
                            WINDOW_CLASS_NAME,     // class 
						    "DirectMusic/DirectSound Mixed Mode Demo", // title 
						    WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
					 	    0,0,	  // initial x,y 
						    400,300,  // initial width, height 
						    NULL,	  // handle to parent  
						    NULL,	  // handle to menu 
						    hinstance,// instance of this application 
						    NULL)))	// extra creation parms 
return(0); 
 
// save main window handle 
main_window_handle = hwnd; 
 
// initialize game here 
Game_Init(); 
 
// enter main event loop 
while(TRUE) 
	{ 
    // test if there is a message in queue, if so get it 
	if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
	   {  
	   // test if this is a quit 
       if (msg.message == WM_QUIT) 
           break; 
	 
	   // translate any accelerator keys 
	   TranslateMessage(&msg); 
 
	   // send the message to the window proc 
	   DispatchMessage(&msg); 
	   } // end if 
     
       // main game processing goes here 
       Game_Main(); 
        
	} // end while 
 
// closedown game here 
Game_Shutdown(); 
 
// return to Windows like this 
return(msg.wParam); 
 
} // end WinMain 
 
///////////////////////////////////////////////////////////