CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

关于directshow和directdraw(痛苦中)

楼主absolutelyzero()2005-04-27 23:24:27 在 VC/MFC / 图形处理/算法 提问

最近在做一个游戏,我想在游戏片头加个动画,然后我想弹出一个界面。第一步我用的是directshow,第二步我用的是directdraw,这两部分开来做都没问题。但和在一起就有问题啦!实在郁闷。写动画的代码我是从帮助文档中考的:  
   
  #include   <windows.h>  
  #include   <dshow.h>  
   
  #define   CLASSNAME   "VideoWindow"  
   
  IGraphBuilder       *pGraph   =   NULL;  
  IMediaControl       *pMediaControl   =   NULL;  
  IVideoWindow         *pVidWin   =   NULL;  
  HWND                         g_hwnd;  
   
  void   PlayFile(void)  
  {  
          //   Create   the   filter   graph   manager.  
          CoCreateInstance(CLSID_FilterGraph,   NULL,   CLSCTX_INPROC,    
                  IID_IGraphBuilder,   (void   **)&pGraph);  
          pGraph->QueryInterface(IID_IMediaControl,   (void   **)&pMediaControl);  
          pGraph->QueryInterface(IID_IVideoWindow,   (void   **)&pVidWin);  
   
          //   Build   the   graph.    
          pGraph->RenderFile(L"Test.avi",   NULL);  
   
          //Set   the   video   window.  
          pVidWin->put_Owner((OAHWND)g_hwnd);  
          pVidWin->put_WindowStyle(WS_CHILD   |   WS_CLIPSIBLINGS);  
   
          RECT   grc;  
          GetClientRect(g_hwnd,   &grc);  
          pVidWin->SetWindowPosition(0,   0,   grc.right,   grc.bottom);  
   
          //   Run   the   graph.  
          pMediaControl->Run();  
  }  
   
  void   CleanUp(void)  
  {  
          pVidWin->put_Visible(OAFALSE);  
          pVidWin->put_Owner(NULL);        
          pMediaControl->Release();  
          pVidWin->Release();  
          pGraph->Release();  
  }  
   
  //   Message   handler.  
  long   FAR   PASCAL   WindowProc(   HWND   hwnd,   UINT   msg,   UINT   wParam,   LONG   lParam)  
  {  
          switch   (msg)  
          {  
                  case   WM_DESTROY:  
                          CleanUp();  
                          PostQuitMessage(0);  
                          break;  
                  default:  
                          return   (DefWindowProc(hwnd,   msg,   wParam,   lParam));  
          }  
          return(NULL);  
  }  
   
  //   Main.  
  int   PASCAL   WinMain(   HINSTANCE   hInst,   HINSTANCE   hPrevInst,   LPSTR     lpCmdLine,    
          int   nCmdShow   )  
  {  
          MSG                   msg;  
          WNDCLASS         wc;  
   
          CoInitialize(NULL);  
   
          ZeroMemory(&wc,   sizeof   wc);  
          wc.lpfnWndProc     =   WindowProc;  
          wc.hInstance         =   hInst;  
          wc.hIcon                 =   LoadIcon(   NULL,   IDI_APPLICATION   );  
          wc.hCursor             =   LoadCursor(   NULL,   IDC_ARROW   );  
          wc.hbrBackground   =   (HBRUSH)GetStockObject(   BLACK_BRUSH   );  
          wc.lpszMenuName   =   NULL;  
          wc.lpszClassName   =   CLASSNAME;  
          RegisterClass(   &wc   );  
   
          g_hwnd   =   CreateWindow(  
                  CLASSNAME,  
                  "DirectShow   Sample",  
                  WS_OVERLAPPEDWINDOW,  
                  CW_USEDEFAULT,  
                  CW_USEDEFAULT,  
                  CW_USEDEFAULT,  
                  CW_USEDEFAULT,  
                  NULL,  
                  NULL,  
                  hInst,  
                  NULL);  
   
          ShowWindow(   g_hwnd,   nCmdShow   );  
          UpdateWindow(   g_hwnd   );  
          PlayFile();  
   
          while(   GetMessage(   &msg,   NULL,   0,   0   )   )  
          {  
                  TranslateMessage(   &msg   );  
                  DispatchMessage(   &msg   );  
          }  
   
          CoUninitialize();  
          return   msg.wParam;  
  }  
   
  贴图的例子我是从游戏编程大师中考的。实在郁闷不知道问什么。突然他报的错都是类似  
  Strmiids.lib(strmiids.obj)   :   error   LNK2005:   _IID_IAMStats   already   defined   in   demo7_12.obj  
  这样的东西,郁闷呀。请懂的人指点一下,多谢  
   
   
   
   
  问题点数:0、回复次数:6Top

