rendered paste body#include <windows.h>
#include <ddraw.h>
// dissect globals
HINSTANCE g_hinstance;
HWND g_hwnd;
bool g_running;
bool g_active;
const char* g_appName = "My DirectDraw Program";
void update() { /* Update game */ }
bool createWindow();
LRESULT CALLBACK wndProc(HWND, UINT, WPARAM, LPARAM);
// dissect WinMain
int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE,
LPSTR cmdLine, int)
{
g_hinstance = hinstance; // Make a copy so we can use it later
if(!createWindow())
return -1; // Failed to create a window
SetFocus(g_hwnd);
ShowWindow(g_hwnd, SW_SHOWNORMAL);
UpdateWindow(g_hwnd);
// Set up DirectDraw (we'll do this later)
g_running = true;
while(true)
{
MSG msg;
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
if(msg.message == WM_QUIT)
return msg.wParam;
// Send messages to WindowProc
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(g_running && g_active)
update();
}
// Prevent compiler warning even though we never get here
return -1;
}
// dissect createWindow
bool createWindow()
{
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(wc));
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hIconSm = LoadIcon(0, IDI_WINLOGO);
wc.hInstance = g_hinstance;
wc.lpfnWndProc = wndProc;
wc.lpszClassName = g_appName;
wc.cbSize = sizeof(wc);
wc.style = CS_VREDRAW | CS_HREDRAW;
if(RegisterClassEx(&wc))
{
g_hwnd = CreateWindowEx(
WS_EX_TOPMOST,
g_appName,
g_appName,
WS_POPUP | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
0, 0, g_hinstance, 0
);
return g_hwnd != 0;
}
return false;
}
// dissect wndProc
LRESULT CALLBACK wndProc(HWND hwnd, UINT msg, WPARAM w, LPARAM l)
{
switch(msg)
{
case WM_DESTROY:
// Clean up (we'll do this later)
PostQuitMessage(0);
return 0;
case WM_ACTIVATE:
g_active = (LOWORD(w) != WA_INACTIVE) && !((BOOL)HIWORD(w));
break;
}
return DefWindowProc(hwnd, msg, w, l);
}