home *** CD-ROM | disk | FTP | other *** search
- //-----------------------------------------------------------------------------
- // File: DDEx3.CPP
- //
- // Desc: Direct Draw example program 3. Adds functionality to
- // example program 2. Creates two offscreen surfaces in
- // addition to the primary surface and back buffer. Loads
- // a bitmap file into each offscreen surface. Uses BltFast
- // to copy the contents of an offscreen surface to the back
- // buffer and then flips the buffers and copies the next
- // offscreen surface to the back buffer. Press F12 to exit
- // the program. This program requires at least 1.2 Megs of
- // video ram.
- //
- // Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved.
- //-----------------------------------------------------------------------------
-
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #endif
- //-----------------------------------------------------------------------------
- // Include files
- //-----------------------------------------------------------------------------
- #include <windows.h>
- #include <ddraw.h>
- #include <stdio.h>
- #include <stdarg.h>
- #include "resource.h"
- #include "ddutil.h"
-
- //-----------------------------------------------------------------------------
- // Local definitions
- //-----------------------------------------------------------------------------
- #define NAME "DDExample3"
- #define TITLE "Direct Draw Example 3"
-
- //-----------------------------------------------------------------------------
- // Default settings
- //-----------------------------------------------------------------------------
- #define TIMER_ID 1
- #define TIMER_RATE 500
-
- //-----------------------------------------------------------------------------
- // Global data
- //-----------------------------------------------------------------------------
- LPDIRECTDRAW7 g_pDD = NULL; // DirectDraw object
- LPDIRECTDRAWSURFACE7 g_pDDSPrimary = NULL;// DirectDraw primary surface
- LPDIRECTDRAWSURFACE7 g_pDDSBack = NULL; // DirectDraw back surface
- LPDIRECTDRAWSURFACE7 g_pDDSOne = NULL; // Offscreen surface 1
- LPDIRECTDRAWSURFACE7 g_pDDSTwo = NULL; // Offscreen surface 2
- LPDIRECTDRAWPALETTE g_pDDPal = NULL; // The primary surface palette
- BOOL g_bActive = FALSE; // Is application active?
-
- //-----------------------------------------------------------------------------
- // Local data
- //-----------------------------------------------------------------------------
- // Name of our bitmap resource.
- static char szBitmap[] = "DDEX3";
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: ReleaseAllObjects()
- // Desc: Finished with all objects we use; release them
- //-----------------------------------------------------------------------------
- static void
- ReleaseAllObjects(void)
- {
- if (g_pDD != NULL)
- {
- if (g_pDDSPrimary != NULL)
- {
- g_pDDSPrimary->Release();
- g_pDDSPrimary = NULL;
- }
- if (g_pDDSOne != NULL)
- {
- g_pDDSOne->Release();
- g_pDDSOne = NULL;
- }
- if (g_pDDSTwo != NULL)
- {
- g_pDDSTwo->Release();
- g_pDDSTwo = NULL;
- }
- if (g_pDDPal != NULL)
- {
- g_pDDPal->Release();
- g_pDDPal = NULL;
- }
- g_pDD->Release();
- g_pDD = NULL;
- }
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: InitFail()
- // Desc: This function is called if an initialization function fails
- //-----------------------------------------------------------------------------
- HRESULT
- InitFail(HWND hWnd, HRESULT hRet, LPCTSTR szError,...)
- {
- char szBuff[128];
- va_list vl;
-
- va_start(vl, szError);
- vsprintf(szBuff, szError, vl);
- ReleaseAllObjects();
- MessageBox(hWnd, szBuff, TITLE, MB_OK);
- DestroyWindow(hWnd);
- va_end(vl);
- return hRet;
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: InitSurfaces()
- // Desc: This function reads the bitmap file FRNTBACK.BMP and stores half of it
- // in offscreen surface 1 and the other half in offscreen surface 2.
- //-----------------------------------------------------------------------------
- BOOL
- InitSurfaces(void)
- {
- HBITMAP hbm;
-
- // Load our bitmap resource.
- hbm = (HBITMAP) LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, 0,
- 0, LR_CREATEDIBSECTION);
- if (hbm == NULL)
- return FALSE;
-
- DDCopyBitmap(g_pDDSOne, hbm, 0, 0, 640, 480);
- DDCopyBitmap(g_pDDSTwo, hbm, 0, 480, 640, 480);
- DeleteObject(hbm);
- return TRUE;
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: RestoreAll()
- // Desc: Restore all lost objects
- //-----------------------------------------------------------------------------
- HRESULT
- RestoreAll(void)
- {
- HRESULT hRet;
-
- hRet = g_pDDSPrimary->Restore();
- if (hRet == DD_OK)
- {
- hRet = g_pDDSOne->Restore();
- if (hRet == DD_OK)
- {
- hRet = g_pDDSTwo->Restore();
- if (hRet == DD_OK)
- {
- InitSurfaces();
- }
- }
- }
- return hRet;
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: UpdateFrame()
- // Desc: Displays the proper image for the page
- //-----------------------------------------------------------------------------
- static void
- UpdateFrame(HWND hWnd)
- {
- static BYTE phase = 0;
- HRESULT hRet;
- LPDIRECTDRAWSURFACE7 pdds;
- RECT rcRect;
-
- rcRect.left = 0;
- rcRect.top = 0;
- rcRect.right = 640;
- rcRect.bottom = 480;
- if (phase)
- {
- pdds = g_pDDSTwo;
- phase = 0;
- }
- else
- {
- pdds = g_pDDSOne;
- phase = 1;
- }
- while (TRUE)
- {
- hRet = g_pDDSBack->BltFast(0, 0, pdds, &rcRect, FALSE);
- if (hRet == DD_OK)
- break;
- if (hRet == DDERR_SURFACELOST)
- {
- hRet = RestoreAll();
- if (hRet != DD_OK)
- break;
- }
- if (hRet != DDERR_WASSTILLDRAWING)
- break;
- }
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: WindowProc()
- // Desc: The Main Window Procedure
- //-----------------------------------------------------------------------------
- long FAR PASCAL
- WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- HRESULT hRet;
-
- switch (message)
- {
- case WM_ACTIVATE:
- // Pause if minimized
- g_bActive = !((BOOL)HIWORD(wParam));
- return 0L;
-
- case WM_DESTROY:
- // Clean up and close the app
- ReleaseAllObjects();
- PostQuitMessage(0);
- return 0L;
-
- case WM_KEYDOWN:
- // Handle any non-accelerated key commands
- switch (wParam)
- {
- case VK_ESCAPE:
- case VK_F12:
- PostMessage(hWnd, WM_CLOSE, 0, 0);
- return 0L;
- }
- break;
-
- case WM_SETCURSOR:
- // Turn off the cursor since this is a full-screen app
- SetCursor(NULL);
- return TRUE;
-
- case WM_TIMER:
- // Update and flip surfaces
- if (g_bActive && TIMER_ID == wParam)
- {
- UpdateFrame(hWnd);
- while (TRUE)
- {
- hRet = g_pDDSPrimary->Flip(NULL, 0);
- if (hRet == DD_OK)
- break;
- if (hRet == DDERR_SURFACELOST)
- {
- hRet = RestoreAll();
- if (hRet != DD_OK)
- break;
- }
- if (hRet != DDERR_WASSTILLDRAWING)
- break;
- }
- }
- break;
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: InitApp()
- // Desc: Do work required for every instance of the application:
- // Create the window, initialize data
- //-----------------------------------------------------------------------------
- static HRESULT
- InitApp(HINSTANCE hInstance, int nCmdShow)
- {
- HWND hWnd;
- WNDCLASS wc;
- DDSURFACEDESC2 ddsd;
- DDSCAPS2 ddscaps;
- HRESULT hRet;
-
- // Set up and register window class
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.lpfnWndProc = WindowProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON));
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH);
- wc.lpszMenuName = NAME;
- wc.lpszClassName = NAME;
- RegisterClass(&wc);
-
- // Create a window
- hWnd = CreateWindowEx(WS_EX_TOPMOST,
- NAME,
- TITLE,
- WS_POPUP,
- 0,
- 0,
- GetSystemMetrics(SM_CXSCREEN),
- GetSystemMetrics(SM_CYSCREEN),
- NULL,
- NULL,
- hInstance,
- NULL);
- if (!hWnd)
- return FALSE;
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- SetFocus(hWnd);
-
- ///////////////////////////////////////////////////////////////////////////
- // Create the main DirectDraw object
- ///////////////////////////////////////////////////////////////////////////
- hRet = DirectDrawCreateEx(NULL, (VOID**)&g_pDD, IID_IDirectDraw7, NULL);
- if (hRet != DD_OK)
- return InitFail(hWnd, hRet, "DirectDrawCreateEx FAILED");
-
- // Get exclusive mode
- hRet = g_pDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
- if (hRet != DD_OK)
- return InitFail(hWnd, hRet, "SetCooperativeLevel FAILED");
-
- // Set the video mode to 640x480x8
- hRet = g_pDD->SetDisplayMode(640, 480, 8, 0, 0);
- if (hRet != DD_OK)
- return InitFail(hWnd, hRet, "SetDisplayMode FAILED");
-
- // Create the primary surface with 1 back buffer
- ZeroMemory(&ddsd, sizeof(ddsd));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
- DDSCAPS_FLIP |
- DDSCAPS_COMPLEX;
- ddsd.dwBackBufferCount = 1;
- hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSPrimary, NULL);
- if (hRet != DD_OK)
- return InitFail(hWnd, hRet, "CreateSurface FAILED");
-
- // Get a pointer to the back buffer
- ZeroMemory(&ddscaps, sizeof(ddscaps));
- ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
- hRet = g_pDDSPrimary->GetAttachedSurface(&ddscaps, &g_pDDSBack);
- if (hRet != DD_OK)
- return InitFail(hWnd, hRet, "GetAttachedSurface FAILED");
-
- // Create a offscreen bitmap.
- ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
- ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
- ddsd.dwHeight = 480;
- ddsd.dwWidth = 640;
- hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSOne, NULL);
- if (hRet != DD_OK)
- return InitFail(hWnd, hRet, "CreateSurface FAILED");
-
- // Create another offscreen bitmap.
- hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSTwo, NULL);
- if (hRet != DD_OK)
- return InitFail(hWnd, hRet, "CreateSurface FAILED");
-
- // Create a Direct Draw Palette and associate it with the front buffer
- g_pDDPal = DDLoadPalette(g_pDD, szBitmap);
- if (g_pDDPal)
- g_pDDSPrimary->SetPalette(g_pDDPal);
- if (!InitSurfaces())
- return InitFail(hWnd, hRet, "InitSurfaces FAILED");
-
- // Create a timer to flip the pages
- if (TIMER_ID != SetTimer(hWnd, TIMER_ID, TIMER_RATE, NULL))
- return InitFail(hWnd, hRet, "SetTimer FAILED");
-
- return DD_OK;
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // Name: WinMain()
- // Desc: Initialization, message loop
- //-----------------------------------------------------------------------------
- int PASCAL
- WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow)
- {
- MSG msg;
-
- if (InitApp(hInstance, nCmdShow) != DD_OK)
- return FALSE;
-
- while (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return msg.wParam;
- }
-
-
-