LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_SYSCOMMAND: { switch (wParam) { case SC_SCREENSAVE: case SC_MONITORPOWER: return 0; } break; } case WM_CLOSE: PostQuitMessage(0); return 0; case WM_SIZE: render_resize(LOWORD(lParam),HIWORD(lParam)); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); }
bool createWindow(char* title, int width, int height) { WNDCLASS wc; RECT rect; rect.left=0; rect.right=width; rect.top=0; rect.bottom=height; hInstance = GetModuleHandle(NULL); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = SAMPLE_NAME; if(!RegisterClass(&wc)) { return false; } AdjustWindowRectEx(&rect, WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW | WS_EX_WINDOWEDGE); if(!(hWnd=CreateWindowEx(WS_EX_APPWINDOW|WS_EX_WINDOWEDGE,SAMPLE_NAME,title, WS_OVERLAPPEDWINDOW|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, 0,0,rect.right-rect.left,rect.bottom-rect.top, NULL,NULL,hInstance,NULL))) { releaseWindow(); return false; } static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; if(!(hDC=GetDC(hWnd))) { releaseWindow(); OutputDebugString(""); return FALSE; } int pixelformat; if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 ){ OutputDebugString("ChoosePixelFormat Failed...."); return FALSE; } if (SetPixelFormat(hDC, pixelformat, &pfd) == FALSE){ OutputDebugString("SetPixelFormat Failed...."); return FALSE; } if (!(hRC=wglCreateContext(hDC))){ OutputDebugString("Creating HGLRC Failed...."); return FALSE; } // Set Vsync //BOOL (WINAPI *wglSwapIntervalEXT)(int) = NULL; //if(strstr((char*)glGetString( GL_EXTENSIONS ),"WGL_EXT_swap_control")== 0) { //} //else { //wglSwapIntervalEXT = (BOOL (WINAPI*)(int))wglGetProcAddress("wglSwapIntervalEXT"); //if(wglSwapIntervalEXT) wglSwapIntervalEXT(1); //} wglMakeCurrent(hDC,hRC); ShowWindow(hWnd,SW_SHOW); SetForegroundWindow(hWnd); SetFocus(hWnd); render_resize(width, height); glClearColor(0.0f,0.0f,0.0f,0.0f); glClearDepth(1.0f); return TRUE; }
void input_update() { /* Converts SDL event data into internal format which serves as an intermediary between SDL events and input relevent to specific game phases. Unlike input_reset, can be called an arbitrary number of times per tick, from either thread. */ // Update key vars while(SDL_PollEvent(&in_event)) { switch(in_event.type) { case SDL_MOUSEMOTION: in_cursorx = in_event.motion.x; in_cursory = in_event.motion.y; break; case SDL_MOUSEBUTTONDOWN: switch(in_event.button.button) { case SDL_BUTTON_LEFT: in_leftmousepress = 1; in_leftmousehold = 1; break; case SDL_BUTTON_RIGHT: in_rightmousepress = 1; in_rightmousehold = 1; break; } break; case SDL_MOUSEBUTTONUP: switch(in_event.button.button) { case SDL_BUTTON_LEFT: in_leftmousehold = 0; break; case SDL_BUTTON_RIGHT: in_rightmousehold = 0; break; } break; case SDL_MOUSEWHEEL: in_deltamousewheel+= in_event.wheel.y; break; case SDL_KEYDOWN: // FLAG 'a' is 97 if(in_event.key.keysym.sym<INPUT_KEYS) { in_keypress[in_event.key.keysym.sym] = 1; in_keyhold[in_event.key.keysym.sym] = 1; if(in_event.key.keysym.sym==113) exit(1); // FLAG instaclose //printf("%d\n",in_event.key.keysym.sym); // FLAG } break; case SDL_KEYUP: if(in_event.key.keysym.sym<INPUT_KEYS) { in_keyhold[in_event.key.keysym.sym] = 0; } break; case SDL_WINDOWEVENT: switch(in_event.window.event) { // for full list see http://wiki.libsdl.org/SDL_WindowEvent case SDL_WINDOWEVENT_CLOSE: exit(1); // FLAG make a function for forced closure break; case SDL_WINDOWEVENT_RESIZED: { render_resize(in_event.window.data1,in_event.window.data2); debug_message("Resize: %d %d\n", in_event.window.data1, in_event.window.data2); //xx } break; } break; } } }