#include <Windows.h>
#define WINDOW_CLASS_NAME TEXT("Tetris")
HWND hMainWindow;
HINSTANCE hInstance;
HDC hMemDC, hBlockDC;
HBITMAP hMemPrev, hBlockPrev;
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
HDC hdc = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hdc);
HBITMAP hBitmap = CreateCompatibleBitmap(hdc, 24 * 10, 24 * 20);
hMemPrev = (HBITMAP)SelectObject(hMemDC, hBitmap);
hBlockDC = CreateCompatibleDC(hdc);
hBitmap = LoadBitmap(hInstance, TEXT("BLOCKS"));
hBlockPrev = (HBITMAP)SelectObject(hBlockDC, hBitmap);
//debug
BitBlt(hMemDC, 0, 0, 24, 24, hBlockDC, 0, 0, SRCCOPY);
ReleaseDC(hWnd, hdc);
break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc, 0, 0, 24 * 10, 24 * 20, hMemDC, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
break;
}
case WM_DESTROY:
{
HBITMAP hBitmap = (HBITMAP)SelectObject(hMemDC, hMemPrev);
DeleteObject(hBitmap);
DeleteDC(hMemDC);
hBitmap = (HBITMAP)SelectObject(hBlockDC, hBlockPrev);
DeleteObject(hBitmap);
DeleteDC(hBlockDC);
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmdLine, int cmdShow)
{
WNDCLASSEX wc;
hInstance = hInst;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW| CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
wc.lpszMenuName = NULL;
wc.lpszClassName = WINDOW_CLASS_NAME;
wc.hIconSm = NULL;
if(!RegisterClassEx(&wc)) return -1;
RECT r;
r.left = r.top = 0;
r.right = 24 * 10;
r.bottom = 24 * 20;
AdjustWindowRectEx(&r,WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION, false, 0);
hMainWindow = CreateWindow(
WINDOW_CLASS_NAME, TEXT("title"),
WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION,
CW_USEDEFAULT, CW_USEDEFAULT, r.right - r.left, r.bottom - r.top,
NULL, NULL, hInst, NULL);
if(hMainWindow == NULL) return -1;
ShowWindow(hMainWindow, SW_SHOW);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
I2luY2x1ZGUgPFdpbmRvd3MuaD4KCiNkZWZpbmUgV0lORE9XX0NMQVNTX05BTUUgVEVYVCgiVGV0cmlzIikKCkhXTkQgaE1haW5XaW5kb3c7CkhJTlNUQU5DRSBoSW5zdGFuY2U7CgpIREMgaE1lbURDLCBoQmxvY2tEQzsKSEJJVE1BUCBoTWVtUHJldiwgaEJsb2NrUHJldjsKCkxSRVNVTFQgQ0FMTEJBQ0sgV25kUHJvYyhIV05EIGhXbmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7Cglzd2l0Y2gobXNnKQoJewoJCWNhc2UgV01fQ1JFQVRFOgoJCQl7CgkJCQlIREMgaGRjID0gR2V0REMoaFduZCk7CgoJCQkJaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGhkYyk7CgkJCQlIQklUTUFQIGhCaXRtYXAgPSBDcmVhdGVDb21wYXRpYmxlQml0bWFwKGhkYywgMjQgKiAxMCwgMjQgKiAyMCk7CgkJCQloTWVtUHJldiA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoTWVtREMsIGhCaXRtYXApOwoKCQkJCWhCbG9ja0RDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGhkYyk7CgkJCQloQml0bWFwID0gTG9hZEJpdG1hcChoSW5zdGFuY2UsIFRFWFQoIkJMT0NLUyIpKTsKCQkJCWhCbG9ja1ByZXYgPSAoSEJJVE1BUClTZWxlY3RPYmplY3QoaEJsb2NrREMsIGhCaXRtYXApOwoJCQkJCgkJCQkvL2RlYnVnCgkJCQlCaXRCbHQoaE1lbURDLCAwLCAwLCAyNCwgMjQsIGhCbG9ja0RDLCAwLCAwLCBTUkNDT1BZKTsKCgkJCQlSZWxlYXNlREMoaFduZCwgaGRjKTsKCQkJCWJyZWFrOwoJCQl9CgkJY2FzZSBXTV9QQUlOVDoKCQkJewoJCQkJUEFJTlRTVFJVQ1QgcHM7CgkJCQlIREMgaGRjID0gQmVnaW5QYWludChoV25kLCAmcHMpOwoJCQkJQml0Qmx0KGhkYywgMCwgMCwgMjQgKiAxMCwgMjQgKiAyMCwgaE1lbURDLCAwLCAwLCBTUkNDT1BZKTsKCQkJCUVuZFBhaW50KGhXbmQsICZwcyk7CgkJCQlicmVhazsKCgkJCX0KCQljYXNlIFdNX0RFU1RST1k6CgkJCXsKCQkJCUhCSVRNQVAgaEJpdG1hcCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoTWVtREMsIGhNZW1QcmV2KTsKCQkJCURlbGV0ZU9iamVjdChoQml0bWFwKTsKCQkJCURlbGV0ZURDKGhNZW1EQyk7CgoJCQkJaEJpdG1hcCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoQmxvY2tEQywgaEJsb2NrUHJldik7CgkJCQlEZWxldGVPYmplY3QoaEJpdG1hcCk7CgkJCQlEZWxldGVEQyhoQmxvY2tEQyk7CgoJCQkJUG9zdFF1aXRNZXNzYWdlKDApOwoJCQkJYnJlYWs7CgkJCX0KCQlkZWZhdWx0OgoJCQlyZXR1cm4gRGVmV2luZG93UHJvYyhoV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKCQkKCX0KCXJldHVybiAwOwp9CgppbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0LCBISU5TVEFOQ0UgaFByZXYsIExQU1RSIGNtZExpbmUsIGludCBjbWRTaG93KQp7CglXTkRDTEFTU0VYIHdjOwoJaEluc3RhbmNlID0gaEluc3Q7CgoJd2MuY2JTaXplCQkJPSBzaXplb2YoV05EQ0xBU1NFWCk7Cgl3Yy5zdHlsZQkJCT0gQ1NfSFJFRFJBV3wgQ1NfVlJFRFJBVzsKCXdjLmxwZm5XbmRQcm9jCQk9IChXTkRQUk9DKVduZFByb2M7Cgl3Yy5jYkNsc0V4dHJhCQk9IDA7Cgl3Yy5jYlduZEV4dHJhCQk9IDA7Cgl3Yy5oSW5zdGFuY2UJCT0gaEluc3Q7Cgl3Yy5oSWNvbgkJCT0gTlVMTDsKCXdjLmhDdXJzb3IJCQk9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKCXdjLmhickJhY2tncm91bmQJPSAoSEJSVVNIKUNPTE9SX0JBQ0tHUk9VTkQ7Cgl3Yy5scHN6TWVudU5hbWUJCT0gTlVMTDsKCXdjLmxwc3pDbGFzc05hbWUJPSBXSU5ET1dfQ0xBU1NfTkFNRTsKCSB3Yy5oSWNvblNtCQkJPSBOVUxMOwoKCWlmKCFSZWdpc3RlckNsYXNzRXgoJndjKSkgcmV0dXJuIC0xOwoKCQoJUkVDVCByOwoJci5sZWZ0ID0gci50b3AgPSAwOwoJci5yaWdodCA9IDI0ICogMTA7CglyLmJvdHRvbSA9IDI0ICogMjA7CgoJQWRqdXN0V2luZG93UmVjdEV4KCZyLFdTX09WRVJMQVBQRUQgfCBXU19NSU5JTUlaRUJPWCB8IFdTX1NZU01FTlUgfCBXU19DQVBUSU9OLCBmYWxzZSwgMCk7CgoKCWhNYWluV2luZG93ID0gQ3JlYXRlV2luZG93KAoJCQkJCVdJTkRPV19DTEFTU19OQU1FLCBURVhUKCJ0aXRsZSIpLAoJCQkJCVdTX09WRVJMQVBQRUQgfCBXU19NSU5JTUlaRUJPWCB8IFdTX1NZU01FTlUgfCBXU19DQVBUSU9OLAoJCQkJCUNXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIHIucmlnaHQgLSByLmxlZnQsIHIuYm90dG9tIC0gci50b3AsCgkJCQkJTlVMTCwgTlVMTCwgaEluc3QsIE5VTEwpOwoKCWlmKGhNYWluV2luZG93ID09IE5VTEwpIHJldHVybiAtMTsKCglTaG93V2luZG93KGhNYWluV2luZG93LCBTV19TSE9XKTsKCglNU0cgbXNnOwoKCXdoaWxlKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpCgl7CgkJVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKCQlEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7Cgl9CgoJcmV0dXJuIDA7Cgp9