1 楼rushinger(阮祥哥)回复于 2005-04-28 07:33:20 得分 0

帮顶Top

2 楼zfive5(醉马不肖)回复于 2005-04-28 09:01:01 得分 0

_IID_IAMStats   可以重复定义  
   
  看看_iid_iamstats的.h是否include两遍Top

3 楼vcmute(BCare4 H1Rest Good9!)回复于 2005-04-28 13:20:49 得分 0

和.h无关,link问题  
  试试看重编译baseclasses(samples中有),别包含strmiids.lib  
  或使用dll,别用static   libraryTop

4 楼absolutelyzero()回复于 2005-04-29 00:10:41 得分 0

非常感谢楼上,编译通过啦。但是代码还是没有达到我想要的要求。就是我想通过点ESC来实现先播动画,在帖界面,但不行,还请指点(代码有点长所以只能分开)  
  #define   WIN32_LEAN_AND_MEAN     //   just   say   no   to   MFC  
   
  #define   INITGUID  
   
  #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>   //   include   directdraw  
  #include   <dshow.h>  
   
  #define   CLASSNAME   "VideoWindow"  
   
  IGraphBuilder       *pGraph   =   NULL;  
  IMediaControl       *pMediaControl   =   NULL;  
  IVideoWindow         *pVidWin   =   NULL;  
  //   DEFINES   ////////////////////////////////////////////////  
   
  //   defines   for   windows    
  #define   WINDOW_CLASS_NAME   "WINCLASS1"  
   
  //   default   screen   size  
  #define   SCREEN_WIDTH         800     //   size   of   screen  
  #define   SCREEN_HEIGHT       600  
  #define   SCREEN_BPP             32       //   bits   per   pixel  
   
  #define   BITMAP_ID                         0x4D42   //   universal   id   for   a   bitmap  
  #define   MAX_COLORS_PALETTE       256  
   
  //   TYPES   //////////////////////////////////////////////////////  
   
  //   basic   unsigned   types  
  typedef   unsigned   short   USHORT;  
  typedef   unsigned   short   WORD;  
  typedef   unsigned   char     UCHAR;  
  typedef   unsigned   char     BYTE;  
   
  //   container   structure   for   bitmaps   .BMP   file  
  typedef   struct   BITMAP_FILE_TAG  
                  {  
                  BITMAPFILEHEADER   bitmapfileheader;     //   this   contains   the   bitmapfile   header  
                  BITMAPINFOHEADER   bitmapinfoheader;     //   this   is   all   the   info   including   the   palette  
                  PALETTEENTRY           palette[256];             //   we   will   store   the   palette   here  
                  UCHAR                         *buffer;                       //   this   is   a   pointer   to   the   data  
   
                  }   BITMAP_FILE,   *BITMAP_FILE_PTR;  
   
  //   PROTOTYPES     //////////////////////////////////////////////  
  int   flag=0;  
   
  int   Flip_Bitmap(UCHAR   *image,   int   bytes_per_line,   int   height);  
   
  int   Load_Bitmap_File(BITMAP_FILE_PTR   bitmap,   char   *filename);  
   
  int   Unload_Bitmap_File(BITMAP_FILE_PTR   bitmap);  
   
  //   MACROS   /////////////////////////////////////////////////  
   
  //   tests   if   a   key   is   up   or   down  
  #define   KEYDOWN(vk_code)   ((GetAsyncKeyState(vk_code)   &   0x8000)   ?   1   :   0)  
  #define   KEYUP(vk_code)       ((GetAsyncKeyState(vk_code)   &   0x8000)   ?   0   :   1)  
   
  //   initializes   a   direct   draw   struct  
  #define   DDRAW_INIT_STRUCT(ddstruct)   {   memset(&ddstruct,0,sizeof(ddstruct));   ddstruct.dwSize=sizeof(ddstruct);   }  
   
  //   this   builds   a   16   bit   color   value   in   5.5.5   format   (1-bit   alpha   mode)  
  #define   _RGB16BIT555(r,g,b)   ((b   &   31)   +   ((g   &   31)   <<   5)   +   ((r   &   31)   <<   10))  
   
  //   this   builds   a   16   bit   color   value   in   5.6.5   format   (green   dominate   mode)  
  #define   _RGB16BIT565(r,g,b)   ((b   &   31)   +   ((g   &   63)   <<   5)   +   ((r   &   31)   <<   11))  
   
  //   this   builds   a   32   bit   color   value   in   A.8.8.8   format   (8-bit   alpha   mode)  
  #define   _RGB32BIT(a,r,g,b)   ((b)   +   ((g)   <<   8)   +   ((r)   <<   16)   +   ((a)   <<   24))  
   
  //   GLOBALS   ////////////////////////////////////////////////  
   
  HWND             main_window_handle   =   NULL;   //   globally   track   main   window  
  int               window_closed             =   0;         //   tracks   if   window   is   closed  
  HINSTANCE   hinstance_app             =   NULL;   //   globally   track   hinstance  
   
  //   directdraw   stuff  
   
  LPDIRECTDRAW7                   lpdd                 =   NULL;         //   dd   object  
  LPDIRECTDRAWSURFACE7     lpddsprimary   =   NULL;       //   dd   primary   surface  
  LPDIRECTDRAWSURFACE7     lpddsback         =   NULL;       //   dd   back   surface  
  LPDIRECTDRAWPALETTE       lpddpal             =   NULL;       //   a   pointer   to   the   created   dd   palette  
  LPDIRECTDRAWCLIPPER       lpddclipper     =   NULL;       //   dd   clipper  
  PALETTEENTRY                     palette[256];                     //   color   palette  
  PALETTEENTRY                     save_palette[256];           //   used   to   save   palettes  
  DDSURFACEDESC2                 ddsd;                                     //   a   direct   draw   surface   description   struct  
  DDBLTFX                               ddbltfx;                               //   used   to   fill  
  DDSCAPS2                             ddscaps;                               //   a   direct   draw   surface   capabilities   struct  
  HRESULT                               ddrval;                                 //   result   back   from   dd   calls  
  DWORD                                   start_clock_count   =   0;   //   used   for   timing  
   
  BITMAP_FILE                       bitmap;                                 //   holds   the   bitmap  
   
  char   buffer[80];                                                           //   general   printing   buffer  
   
  //   FUNCTIONS   ////////////////////////////////////////////////  
   
  int   Load_Bitmap_File(BITMAP_FILE_PTR   bitmap,   char   *filename)  
  {  
  //   this   function   opens   a   bitmap   file   and   loads   the   data   into   bitmap  
   
  int   file_handle,     //   the   file   handle  
          index;                 //   looping   index  
   
  UCHAR       *temp_buffer   =   NULL;   //   used   to   convert   24   bit   images   to   16   bit  
  OFSTRUCT   file_data;                     //   the   file   data   information  
   
  //   open   the   file   if   it   exists  
  if   ((file_handle   =   OpenFile(filename,&file_data,OF_READ))==-1)  
        return(0);  
   
  //   now   load   the   bitmap   file   header  
  _lread(file_handle,   &bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER));  
   
  //   test   if   this   is   a   bitmap   file  
  if   (bitmap->bitmapfileheader.bfType!=BITMAP_ID)  
        {  
        //   close   the   file  
        _lclose(file_handle);  
   
        //   return   error  
        return(0);  
        }   //   end   if  
   
  //   now   we   know   this   is   a   bitmap,   so   read   in   all   the   sections  
   
  //   first   the   bitmap   infoheader  
   
  //   now   load   the   bitmap   file   header  
  _lread(file_handle,   &bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER));  
   
  //   now   load   the   color   palette   if   there   is   one  
  if   (bitmap->bitmapinfoheader.biBitCount   ==   8)  
        {  
        _lread(file_handle,   &bitmap->palette,MAX_COLORS_PALETTE*sizeof(PALETTEENTRY));  
   
        //   now   set   all   the   flags   in   the   palette   correctly   and   fix   the   reversed    
        //   BGR   RGBQUAD   data   format  
        for   (index=0;   index   <   MAX_COLORS_PALETTE;   index++)  
                {  
                //   reverse   the   red   and   green   fields  
                int   temp_color                                 =   bitmap->palette[index].peRed;  
                bitmap->palette[index].peRed     =   bitmap->palette[index].peBlue;  
                bitmap->palette[index].peBlue   =   temp_color;  
                 
                //   always   set   the   flags   word   to   this  
                bitmap->palette[index].peFlags   =   PC_NOCOLLAPSE;  
                }   //   end   for   index  
   
          }   //   end   if  
   
  //   finally   the   image   data   itself  
  _lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);  
   
  //   now   read   in   the   image,   if   the   image   is   8   or   16   bit   then   simply   read   it  
  //   but   if   its   24   bit   then   read   it   into   a   temporary   area   and   then   convert  
  //   it   to   a   16   bit   image  
   
  if   (bitmap->bitmapinfoheader.biBitCount==8   ||   bitmap->bitmapinfoheader.biBitCount==16   ||    
          bitmap->bitmapinfoheader.biBitCount==24)  
        {  
        //   delete   the   last   image   if   there   was   one  
        if   (bitmap->buffer)  
                free(bitmap->buffer);  
   
        //   allocate   the   memory   for   the   image  
        if   (!(bitmap->buffer   =   (UCHAR   *)malloc(bitmap->bitmapinfoheader.biSizeImage)))  
              {  
              //   close   the   file  
              _lclose(file_handle);  
   
              //   return   error  
              return(0);  
              }   //   end   if  
   
        //   now   read   it   in  
        _lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage);  
   
        }   //   end   if  
  else  
        {  
        //   serious   problem  
        return(0);  
   
        }   //   end   else  
   
  #if   0  
  //   write   the   file   info   out    
  printf("\nfilename:%s   \nsize=%d   \nwidth=%d   \nheight=%d   \nbitsperpixel=%d   \ncolors=%d   \nimpcolors=%d",  
                  filename,  
                  bitmap->bitmapinfoheader.biSizeImage,  
                  bitmap->bitmapinfoheader.biWidth,  
                  bitmap->bitmapinfoheader.biHeight,  
  bitmap->bitmapinfoheader.biBitCount,  
                  bitmap->bitmapinfoheader.biClrUsed,  
                  bitmap->bitmapinfoheader.biClrImportant);  
  #endif  
   
  //   close   the   file  
  _lclose(file_handle);  
   
  //   flip   the   bitmap  
  Flip_Bitmap(bitmap->buffer,    
                          bitmap->bitmapinfoheader.biWidth*(bitmap->bitmapinfoheader.biBitCount/8),    
                          bitmap->bitmapinfoheader.biHeight);  
   
  //   return   success  
  return(1);  
   
  }   //   end   Load_Bitmap_File  
   
  ///////////////////////////////////////////////////////////  
   
   
   
   
   
  Top

