INT_PTR CALLBACK about_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { int temp; int x, y, w, h; context *cx; PAINTSTRUCT ps; HDC hdc; switch(msg) { case WM_INITDIALOG: SetWindowLongPtr(hwnd, DWL_USER, 0); //set window pos w = GetSystemMetrics(SM_CXDLGFRAME) * 2 + WIDTH; h = GetSystemMetrics(SM_CYDLGFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION) + HEIGHT; x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2; y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2; SetWindowPos(hwnd, NULL, x, y, w, h, SWP_NOZORDER); //init cx temp = bmpsize(WIDTH, HEIGHT); if( (!(cx = malloc(sizeof(context)))) || (!(cx->buffer = malloc(temp))) || (!(cx->frame = malloc(temp))) ) { DestroyWindow(hwnd); return 1; } cx->framelength = temp; cx->hdc = GetDC(hwnd); SetWindowLongPtr(hwnd, DWL_USER, (LONG_PTR)cx); //generate first frame frame_init(cx); //set frame move timer SetTimer(hwnd, TIMER, INTERVAL, 0); return 1; case WM_PAINT: if((cx = (void*)GetWindowLong(hwnd, DWL_USER))) { if((hdc = BeginPaint(hwnd, &ps))) { imageput(hdc, 0, 0, WIDTH, HEIGHT, cx->frame); EndPaint(hwnd, &ps); } } return 1; case WM_TIMER: switch(wp) { case TIMER: if((cx = (void*)GetWindowLong(hwnd, DWL_USER))) { framemove(cx); imageput(cx->hdc, 0, 0, WIDTH, HEIGHT, cx->frame); } return 1; } break; case WM_DESTROY: if((cx = (void*)GetWindowLong(hwnd, DWL_USER))) { KillTimer(hwnd, TIMER); ReleaseDC(hwnd, cx->hdc); free(cx->buffer); free(cx->frame); free(cx); } return 1; case WM_CLOSE: EndDialog(hwnd, 0); return 1; } return 0; }
void main(void) { // 內定使用DirectX 9來繪圖 char *device = "dx9"; void (*render)(void) = RenderFrameDX9; bool (*init_resource)(void) = InitResourceDX9; bool (*release_resource)(void) = ReleaseResourceDX9; void (*resize_func)(int width, int height) = ResizeWindowDX9; #ifdef _ENABLE_DX10_ printf("Press\n(1) for Direct3D9\n(2) for OpenGL\n(3) for Direct3D10\n"); #else printf("Press\n(1) for Direct3D9\n(2) for OpenGL\n"); #endif int c = getche(); switch(c) { default: case '1': render = RenderFrameDX9; init_resource = InitResourceDX9; release_resource = ReleaseResourceDX9; resize_func = ResizeWindowDX9; break; case '2': device = "opengl"; init_resource = InitResourceOpenGL; release_resource = ReleaseResourceOpenGL; render = RenderFrameOpenGL; resize_func = ResizeWindowOpenGL; break; #ifdef _ENABLE_DX10_ case '3': device = "dx10"; init_resource = InitResourceDX10; release_resource = ReleaseResourceDX10; render = RenderFrameDX10; resize_func = ResizeWindowDX10; break; #endif } printf("\nSelected %s device for rendering.\n", device); GutResizeFunc( resize_func ); // 在(100,100)的位置開啟一個大小為(512x512)的視窗 GutCreateWindow(100, 100, 512, 512, device); // 做OpenGL或DirectX初始化 if ( !GutInitGraphicsDevice(device) ) { printf("Failed to initialize %s device\n", device); exit(0); } // GutInputInit(); GutRegisterKeyDown(GUTKEY_1, KeyDown_1); GutRegisterKeyDown(GUTKEY_2, KeyDown_2); GutRegisterKeyDown(GUTKEY_3, KeyDown_3); GutRegisterKeyDown(GUTKEY_4, KeyDown_4); GutRegisterKeyDown(GUTKEY_5, KeyDown_5); GutRegisterKeyDown(GUTKEY_6, KeyDown_6); GutRegisterKeyPressed(GUTKEY_EQUALS, KeyPressed_ADD); GutRegisterKeyPressed(GUTKEY_MINUS, KeyPressed_MINUS); GutRegisterKeyPressed(GUTKEY_ADD, KeyPressed_ADD); GutRegisterKeyPressed(GUTKEY_SUBTRACT, KeyPressed_MINUS); g_Control.SetCamera(Vector4(0.0f, 3.0f, 1.0f), Vector4(0.0f, 0.0f, 1.0f), Vector4(0.0f, 0.0f, 1.0f) ); g_Control.SetMoveSpeed(5.0f); // g_emitter.m_fEmitRate = 300; g_emitter.m_fEmitTheta = FastMath::DegToRad(15.0f); g_emitter.m_fParticleInitSpeed[0] = 1.0f; g_emitter.m_fParticleInitSpeed[1] = 2.0f; g_emitter.m_fParticleLife[0] = 1.5f; g_emitter.m_fParticleLife[1] = 2.0f; g_emitter.m_fParticleSize[0] = 0.05f; g_emitter.m_fParticleSize[1] = 0.10f; g_Particle.SetEmitter(g_emitter); g_Particle.SetForce(Vector4(0.0f, 0.0f, -1.0f)); // 載入shader if ( !init_resource() ) { release_resource(); printf("Failed to load resources\n"); exit(0); } g_Timer.Restart(); // 主回圈 while( GutProcessMessage() ) { GetUserInput(); // framemove(); // 畫出矩形 render(); } // 卸載shader release_resource(); // 關閉OpenGL/DirectX繪圖裝置 GutReleaseGraphicsDevice(); }