COM

 

 

All COM objects are inherited from a common base class.

 

class IUnkown    // abstract base class

{ public:

    // get ptr to interface

    virtual HRESULT    __stdcall QueryInterface(<parms>) =0;

    // inc object count

    virtual ULONG __stdcall AddRef()=0;

    // dec count & release obj resources

    virtual ULONG __stdcall Release()=0;

}

// __stdcall forces parm onto the stack in right to left order

 

 

INTERFACES

IUnknown: baseclass w/vitual functions that get set to match your hardware at init.

IDirectDraw: represents the video card, sets video mode, interfaces to other modules

IDirectDrawSurface: represents video memory/drawing surface, but surfaces can also be created in main memory

IDirectDrawPallette: represents color palette associated with each drawing surface

IDirectDrawClipper: represents a DD clipper (a set of rectangles that DD can draw into), manages the clipping areas

 

Create a DD object

 

HRESULT DirectDrawCreateEx(<video id>,<ptr>,<NULL>);

returns DD_OK if it works, videoID = NULL selects curr driver

ptr = address of DD obj

 

LPDIRECTDRAW7 lpdd;

if (DirectDrawCreateEx(NULL, (void **)&lpdd, NULL) != DD_OK)

    // ERROR

 

now  lpdd->function(<parms>); calls DD functions

 

after you are done with the object you must de-allocate

      lpdd->Release();

 

 

SET COPERATION LEVEL W/WINDOWS

HRESULT SetCooperativeLevel(<hWnd>, <flags>);

flags:

DDSCL_ALLOWMODEX

mode x (320X220 or 320X240) must be used w/full & exclusive

DDSCL_ALLOWREBOOT

allow ctr/alt/del in fullscreen

DDSCL_EXCLUSIVE

exclusive access, must be used w/fullscreen

DDSCL_FULLSCREEN

DD does whole screen w/o windows

DDSCL_NORMAL

act as a normal window

DDSCL_NOWINDOWSCHANGES

DD can’t minimize or restore app on activation

 

To do a fullscreen application:

lpdd->SetCooperativeLevel(hWnd, DDSCL_ALLOEMODEX | DDSCL_FULLSCREEN | DDSCLEXCLUSIVE | DDSCL_ALLOWREBOOT);

 

SETTING VIDEO MODE

lpdd->SetDisplayMode(<width>,<height>,<bits>,0,0);

   bits is bits per pixel

 

if (lpdd->SetDisplayMode(640,480,8)!=DD_OK)

  // ERROR

 

you can change video mode any time in a pgm, but avoid it

 

DDSurfaces

DD refers to displayable memory as surfaces.

 

·       The Primary Surface is directly mapped to the video memory on the card (VRAM).

·       Surfaces can be any size but the primary must be same as the resolution in use.

·       Can create in RAM or VRAM

·       All surfaces have the same depth & color properties as the primary.

 

 

Typical windows program has

·       Primary surface

·       Secondary surface – backBuffer for animation

·       Offscreen surfaces – hold bitmaps or sprites for fast display

 

 

Complete Example:

// Creates a DirectDraw object and changes display

 

// INCLUDES

#define WINDOWS_LEAN_AND_MEAN 

#include <windows.h>   // include important windows stuff

#include <windowsx.h>

#include <mmsystem.h>

#include <iostream.h> // include important C/C++ stuff

#include <conio.h>

#include <stdlib.h>

#include <malloc.h>

#include <memory.h>

#include <string.h>

#include <stdarg.h>

#include <stdio.h>

#include <math.h>

#include <io.h>

#include <fcntl.h>

#include <ddraw.h>  // directX includes

 

// DEFINES

// defines for windows

#define WINDOW_CLASS_NAME "WINXCLASS"  // class name

#define WINDOW_WIDTH  320              // size of window

#define WINDOW_HEIGHT 200

 

// MACROS

// these read the keyboard asynchronously

#define KEY_DOWN(vk_code)((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)

#define KEY_UP(vk_code)  ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

 

// PROTOTYPES

int GameInit(void *parms=NULL);

int GameShutdown(void *parms=NULL);

int GameMain(void *parms=NULL);

 

// GLOBALS

HWND mainWindowHandle = NULL; // save the window handle

HINSTANCE mainInstance = NULL; // save the instance

char buffer[80];                // used to print text

LPDIRECTDRAW lpdd;   // pointer to direct draw object

 

// 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

 

  // what is the message

  switch(msg)

  { case WM_CREATE:

    { // do initialization stuff here

      return(0);

    } break;

 

    case WM_PAINT:

    { // start painting

      hdc = BeginPaint(hwnd,&ps);

 

      // end painting

      EndPaint(hwnd,&ps);

      return(0);

    } break;

 

    case WM_DESTROY:

    { // kill the application            

      PostQuitMessage(0);

      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

 

// *************** WINMAIN ****************

int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hprevinstance,

                   LPSTR lpcmdline, int ncmdshow)

{ WNDCLASS winclass;    // this will hold the class we create

  HWND      hwnd;            // generic window handle

  MSG       msg;       // generic message

  HDC      hdc;       // generic dc

  PAINTSTRUCT ps;     // generic paintstruct

 

  // first fill in the window class stucture

  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(NULL, IDI_APPLICATION);

  winclass.hCursor            = LoadCursor(NULL, IDC_ARROW);

  winclass.hbrBackground      = GetStockObject(BLACK_BRUSH);

  winclass.lpszMenuName = NULL;

  winclass.lpszClassName      = WINDOW_CLASS_NAME;

 

  // register the window class

  if (!RegisterClass(&winclass))

      return(0);

 

  // create the window

  if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME, "WinX Game Console",

            WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, WINDOW_WIDTH,

            WINDOW_HEIGHT, NULL, NULL, hinstance, NULL)))  

         return(0);

 

  // save the window handle and instance in a global

  mainWindowHandle = hwnd;

  mainInstance     = hinstance;

 

  // perform all game console specific initialization

  GameInit();

 

  // enter main event loop

  while(1)

  {

      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

      GameMain();

  } // end while

 

  // shutdown game and release all resources

  GameShutdown();

  // return to Windows like this

  return(msg.wParam);

} // end WinMain

 

// WINX GAME PROGRAMMING CONSOLE FUNCTIONS

int GameInit(void *parms)

{ // this function is where you do all the initialization

  // for your game

 

  // create object and test for error

  if (DirectDrawCreate(NULL,&lpdd,NULL)!=DD_OK)

     return(0);

 

  // set cooperation level to windowed mode normal

  if ((lpdd->SetCooperativeLevel(mainWindowHandle,

      DDSCL_ALLOWMODEX | DDSCL_FULLSCREEN |

      DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT))!=DD_OK)

      return(0);

 

  // set the display mode

  if ((lpdd->SetDisplayMode(640,480,8))!=DD_OK)

     return(0);

 

  // return success

  return(1);

} // end GameInit

 

 

 

int GameShutdown(void *parms)

{ // this function is where you shutdown your game and

  // release all resources that you allocated

 

  // release the directdraw object

  if (lpdd!=NULL)

     lpdd->Release();

 

  // return success

  return(1);

} // end GameShutdown

 

int GameMain(void *parms)

{ // check of user is trying to exit

  if (KEY_DOWN(VK_ESCAPE) || KEY_DOWN(VK_SPACE))

      PostMessage(mainWindowHandle, WM_DESTROY,0,0);

 

  // return success

  return(1);

} // end GameMain