Code:
Application.cpp
#define INITGUID
#include <windows.h>
#include <windowsx.h>
#include <string>
#include <ddraw.h>
#include "application.h"
LRESULT _stdcall WindowProc(HWND window, unsigned int message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
default:break;
}
return DefWindowProc(window, message, wParam, lParam);
}
bool CApplication::Initialize()
{
WNDCLASSEX windowClass;
RECT sizeInfo;
DDSURFACEDESC2 surfaceDesc;
if (!mainInstance)
{
MessageBox(0, "The main instance was never set", "Fatal Error", MB_OK);
return false;
}
className = "Ants Version I";
windowClass.cbSize = sizeof(windowClass);
windowClass.style = CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = WindowProc;
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = mainInstance;
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowClass.hbrBackground = GetStockBrush(WHITE_BRUSH);
windowClass.lpszMenuName = NULL;
windowClass.lpszClassName = className.data();
if (!RegisterClassEx(&windowClass))
{
MessageBox(0, "Failed to register the class", "Fatal Error", MB_OK);
return false;
}
windowX = 30;
windowY = 30;
displayWidth = 800;
displayHeight = 600;
sizeInfo.top = windowY;
sizeInfo.left = windowX;
sizeInfo.right = displayWidth + windowX;
sizeInfo.bottom = displayHeight + windowY;
if (!AdjustWindowRect(&sizeInfo, WS_OVERLAPPEDWINDOW, false))
{
MessageBox(0, "Could not get window dimensions", "Fatal Error", MB_OK);
return false;
}
windowWidth = sizeInfo.right - sizeInfo.left;
windowHeight = sizeInfo.bottom - sizeInfo.top;
mainWindow = CreateWindowEx(NULL, className.data(), className.data(),
WS_OVERLAPPEDWINDOW, sizeInfo.left, sizeInfo.top,
windowWidth, windowHeight,
NULL, NULL, mainInstance, NULL);
if (!mainWindow)
{
MessageBox(0, "Could not create the window", "Fatal Error", MB_OK);
return false;
}
ShowWindow(mainWindow, SW_SHOWNORMAL);
UpdateWindow(mainWindow);
if (FAILED(DirectDrawCreateEx(NULL, (void **)&ddrawObject, IID_IDirectDraw7, NULL)))
{
MessageBox(0, "Could not create the ddraw interface", "Fatal Error", MB_OK);
return false;
}
if (FAILED(ddrawObject->SetCooperativeLevel(mainWindow, DDSCL_NORMAL)))
{
MessageBox(0, "Could not set the cooperative level", "Fatal Error", MB_OK);
return false;
}
memset(&surfaceDesc, 0, sizeof(surfaceDesc));
surfaceDesc.dwSize = sizeof(surfaceDesc);
surfaceDesc.dwFlags = DDSD_CAPS;
surfaceDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if (FAILED(ddrawObject->CreateSurface(&surfaceDesc, &primarySurface, NULL)))
{
MessageBox(0, "Failed to create the primary surface", "Fatal Error", MB_OK);
return false;
}
if (FAILED(primarySurface->GetSurfaceDesc(&surfaceDesc)))
{
MessageBox(0, "Could not get the pixel format", "Fatal Error", MB_OK);
return false;
}
if (surfaceDesc.ddpfPixelFormat.dwRGBBitCount != 32)
{
MessageBox(0, "This application runs only in 32 bit mode", "Fatal Error", MB_OK);
return false;
}
memset(&surfaceDesc, 0, sizeof(surfaceDesc));
surfaceDesc.dwSize = sizeof(surfaceDesc);
surfaceDesc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
surfaceDesc.dwWidth = displayWidth;
surfaceDesc.dwHeight = displayHeight;
surfaceDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
if (FAILED(ddrawObject->CreateSurface(&surfaceDesc, &backSurface, NULL)))
{
MessageBox(0, "Failed to create the back surface", "Fatal Error", MB_OK);
return false;
}
state = APPSTATE_INITIALIZED;
return true;
}
int CApplication::Run()
{
state = APPSTATE_RUNNING;
MSG msg;
DDBLTFX bltEffects;
RECT destRect;
memset(&bltEffects, 0, sizeof(bltEffects));
bltEffects.dwSize = sizeof(bltEffects);
bltEffects.dwFillColor = 0;
while (state == APPSTATE_RUNNING)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
state = APPSTATE_DESTROYED;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
destRect.left = 0;
destRect.top = 0;
destRect.right = displayWidth;
destRect.bottom = displayHeight;
if (FAILED(backSurface->Blt(&destRect, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &bltEffects)))
{
MessageBox(0, "Failed to blit", "Fatal Error", MB_OK);
PostQuitMessage(0);
state = APPSTATE_DESTROYING;
}
destRect.left = windowX;
destRect.top = windowY;
destRect.right = displayWidth + windowX;
destRect.bottom = displayHeight + windowY;
if (FAILED(primarySurface->Blt(&destRect, backSurface, NULL, DDBLT_WAIT, NULL)))
{
MessageBox(0, "Failed to blit", "Fatal Error", MB_OK);
PostQuitMessage(0);
state = APPSTATE_DESTROYING;
}
}
state = APPSTATE_DESTROYING;
if (backSurface)
{
backSurface->Release();
backSurface = NULL;
}
if (primarySurface)
{
primarySurface->Release();
primarySurface = NULL;
}
if (ddrawObject)
{
ddrawObject->Release();
ddrawObject = NULL;
}
state = APPSTATE_DESTROYED;
return msg.wParam;
}
I apoligize to anyone who wanted to see DirectX 10 but I think DirectX 7 was the last version to truely support 2D graphics. I have 2 questions neither of which concern windows or directx, so don't boot me to the windows or game forum.