#include #include #pragma comment (lib, "opengl32.lib") float xvel, yvel; bool Keys[255]; void ProcessInput(unsigned int key, float vel) { switch (key) { case VK_RIGHT: case 'D': xvel += vel; break; case VK_LEFT: case 'A': xvel -= vel; break; case VK_DOWN: case 'S': yvel += vel; break; case VK_UP: case 'W': yvel -= vel; break; } } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { /* case WM_KEYDOWN: if ((lParam & (1 << 30)) == 0) ProcessInput(wParam, 4); break; case WM_KEYUP: ProcessInput(wParam, -4); break; */ case WM_INPUT: { unsigned int size; GetRawInputData((HRAWINPUT) lParam, RID_INPUT, NULL, &size, sizeof(RAWINPUTHEADER)); unsigned char *data = new unsigned char[size]; GetRawInputData((HRAWINPUT) lParam, RID_INPUT, data, &size, sizeof(RAWINPUTHEADER)); RAWINPUT *raw = (RAWINPUT*) data; if (raw->header.dwType == RIM_TYPEKEYBOARD) { if (raw->data.keyboard.Flags & RI_KEY_BREAK) { if (Keys[raw->data.keyboard.MakeCode]) { Keys[raw->data.keyboard.MakeCode] = false; ProcessInput(MapVirtualKey(raw->data.keyboard.MakeCode, MAPVK_VSC_TO_VK), -4); } } else { if (!Keys[raw->data.keyboard.MakeCode]) { Keys[raw->data.keyboard.MakeCode] = true; ProcessInput(MapVirtualKey(raw->data.keyboard.MakeCode, MAPVK_VSC_TO_VK), 4); } } } break; } case WM_CLOSE: PostQuitMessage(EXIT_SUCCESS); return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { TCHAR className[] = TEXT("Window"); WNDCLASS windowClass = {0}; windowClass.lpfnWndProc = WindowProc; windowClass.hInstance = hInstance; windowClass.lpszClassName = className; RegisterClass(&windowClass); unsigned int style = WS_OVERLAPPEDWINDOW; RECT rectangle = {0, 0, 640, 480}; AdjustWindowRect(&rectangle, style, false); HWND window = CreateWindow(className, TEXT("Diagonal"), style, CW_USEDEFAULT, CW_USEDEFAULT, rectangle.right - rectangle.left, rectangle.bottom - rectangle.top, 0, 0, hInstance, 0); RAWINPUTDEVICE rid[1] = {0}; rid[0].usUsagePage = 0x01; rid[0].usUsage = 0x06; rid[0].dwFlags = RIDEV_NOLEGACY; RegisterRawInputDevices(rid, 1, sizeof(rid[0])); HDC device = GetDC(window); PIXELFORMATDESCRIPTOR descriptor = {0}; descriptor.nSize = sizeof(PIXELFORMATDESCRIPTOR); descriptor.nVersion = 1; descriptor.dwFlags = PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL; descriptor.iPixelType = PFD_TYPE_RGBA; descriptor.cColorBits = 32; int format = ChoosePixelFormat(device, &descriptor); SetPixelFormat(device, format, &descriptor); HGLRC render = wglCreateContext(device); wglMakeCurrent(device, render); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, 640, 480, 0, 1, -1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClearColor(1, 1, 1, 1); ShowWindow(window, nCmdShow); MSG message = {0}; float quadWidth = 64, quadHeight = 64; float x = 0, y = 0; float degrees = 0; while (message.message != WM_QUIT) { while ((PeekMessage(&message, 0, 0, 0, PM_REMOVE)) && (message.message != WM_QUIT)) DispatchMessage(&message); x += xvel; y += yvel; if ((xvel != 0) || (yvel != 0)) { if ((xvel != 0) && (yvel != 0)) degrees = 45; else degrees = 0; } glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslatef(x + quadWidth / 2.f, y + quadHeight / 2.f, 0); glRotatef(degrees, 0, 0, 1); glBegin(GL_QUADS); glColor3f(1, 0, 0); glVertex2f( -quadWidth / 2.f, -quadHeight / 2.f); glVertex2f( quadWidth / 2.f, -quadHeight / 2.f); glVertex2f( quadWidth / 2.f, quadHeight / 2.f); glVertex2f( -quadWidth / 2.f, quadHeight / 2.f); glEnd(); SwapBuffers(device); } wglMakeCurrent(0, 0); wglDeleteContext(render); ReleaseDC(window, device); DestroyWindow(window); UnregisterClass(className, hInstance); return message.wParam; }