#include <windows.h>
#include <iostream>
#define WINDOW_NAME "sidescroll"
#define WINDOW_TITLE "Sidescroll Game"
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
struct DBUFFER{
HWND windowHwnd;
HDC windowDc;
HDC bufferDc;
HBITMAP bufferBitmap;
HBITMAP unloadBufferBitmap;
RECT rect;
};
bool initDoubleBuffer(DBUFFER &doubleBuffer);
void freeDoubleBuffer(DBUFFER &doubleBuffer);
LRESULT CALLBACK WinProc(
HWND hwnd,
UINT message,
WPARAM wparam,
LPARAM lparam);
int WINAPI WinMain(
HINSTANCE hinstance,
HINSTANCE hprev,
PSTR cmdline,
int ishow){
HWND hwnd;
MSG msg;
WNDCLASSEX wndclassex = {0};
wndclassex.cbSize = sizeof(WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WinProc;
wndclassex.hInstance = hinstance;
wndclassex.lpszClassName = WINDOW_NAME;
wndclassex.hCursor = (HCURSOR)LoadImage(
NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0, 0, LR_SHARED);
RegisterClassEx(&wndclassex);
hwnd = CreateWindowEx(
NULL,
WINDOW_NAME,
WINDOW_TITLE,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL,
NULL,
hinstance,
NULL);
if(!hwnd){
return EXIT_FAILURE;
}
DBUFFER doubleBuffer;
doubleBuffer.windowHwnd = hwnd;
if(!initDoubleBuffer(doubleBuffer)){
return EXIT_FAILURE;
}
HDC tempDc = CreateCompatibleDC(doubleBuffer.windowDc);
if(!tempDc){
return EXIT_FAILURE;
}
ShowWindow(hwnd, ishow);
UpdateWindow(hwnd);
while(1){
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message == WM_QUIT){
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
freeDoubleBuffer(doubleBuffer);
return 0;
}
LRESULT CALLBACK WinProc(
HWND hwnd,
UINT message,
WPARAM wparam,
LPARAM lparam){
PAINTSTRUCT ps;
switch(message){
case WM_PAINT:
BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wparam, lparam);
}
bool initDoubleBuffer(DBUFFER &doubleBuffer){
if(!doubleBuffer.windowHwnd){
return false;
}
GetClientRect(doubleBuffer.windowHwnd,&doubleBuffer.rect);
doubleBuffer.windowDc = GetDC(doubleBuffer.windowHwnd);
if(doubleBuffer.windowDc == NULL){
return false;
}
doubleBuffer.bufferDc = CreateCompatibleDC(doubleBuffer.windowDc);
if(doubleBuffer.bufferDc == NULL){
return false;
}
doubleBuffer.bufferBitmap = CreateCompatibleBitmap(
doubleBuffer.windowDc,
doubleBuffer.rect.right,
doubleBuffer.rect.bottom);
if(doubleBuffer.bufferBitmap == NULL){
return false;
}
doubleBuffer.unloadBufferBitmap = (HBITMAP)SelectObject(
doubleBuffer.bufferDc,
doubleBuffer.bufferBitmap);
return true;
}
void freeDoubleBuffer(DBUFFER &doubleBuffer){
if(!doubleBuffer.windowHwnd){
return;
}
if(doubleBuffer.unloadBufferBitmap){
SelectObject(doubleBuffer.bufferDc,
doubleBuffer.unloadBufferBitmap);
DeleteObject(doubleBuffer.bufferBitmap);
DeleteDC(doubleBuffer.bufferDc);
}
if(doubleBuffer.windowDc){
ReleaseDC(doubleBuffer.windowHwnd,
doubleBuffer.windowDc);
}
memset(&doubleBuffer,0,sizeof(DBUFFER));
}