DDEX1.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File:       ddex1.cpp
  6.  *  Content:    Direct Draw example program 1.  Creates a Direct Draw 
  7.  *              object and then a primary surface with a back buffer.
  8.  *              Slowly flips between the primary surface and the back
  9.  *              buffer.  Press F12 to terminate the program.
  10.  *
  11.  ***************************************************************************/
  12. #define NAME "DDExample1"
  13. #define TITLE "Direct Draw Example 1"
  14. #define WIN32_LEAN_AND_MEAN
  15. #include <windows.h>
  16. #include <windowsx.h>
  17. #include <ddraw.h>
  18. #include <stdlib.h>
  19. #include <stdarg.h>
  20. #include "resource.h"
  21. #define TIMER_ID        1
  22. #define TIMER_RATE      500
  23. LPDIRECTDRAW            lpDD;           // DirectDraw object
  24. LPDIRECTDRAWSURFACE     lpDDSPrimary;   // DirectDraw primary surface
  25. LPDIRECTDRAWSURFACE     lpDDSBack;      // DirectDraw back surface
  26. BOOL                    bActive;        // is application active?
  27. /*
  28.  * finiObjects
  29.  *
  30.  * finished with all objects we use; release them
  31.  */
  32. static void finiObjects( void )
  33. {
  34.     if( lpDD != NULL )
  35.     {
  36. if( lpDDSPrimary != NULL )
  37. {
  38.     lpDDSPrimary->Release();
  39.     lpDDSPrimary = NULL;
  40. }
  41. lpDD->Release();
  42. lpDD = NULL;
  43.     }
  44. } /* finiObjects */
  45. char szMsg[] = "Page Flipping Test: Press F12 to exit";
  46. char szFrontMsg[] = "Front buffer (F12 to quit)";
  47. char szBackMsg[] = "Back buffer (F12 to quit)";
  48. long FAR PASCAL WindowProc( HWND hWnd, UINT message, 
  49.     WPARAM wParam, LPARAM lParam )
  50. {
  51.     PAINTSTRUCT ps;
  52.     RECT        rc;
  53.     SIZE        size;
  54.     static BYTE phase = 0;
  55.     HDC         hdc;
  56.     switch( message )
  57.     {
  58.     case WM_ACTIVATEAPP:
  59. bActive = wParam;
  60. break;
  61.     case WM_CREATE:
  62. break;
  63.     case WM_SETCURSOR:
  64. SetCursor(NULL);
  65. return TRUE;
  66.     case WM_TIMER:
  67. // Flip surfaces
  68. if( bActive )
  69. {
  70.     if (lpDDSBack->GetDC(&hdc) == DD_OK)
  71.     {
  72. SetBkColor( hdc, RGB( 0, 0, 255 ) );
  73. SetTextColor( hdc, RGB( 255, 255, 0 ) );
  74. if( phase )
  75. {
  76.     TextOut( hdc, 0, 0, szFrontMsg, lstrlen(szFrontMsg) );
  77.     phase = 0;
  78. }
  79. else
  80. {
  81.     TextOut( hdc, 0, 0, szBackMsg, lstrlen(szBackMsg) );
  82.     phase = 1;
  83. }
  84. lpDDSBack->ReleaseDC(hdc);
  85.     }
  86.     while( 1 )
  87.     {
  88. HRESULT ddrval;
  89. ddrval = lpDDSPrimary->Flip( NULL, 0 );
  90. if( ddrval == DD_OK )
  91. {
  92.     break;
  93. }
  94. if( ddrval == DDERR_SURFACELOST )
  95. {
  96.     ddrval = lpDDSPrimary->Restore();
  97.     if( ddrval != DD_OK )
  98.     {
  99. break;
  100.     }
  101. }
  102. if( ddrval != DDERR_WASSTILLDRAWING )
  103. {
  104.     break;
  105. }
  106.     }
  107. }
  108. break;
  109.  
  110.     case WM_KEYDOWN:
  111. switch( wParam )
  112. {
  113. case VK_ESCAPE:
  114. case VK_F12:
  115.     PostMessage(hWnd, WM_CLOSE, 0, 0);
  116.     break;
  117. }
  118. break;
  119.     case WM_PAINT:
  120. BeginPaint( hWnd, &ps );
  121. GetClientRect(hWnd, &rc);
  122. GetTextExtentPoint( ps.hdc, szMsg, lstrlen(szMsg), &size );
  123. SetBkColor( ps.hdc, RGB( 0, 0, 255 ) );
  124. SetTextColor( ps.hdc, RGB( 255, 255, 0 ) );
  125. TextOut( ps.hdc, (rc.right - size.cx)/2, (rc.bottom - size.cy)/2,
  126.     szMsg, sizeof( szMsg )-1 );
  127. EndPaint( hWnd, &ps );
  128. break;
  129.     case WM_DESTROY:
  130. finiObjects();
  131. PostQuitMessage( 0 );
  132. break;
  133.     }
  134.     return DefWindowProc(hWnd, message, wParam, lParam);
  135. } /* WindowProc */
  136. /*
  137.  * doInit - do work required for every instance of the application:
  138.  *                create the window, initialize data
  139.  */
  140. static BOOL doInit( HINSTANCE hInstance, int nCmdShow )
  141. {
  142.     HWND                hwnd;
  143.     WNDCLASS            wc;
  144.     DDSURFACEDESC       ddsd;
  145.     DDSCAPS             ddscaps;
  146.     HRESULT             ddrval;
  147.     HDC                 hdc;
  148.     char                buf[256];
  149.     /*
  150.      * set up and register window class
  151.      */
  152.     wc.style = CS_HREDRAW | CS_VREDRAW;
  153.     wc.lpfnWndProc = WindowProc;
  154.     wc.cbClsExtra = 0;
  155.     wc.cbWndExtra = 0;
  156.     wc.hInstance = hInstance;
  157.     wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
  158.     wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  159.     wc.hbrBackground = NULL;
  160.     wc.lpszMenuName = NAME;
  161.     wc.lpszClassName = NAME;
  162.     RegisterClass( &wc );
  163.     
  164.     /*
  165.      * create a window
  166.      */
  167.     hwnd = CreateWindowEx(
  168. WS_EX_TOPMOST,
  169. NAME,
  170. TITLE,
  171. WS_POPUP,
  172. 0, 0,
  173. GetSystemMetrics( SM_CXSCREEN ),
  174. GetSystemMetrics( SM_CYSCREEN ),
  175. NULL,
  176. NULL,
  177. hInstance,
  178. NULL );
  179.     if( !hwnd )
  180.     {
  181. return FALSE;
  182.     }
  183.     ShowWindow( hwnd, nCmdShow );
  184.     UpdateWindow( hwnd );
  185.     /*
  186.      * create the main DirectDraw object
  187.      */
  188.     ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
  189.     if( ddrval == DD_OK )
  190.     {
  191. // Get exclusive mode
  192. ddrval = lpDD->SetCooperativeLevel( hwnd,
  193. DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
  194. if(ddrval == DD_OK )
  195. {
  196.     ddrval = lpDD->SetDisplayMode( 640, 480, 8 );
  197.     if( ddrval == DD_OK )
  198.     {
  199. // Create the primary surface with 1 back buffer
  200. ddsd.dwSize = sizeof( ddsd );
  201. ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  202. ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
  203.       DDSCAPS_FLIP | 
  204.       DDSCAPS_COMPLEX;
  205. ddsd.dwBackBufferCount = 1;
  206. ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
  207. if( ddrval == DD_OK )
  208. {
  209.     // Get a pointer to the back buffer
  210.     ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
  211.     ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, 
  212.   &lpDDSBack);
  213.     if( ddrval == DD_OK )
  214.     {
  215. // draw some text.
  216. if (lpDDSPrimary->GetDC(&hdc) == DD_OK)
  217. {
  218.     SetBkColor( hdc, RGB( 0, 0, 255 ) );
  219.     SetTextColor( hdc, RGB( 255, 255, 0 ) );
  220.     TextOut( hdc, 0, 0, szFrontMsg, lstrlen(szFrontMsg) );
  221.     lpDDSPrimary->ReleaseDC(hdc);
  222. }
  223. if (lpDDSBack->GetDC(&hdc) == DD_OK)
  224. {
  225.     SetBkColor( hdc, RGB( 0, 0, 255 ) );
  226.     SetTextColor( hdc, RGB( 255, 255, 0 ) );
  227.     TextOut( hdc, 0, 0, szBackMsg, lstrlen(szBackMsg) );
  228.     lpDDSBack->ReleaseDC(hdc);
  229. }
  230. // Create a timer to flip the pages
  231. if( SetTimer( hwnd, TIMER_ID, TIMER_RATE, NULL ) )
  232. {
  233.      return TRUE;
  234. }
  235.     }
  236. }
  237.     }
  238. }
  239.     }
  240.     wsprintf(buf, "Direct Draw Init Failed (%08lx)n", ddrval );
  241.     MessageBox( hwnd, buf, "ERROR", MB_OK );
  242.     finiObjects();
  243.     DestroyWindow( hwnd );
  244.     return FALSE;
  245. } /* doInit */
  246. /*
  247.  * WinMain - initialization, message loop
  248.  */
  249. int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
  250. LPSTR lpCmdLine, int nCmdShow)
  251. {
  252.     MSG         msg;
  253.     lpCmdLine = lpCmdLine;
  254.     hPrevInstance = hPrevInstance;
  255.     if( !doInit( hInstance, nCmdShow ) )
  256.     {
  257. return FALSE;
  258.     }
  259.     while (GetMessage(&msg, NULL, 0, 0))
  260.     {
  261. TranslateMessage(&msg);
  262. DispatchMessage(&msg);
  263.     }
  264.     return msg.wParam;
  265. } /* WinMain */