5 楼absolutelyzero()回复于 2005-04-29 00:11:46 得分 0

int   Unload_Bitmap_File(BITMAP_FILE_PTR   bitmap)  
  {  
  //   this   function   releases   all   memory   associated   with   "bitmap"  
  if   (bitmap->buffer)  
        {  
        //   release   memory  
        free(bitmap->buffer);  
   
        //   reset   pointer  
        bitmap->buffer   =   NULL;  
   
        }   //   end   if  
   
  //   return   success  
  return(1);  
   
  }   //   end   Unload_Bitmap_File  
   
  ///////////////////////////////////////////////////////////  
   
  int   Flip_Bitmap(UCHAR   *image,   int   bytes_per_line,   int   height)  
  {  
  //   this   function   is   used   to   flip   bottom-up   .BMP   images  
   
  UCHAR   *buffer;   //   used   to   perform   the   image   processing  
  int   index;           //   looping   index  
   
  //   allocate   the   temporary   buffer  
  if   (!(buffer   =   (UCHAR   *)malloc(bytes_per_line*height)))  
        return(0);  
   
  //   copy   image   to   work   area  
  memcpy(buffer,image,bytes_per_line*height);  
   
  //   flip   vertically  
  for   (index=0;   index   <   height;   index++)  
          memcpy(&image[((height-1)   -   index)*bytes_per_line],  
                        &buffer[index*bytes_per_line],   bytes_per_line);  
   
  //   release   the   memory  
  free(buffer);  
   
  //   return   success  
  return(1);  
   
  }   //   end   Flip_Bitmap  
   
  ///////////////////////////////////////////////////////////////  
   
   
   
   
  void   PlayFile(void)  
  {  
          //   Create   the   filter   graph   manager.  
          CoCreateInstance(CLSID_FilterGraph,   NULL,   CLSCTX_INPROC,    
                  IID_IGraphBuilder,   (void   **)&pGraph);  
          pGraph->QueryInterface(IID_IMediaControl,   (void   **)&pMediaControl);  
          pGraph->QueryInterface(IID_IVideoWindow,   (void   **)&pVidWin);  
   
          //   Build   the   graph.    
          pGraph->RenderFile(L"start.mpg",   NULL);  
   
          //Set   the   video   window.  
          pVidWin->put_Owner((OAHWND)main_window_handle);  
          pVidWin->put_WindowStyle(WS_CHILD   |   WS_CLIPSIBLINGS);  
   
          RECT   grc;  
          GetClientRect(main_window_handle,   &grc);  
          pVidWin->SetWindowPosition(0,   0,   grc.right,   grc.bottom);  
   
          //   Run   the   graph.  
          pMediaControl->Run();  
  flag=2;  
   
  }  
   
  void   CleanUp(void)  
  {  
          pVidWin->put_Visible(OAFALSE);  
          pVidWin->put_Owner(NULL);        
          pMediaControl->Release();  
          pVidWin->Release();  
          pGraph->Release();  
  }  
   
   
   
   
   
   
  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_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;  
  case   WM_KEYDOWN:  
  {  
  if(flag==0)  
  if(wparam   ==   VK_ESCAPE)  
  {  
        pMediaControl->Stop();  
        CleanUp();  
        flag=1;  
  }  
  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  
   
  //   make   sure   this   isn't   executed   again  
  if   (window_closed)  
        return(0);  
   
  //   for   now   test   if   user   is   hitting   ESC   and   send   WM_CLOSE  
  /*if   (KEYDOWN(VK_ESCAPE))  
        {  
        PostMessage(main_window_handle,WM_CLOSE,0,0);  
        window_closed   =   1;  
        }   //   end   if*/  
   
  //   copy   the   bitmap   image   to   the   primary   buffer   line   by   line  
  //   notice   the   24   to   32   bit   conversion   pixel   by   pixel  
   
  //   lock   the   primary   surface  
  lpddsprimary->Lock(NULL,&ddsd,   DDLOCK_SURFACEMEMORYPTR   |   DDLOCK_WAIT,NULL);  
   
  //   get   video   pointer   to   primary   surfce  
  DWORD   *primary_buffer   =   (DWORD   *)ddsd.lpSurface;                
   
  //   process   each   line   and   copy   it   into   the   primary   buffer  
  for   (int   index_y   =   0;   index_y   <   SCREEN_HEIGHT;   index_y++)  
          {  
          for   (int   index_x   =   0;   index_x   <   SCREEN_WIDTH;   index_x++)  
                  {  
                  //   get   BGR   values  
                  UCHAR   blue     =   (bitmap.buffer[index_y*SCREEN_WIDTH*3   +   index_x*3   +   0]),  
                              green   =   (bitmap.buffer[index_y*SCREEN_WIDTH*3   +   index_x*3   +   1]),  
                              red       =   (bitmap.buffer[index_y*SCREEN_WIDTH*3   +   index_x*3   +   2]);  
   
                  //   this   builds   a   32   bit   color   value   in   A.8.8.8   format   (8-bit   alpha   mode)  
                  DWORD   pixel   =   _RGB32BIT(0,red,green,blue);  
   
                  //   write   the   pixel  
                  primary_buffer[index_x   +   (index_y*ddsd.lPitch   >>   2)]   =   pixel;  
   
                  }   //   end   for   index_x  
   
          }   //   end   for   index_y  
   
  //   now   unlock   the   primary   surface  
  if   (FAILED(lpddsprimary->Unlock(NULL)))  
        return(0);  
   
  //   do   nothing   --   look   at   pretty   picture  
   
  //   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  
   
  //   create   IDirectDraw   interface   7.0   object   and   test   for   error  
  if   (FAILED(DirectDrawCreateEx(NULL,   (void   **)&lpdd,   IID_IDirectDraw7,   NULL)))  
        return(0);  
   
  //   set   cooperation   to   full   screen  
  if   (FAILED(lpdd->SetCooperativeLevel(main_window_handle,    
                                                                              DDSCL_FULLSCREEN   |   DDSCL_ALLOWMODEX   |    
                                                                              DDSCL_EXCLUSIVE   |   DDSCL_ALLOWREBOOT)))  
        return(0);  
   
  //   set   display   mode   to   640x480x8  
  if   (FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH,   SCREEN_HEIGHT,   SCREEN_BPP,0,0)))  
        return(0);  
   
  //   clear   ddsd   and   set   size  
  DDRAW_INIT_STRUCT(ddsd);    
   
  //   enable   valid   fields  
  ddsd.dwFlags   =   DDSD_CAPS;  
   
  //   request   primary   surface  
  ddsd.ddsCaps.dwCaps   =   DDSCAPS_PRIMARYSURFACE;  
   
  //   create   the   primary   surface  
  if   (FAILED(lpdd->CreateSurface(&ddsd,   &lpddsprimary,   NULL)))  
        return(0);  
   
  //   load   the   24-bit   image  
  if   (!Load_Bitmap_File(&bitmap,"face.bmp"))  
        return(0);  
  flag=2;  
  //   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  
   
   
  //   first   the   palette  
  if   (lpddpal)  
        {  
        lpddpal->Release();  
        lpddpal   =   NULL;  
        }   //   end   if  
   
  //   now   the   primary   surface  
  if   (lpddsprimary)  
        {  
        lpddsprimary->Release();  
        lpddsprimary   =   NULL;  
        }   //   end   if  
   
  //   now   blow   away   the   IDirectDraw4   interface  
  if   (lpdd)  
        {  
        lpdd->Release();  
        lpdd   =   NULL;  
        }   //   end   if  
   
  //   unload   the   bitmap   file,   we   no   longer   need   it  
  Unload_Bitmap_File(&bitmap);  
   
  //   return   success   or   failure   or   your   own   return   code   here  
  return(1);  
   
  }   //   end   Game_Shutdown  
   
  Top

