#include#include const PHYSICAL_WIDTH = 800; const PHYSICAL_HEIGHT = 600; LPDIRECTDRAW lpDDraw; LPDIRECTDRAWSURFACE lpPrimarySurface; LRESULT CALLBACK DDrawWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); BOOL DDrawInit(HWND hWnd); void DDrawDone(); void DrawScreen(); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wndClass; HWND hWnd; MSG msg; ZeroMemory(&wndClass, sizeof(wndClass)); wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = DDrawWndProc; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.lpszClassName = «DDrawApp»; RegisterClass(&wndClass); hWnd = CreateWindowEx( WS_EX_TOPMOST, wndClass.lpszClassName, «DirectDraw Application», WS_POPUP | WS_MAXIMIZE, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK DDrawWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: DDrawInit(hWnd); SetTimer(hWnd, 1, 50, 0); return 0; case WM_TIMER: DrawScreen(); return 0; case WM_KEYDOWN: if (wParam == VK_ESCAPE) SendMessage(hWnd, WM_CLOSE, 0, 0); return 0; case WM_DESTROY: KillTimer(hWnd, 1); DDrawDone(); PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } } BOOL DDrawInit(HWND hWnd) { DDSURFACEDESC ddsd; DDSCAPS ddsc; if (DirectDrawCreate(NULL, &lpDDraw, NULL) != DD_OK) return FALSE; if (lpDDraw->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) != DD_OK) return FALSE; if (lpDDraw->SetDisplayMode(PHYSICAL_WIDTH, PHYSICAL_HEIGHT, 8) != DD_OK) return FALSE; ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; ddsd.dwFlags = DDSD_CAPS; if (lpDDraw->CreateSurface(&ddsd, &lpPrimarySurface, NULL) != DD_OK) return FALSE; return TRUE; } void DDrawDone() { if (lpPrimarySurface != NULL) lpPrimarySurface->Release(); if (lpDDraw != NULL) lpDDraw->Release(); } void DrawScreen() { DDSURFACEDESC ddsd; static int pos; ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); if (lpPrimarySurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) == DD_OK) { char* buffer = (char*)ddsd.lpSurface; for (int i = 0; i < PHYSICAL_HEIGHT / 2; i++) { memset(buffer + (i * ddsd.lPitch), i + pos, PHYSICAL_WIDTH); memset(buffer + ((PHYSICAL_HEIGHT / 2 + i) * ddsd.lPitch), i - pos, PHYSICAL_WIDTH); } pos++; lpPrimarySurface->Unlock(ddsd.lpSurface); } }