Here's a standalone piece of code that shows it in action (you were soooo close).
#include <windows.h>
#include <math.h>
#include <string.h>
#define SCREEN_X 640
#define SCREEN_Y 480
#define SCREEN_BPP 32
void renderworld(HDC);
HDC OffScreenDC;
HBITMAP BufferStorage;
char scene_class[]="ninotest";
int quit = 0;
HWND scene_window;
LRESULT CALLBACK WindowProc( HWND hwnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
switch (uMsg)
{
case WM_CREATE:
break;
case WM_DESTROY:
// ChangeDisplaySettings( NULL , 0 );
ShowCursor(1);
PostQuitMessage(0);
quit = 1;
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
quit = 1;
break;
}
break;
case WM_PAINT:
{
PAINTSTRUCT paint;
memset(&paint, 0, sizeof paint);
GetUpdateRect(hwnd, &paint.rcPaint,TRUE);
BeginPaint(hwnd, &paint);
renderworld(OffScreenDC);
BitBlt(paint.hdc, 0, 0, SCREEN_X, SCREEN_Y, OffScreenDC, 0, 0, SRCCOPY);
EndPaint(hwnd, &paint);
}
break;
case WM_ERASEBKGND:
return 1;
break;
case WM_TIMER:
InvalidateRect(hwnd, NULL, 0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
int APIENTRY WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
WNDCLASSEX clas;
MSG msg;
HDC hdc;
clas.cbSize = sizeof(WNDCLASSEX);
clas.style = CS_HREDRAW | CS_VREDRAW;
clas.lpfnWndProc = WindowProc;
clas.cbClsExtra = 0;
clas.cbWndExtra = 0;
clas.hInstance = hInstance;
clas.hIcon = NULL;
clas.hCursor = NULL;
clas.hbrBackground = 0;
clas.lpszMenuName = NULL;
clas.lpszClassName = scene_class;
clas.hIconSm = 0;
RegisterClassEx(&clas);
/*
DEVMODE dmScreenSettings;
memset(&dmScreenSettings, 0, sizeof dmScreenSettings);
dmScreenSettings.dmSize = sizeof dmScreenSettings;
dmScreenSettings.dmPelsWidth = SCREEN_X;
dmScreenSettings.dmPelsHeight = SCREEN_Y;
dmScreenSettings.dmBitsPerPel = SCREEN_BPP;
dmScreenSettings.dmDisplayFrequency = 60;
dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
if (ChangeDisplaySettings (&dmScreenSettings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL)
*/
scene_window = CreateWindowEx(0, scene_class, "scene!", WS_POPUP, 0,0,SCREEN_X,SCREEN_Y, NULL, NULL, hInstance, 0);
hdc = GetDC(scene_window);
OffScreenDC = CreateCompatibleDC( hdc );
BufferStorage = CreateCompatibleBitmap( hdc, SCREEN_X, SCREEN_Y );
SelectObject( OffScreenDC, BufferStorage );
ReleaseDC(scene_window, hdc);
Sleep(1000);
ShowWindow(scene_window, nCmdShow);
UpdateWindow(scene_window);
ShowCursor(0);
//timeBeginPeriod(1);
//50Hz
SetTimer(scene_window, 1, 0, NULL);
do
{
while (!quit && GetMessage(&msg, scene_window, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} while (!quit);
//timeEndPeriod(1);
return 0;
}
static unsigned int screen_ptr[SCREEN_X*SCREEN_Y];
void clearworld(void)
{
memset( screen_ptr , 0 , SCREEN_X * SCREEN_Y * sizeof *screen_ptr );
}
void renderworld(HDC hdc)
{
BITMAPINFO bmi;
static int i;
unsigned int x, y;
unsigned int *p = screen_ptr;
clearworld();
for (y = 0; y < SCREEN_Y; y++)
{
for (x = 0; x < SCREEN_X; x++)
{
*p++ = ((x+i)^y)|(((x+i+1)^(y+i))<<16);
}
}
i++;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = SCREEN_X;
bmi.bmiHeader.biHeight = -SCREEN_Y;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = SCREEN_BPP;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 75;
bmi.bmiHeader.biYPelsPerMeter = 75;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
SetDIBitsToDevice(hdc, 0,0, SCREEN_X,SCREEN_Y, 0,0, 0,SCREEN_Y, screen_ptr, &bmi, DIB_RGB_COLORS);
SetBkMode(hdc, OPAQUE);
TextOut(hdc, 10,10,"nino is cool!", 13);
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, 10,30,"nino is cool!", 13);
}
Jim