6 楼absolutelyzero()回复于 2005-04-29 00:12:57 得分 0

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(NULL,   IDI_APPLICATION);  
  winclass.hCursor =   LoadCursor(NULL,   IDC_ARROW);    
  winclass.hbrBackground =   (HBRUSH)GetStockObject(BLACK_BRUSH);  
  winclass.lpszMenuName =   NULL;  
  winclass.lpszClassName =   WINDOW_CLASS_NAME;  
  winclass.hIconSm                 =   LoadIcon(NULL,   IDI_APPLICATION);  
   
   
   
   
  //   save   hinstance   in   global  
  hinstance_app   =   hinstance;  
   
  //   register   the   window   class  
   
  if   (!RegisterClassEx(&winclass))  
  return(0);  
   
  //   create   the   window  
  if   (!(hwnd   =   CreateWindowEx(NULL,                                     //   extended   style  
                                                          WINDOW_CLASS_NAME,           //   class  
          "DirectDraw   24-Bit   Bitmap   Loading",   //   title  
          WS_POPUP   |   WS_VISIBLE,  
            0,0,     //   initial   x,y  
          SCREEN_WIDTH,SCREEN_HEIGHT,     //   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;  
   
   
   
   
          CoInitialize(NULL);  
   
          ZeroMemory(&winclass,   sizeof(winclass));  
   
          ShowWindow(main_window_handle   ,   SW_MAXIMIZE);  
          UpdateWindow(   main_window_handle   );  
          PlayFile();  
  UpdateWindow(   main_window_handle   );  
   
   
   
  //   initialize   game   here  
   
   
  //   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  
                if(flag==1)Game_Init();  
                //   main   game   processing   goes   here  
        if(flag==2)Game_Main();  
                 
  }   //   end   while  
   
  //   closedown   game   here  
    //       CoUninitialize();  
  Game_Shutdown();  
   
  //   return   to   Windows   like   this  
  return(msg.wParam);  
   
  }   //   end   WinMain  
   
  ///////////////////////////////////////////////////////////  
  我现在急需大家的帮助,我一定会另外开贴加分的。多谢大家啦Top

相关问题

  • 痛苦中....
  • 痛苦中……
  • 失恋了,痛苦中。。。
  • swall(壹心)痛苦中。。。。。。。
  • 离婚了,痛苦中
  • 痛苦中。。。。。。放了N分,放完了。
  • 痛苦中:生病,打针,挂水!!!!
  • 又要找工作了,痛苦中
  • 生日出差加班痛苦中………………
  • 系统不稳定,痛苦中!!!!!!

关键词

  • 代码
  • bitmap
  • pvidwin
  • palette
  • pmediacontrol
  • bitmapinfoheader
  • pgraph
  • directdraw
  • iamstats
  • grc

得分解答快速导航

  • 帖主:absolutelyzero

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo