home *** CD-ROM | disk | FTP | other *** search
- //-----------------------------------------------------------------------------
- // File: DDEx2.CPP
- //
- // Desc: Direct Draw example program 2. Adds functionality to
- // example program 1. Changes the video mode to 640x480x8.
- // Reads a bitmap file from disk and copies it into the
- // back buffer and then slowly flips between the primary
- // surface and the back buffer. Press F12 to exit the program.
- //
- // 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 "DDExample2"
- #define TITLE "Direct Draw Example 2"
-
- //-----------------------------------------------------------------------------
- // 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
- LPDIRECTDRAWPALETTE g_pDDPal = NULL; // The primary surface palette
- BOOL g_bActive = FALSE; // Is application active?
-
- //-----------------------------------------------------------------------------
- // Local data
- //-----------------------------------------------------------------------------
- static char szBackground[] = "BACK";
- static char szMsg[] = "Page Flipping Test: Press F12 to exit";
- static char szFrontMsg[] = "Front buffer (F12 to quit)";
- static char szBackMsg[] = "Back buffer (F12 to quit)";
-
-
-
-
- //-----------------------------------------------------------------------------
- // 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_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: UpdateFrame()
- // Desc: Displays the proper text for the page
- //-----------------------------------------------------------------------------
- static void
- UpdateFrame(HWND hWnd)
- {
- static BYTE phase = 0;
- HDC hdc;
- RECT rc;
- SIZE size;
-
- // The back buffer already has a loaded bitmap, so don't clear it
- if (g_pDDSBack->GetDC(&hdc) == DD_OK)
- {
- SetBkColor(hdc, RGB(0, 0, 255));
- SetTextColor(hdc, RGB(255, 255, 0));
- if (phase)
- {
- GetClientRect(hWnd, &rc);
- GetTextExtentPoint(hdc, szMsg, lstrlen(szMsg), &size);
- TextOut(hdc, (rc.right - size.cx) / 2, (rc.bottom - size.cy) / 2,
- szMsg, sizeof(szMsg) - 1);
- TextOut(hdc, 0, 0, szFrontMsg, lstrlen(szFrontMsg));
- phase = 0;
- }
- else
- {
- TextOut(hdc, 0, 0, szBackMsg, lstrlen(szBackMsg));
- phase = 1;
- }
- g_pDDSBack->ReleaseDC(hdc);
- }
- }
-
-
-
-
- //-----------------------------------------------------------------------------
- // 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 = g_pDDSPrimary->Restore();
- if (hRet != DD_OK)
- break;
- hRet = DDReLoadBitmap(g_pDDSBack, szBackground);
- 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 and set the palette
- g_pDDPal = DDLoadPalette(g_pDD, szBackground);
- if (g_pDDPal == NULL)
- return InitFail(hWnd, hRet, "DDLoadPalette FAILED");
- hRet = g_pDDSPrimary->SetPalette(g_pDDPal);
- if (hRet != DD_OK)
- return InitFail(hWnd, hRet, "SetPalette FAILED");
-
- // Load a bitmap into the back buffer.
- hRet = DDReLoadBitmap(g_pDDSBack, szBackground);
- if (hRet != DD_OK)
- return InitFail(hWnd, hRet, "DDReLoadBitmap 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;
- }
-