00001
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00040 #include "CToxiWindow.h"
00041
00042
00044 MSG _msg_initializer;
00045 MSG CToxiWindow::msg=_msg_initializer;
00046
00047
00048
00049 CToxiWindow::CToxiWindow(char *title,int width,int height,
00050 int bits,bool fullscreen,bool autoStart,CToxiRenderer *renderer)
00051 {
00052 this->genClassName();
00053 for(int i=0;i<256;i++)
00054 _keys[i]=false;
00055
00056 windowConfig.setWindowTitle(title);
00057 windowConfig.setWindowSize(width,height);
00058 windowConfig.setWindowColorBits(bits);
00059 windowConfig.setFullscreen(fullscreen);
00060 windowConfig.setAutomaticStart(autoStart);
00061
00062 this->renderer=renderer;
00063 this->rendererType = renderer->getRendererType();
00064
00065 if(!createWindow()) {
00066 MessageBox(NULL,WND_CREATION_ERR,REGISTER_CLASS,MB_OK|MB_ICONERROR);
00067 exit(0);
00068 }
00069
00070 renderer->setupRenderer(windowConfig.getWindowWidth(),
00071 windowConfig.getWindowHeight(),
00072 windowConfig.getWindowColorBits());
00073
00074 renderer->_fullscreen=windowConfig.getFullscreen();
00075
00076 if(!renderer->createContext()) {
00077 MessageBox(NULL,"Could not start renderer.",ERROR_TITLE,MB_OK|MB_ICONERROR);
00078 exit(0);
00079 }
00080
00081 renderer->initScene();
00082
00083 if(windowConfig.getAutomaticStart()) this->startRenderer();
00084 }
00085
00087 CToxiWindow::CToxiWindow(CToxiConfig c,CToxiRenderer *renderer)
00088 {
00089 this->windowConfig = c;
00090
00091 this->genClassName();
00092
00093 for(int i=0;i<256;i++)
00094 _keys[i]=false;
00095
00096 this->renderer=renderer;
00097 this->rendererType = renderer->getRendererType();
00098
00099 if(!createWindow()) {
00100 MessageBox(NULL,WND_CREATION_ERR,REGISTER_CLASS,MB_OK|MB_ICONERROR);
00101 exit(0);
00102 }
00103
00104 renderer->setupRenderer(windowConfig.getWindowWidth(),
00105 windowConfig.getWindowHeight(),
00106 windowConfig.getWindowColorBits());
00107
00108 renderer->_fullscreen=windowConfig.getFullscreen();
00109
00110 if(!renderer->createContext()) {
00111 MessageBox(NULL,"Could not start renderer.",ERROR_TITLE,MB_OK|MB_ICONERROR);
00112 exit(0);
00113 }
00114
00115 renderer->initScene();
00116
00117 if(windowConfig.getAutomaticStart()) this->startRenderer();
00118 }
00119
00120 CToxiWindow::CToxiWindow()
00121 {
00122 for(int i=0;i<256;i++)
00123 _keys[i]=false;
00124 this->genClassName();
00125 }
00126
00127 void CToxiWindow::genClassName() {
00128 sprintf(this->_wnd_toxi_class,"toxiWndClass$%d",rand());
00129 }
00130
00131 bool CToxiWindow::startWindow(CToxiConfig c,CToxiRenderer *renderer)
00132 {
00133 if(!this->setRenderer(c,renderer))
00134 return false;;
00135 if(!this->createWindow())
00136 return false;
00137 if(!this->setContext())
00138 return false;
00139 if(windowConfig.getAutomaticStart()) this->startRenderer();
00140 return true;
00141 }
00142
00143 bool CToxiWindow::setRenderer(CToxiConfig c,CToxiRenderer *renderer)
00144 {
00145 this->windowConfig = c;
00146 this->renderer=renderer;
00147 this->rendererType = renderer->getRendererType();
00148 renderer->setupRenderer(windowConfig.getWindowWidth(),
00149 windowConfig.getWindowHeight(),
00150 windowConfig.getWindowColorBits());
00151 renderer->_fullscreen=windowConfig.getFullscreen();
00152 return true;
00153 }
00154
00155 bool CToxiWindow::setContext()
00156 {
00157 return renderer->createContext();
00158 }
00159
00161 void CToxiWindow::startRenderer()
00162 {
00163 this->startMainLoop();
00164 }
00165
00167 CToxiWindow::~CToxiWindow()
00168 {
00169
00170 }
00171
00173 bool CToxiWindow::startMainLoop()
00174 {
00175 bool done=false;
00176 while(!done) {
00177 if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
00178 if (msg.message==WM_QUIT)
00179 done=TRUE;
00180 else {
00181 TranslateMessage(&msg);
00182 DispatchMessage(&msg);
00183 }
00184 }
00185 else {
00186 if (windowConfig.getWindowActive()) {
00187 if (_keys[VK_ESCAPE])
00188 done=true;
00189 }
00190 }
00191
00192 renderer->drawScene();
00193 renderer->swapBuffers();
00194
00195 }
00196 return true;
00197 }
00198
00200 LRESULT CALLBACK CToxiWindow::WndProc( HWND hWnd,
00201 UINT uMsg,
00202 WPARAM wParam,
00203 LPARAM lParam)
00204 {
00205 CToxiWindow* win;
00206
00207 try {
00208 win= (CToxiWindow*)GetWindowLong(hWnd,GWL_USERDATA);
00209 }
00210 catch(std::exception e){
00211 }
00212
00213 switch (uMsg)
00214 {
00215 case WM_NCCREATE:
00216 {
00217 LPCREATESTRUCT lpcs =(LPCREATESTRUCT)lParam;
00218 win = (CToxiWindow*) lpcs->lpCreateParams;
00219 SetWindowLong(hWnd,GWL_USERDATA,(long)win);
00220 win->renderer->hWnd = hWnd;
00221 break;
00222
00223 }
00224
00225 case WM_ACTIVATE:
00226 {
00227 if (!HIWORD(wParam))
00228 win->windowConfig.setWindowActive(true);
00229 else
00230 win->windowConfig.setWindowActive(false);
00231 return 0;
00232 }
00233
00234 case WM_SYSCOMMAND:
00235 {
00236 switch (wParam)
00237 {
00238 case SC_SCREENSAVE:
00239 case SC_MONITORPOWER:
00240 return 0;
00241 }
00242 break;
00243 }
00244
00245 case WM_CLOSE:
00246 {
00247 PostQuitMessage(0);
00248 return 0;
00249 }
00251 case WM_KEYDOWN:
00252 {
00253 win->onKeyPress(wParam);
00254 win->_keys[wParam] = TRUE;
00255 win->onKeyPress(wParam);
00256 return 0;
00257 }
00258
00259 case WM_KEYUP:
00260 {
00261 win->_keys[wParam] = FALSE;
00262 return 0;
00263 }
00265 case WM_LBUTTONDOWN:
00266 {
00267 v2i c;
00268 c.x=LOWORD(lParam);
00269 c.y=HIWORD(lParam);
00270 win->onMouseDown(1,&c);
00271 win->onMouseDown(&c);
00272 break;
00273 }
00274
00275 case WM_LBUTTONUP:
00276 {
00277 v2i c;
00278 c.x=LOWORD(lParam);
00279 c.y=HIWORD(lParam);
00280 win->onMouseUp(1,&c);
00281 win->onMouseUp(&c);
00282 break;
00283 }
00285 case WM_RBUTTONDOWN:
00286 {
00287 v2i c;
00288 c.x=LOWORD(lParam);
00289 c.y=HIWORD(lParam);
00290 win->onMouseDown(2,&c);
00291 win->onMouseDown(&c);
00292 break;
00293 }
00294
00295 case WM_RBUTTONUP:
00296 {
00297 v2i c;
00298 c.x=LOWORD(lParam);
00299 c.y=HIWORD(lParam);
00300 win->onMouseUp(2,&c);
00301 win->onMouseUp(&c);
00302 break;
00303 }
00305 case WM_MBUTTONDOWN:
00306 {
00307 v2i c;
00308 c.x=LOWORD(lParam);
00309 c.y=HIWORD(lParam);
00310 win->onMouseDown(3,&c);
00311 win->onMouseDown(&c);
00312 break;
00313 }
00314
00315 case WM_MBUTTONUP:
00316 {
00317 v2i c;
00318 c.x=LOWORD(lParam);
00319 c.y=HIWORD(lParam);
00320 win->onMouseUp(3,&c);
00321 win->onMouseUp(&c);
00322 break;
00323 }
00325 case WM_MOUSEMOVE:
00326 {
00327 v2i c;
00328 c.x=LOWORD(lParam);
00329 c.y=HIWORD(lParam);
00330 win->onMouseMove(&c);
00331 break;
00332 }
00334 case WM_MBUTTONDBLCLK:
00335 {
00336 v2i c;
00337 c.x=LOWORD(lParam);
00338 c.y=HIWORD(lParam);
00339 win->onMouseDblClick(3,&c);
00340 break;
00341 }
00342
00343 case WM_RBUTTONDBLCLK:
00344 {
00345 v2i c;
00346 c.x=LOWORD(lParam);
00347 c.y=HIWORD(lParam);
00348 win->onMouseDblClick(1,&c);
00349 break;
00350 }
00351
00352 case WM_LBUTTONDBLCLK:
00353 {
00354 v2i c;
00355 c.x=LOWORD(lParam);
00356 c.y=HIWORD(lParam);
00357 win->onMouseDblClick(2,&c);
00358 break;
00359 }
00360
00361 case WM_SIZE:
00362 {
00363 changeDisplaySize(LOWORD(lParam),HIWORD(lParam),hWnd);
00364 return 0;
00365 }
00366
00367 }
00368 return DefWindowProc(hWnd,uMsg,wParam,lParam);
00369 }
00370
00372 bool CToxiWindow::createWindow()
00373 {
00374
00375 WNDCLASS wc;
00376 DWORD dwExStyle;
00377 DWORD dwStyle;
00378 RECT WindowRect;
00379 WindowRect.left=(long)0;
00380 WindowRect.right=(long)windowConfig.getWindowWidth();
00381 WindowRect.top=(long)0;
00382 WindowRect.bottom=(long)windowConfig.getWindowHeight();
00383
00384 renderer->hInstance = GetModuleHandle(NULL);
00385 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
00386 wc.lpfnWndProc = (WNDPROC)WndProc;
00387 wc.cbClsExtra = 0;
00388 wc.cbWndExtra = 0;
00389 wc.hInstance = renderer->hInstance;
00390 wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
00391 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
00392 wc.hbrBackground = NULL;
00393 wc.lpszMenuName = NULL;
00394 wc.lpszClassName = _wnd_toxi_class;
00395
00396 if(!RegisterClass(&wc)) {
00397 MessageBox(NULL,REGISTER_CLASS,ERROR_TITLE,MB_OK|MB_ICONEXCLAMATION);
00398 return false;
00399 }
00400
00401 if(windowConfig.getFullscreen()) {
00402 DEVMODE dmScreenSettings;
00403 memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
00404 dmScreenSettings.dmSize=sizeof(dmScreenSettings);
00405 dmScreenSettings.dmPelsWidth = windowConfig.getWindowHeight();
00406 dmScreenSettings.dmPelsHeight = windowConfig.getWindowWidth();
00407 dmScreenSettings.dmBitsPerPel = windowConfig.getWindowColorBits();
00408 dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
00409
00410 if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) {
00411 if(MessageBox(NULL,UNSUP_MODE,ENGINE_TITLE,MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
00412 windowConfig.setFullscreen(false);
00413 else {
00414 MessageBox(NULL,CLOSE_ERROR,ERROR_TITLE,MB_OK|MB_ICONSTOP);
00415 return false;
00416 }
00417 }
00418 }
00419
00420 if(windowConfig.getFullscreen()) {
00421 dwExStyle=WS_EX_APPWINDOW;
00422 dwStyle=WS_POPUP;
00423 ShowCursor(false);
00424 }
00425 else {
00426 dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
00427 dwStyle=WS_OVERLAPPEDWINDOW;
00428 }
00429
00430 AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
00431
00432 if(!(renderer->hWnd=CreateWindowEx( dwExStyle,
00433 _wnd_toxi_class,
00434 windowConfig.getWindowTitle(),
00435 dwStyle |
00436 WS_CLIPSIBLINGS |
00437 WS_CLIPCHILDREN,
00438 0, 0,
00439 WindowRect.right-WindowRect.left,
00440 WindowRect.bottom-WindowRect.top,
00441 NULL,
00442 NULL,
00443 renderer->hInstance,
00444 this))) {
00445
00446 killWindow();
00447 MessageBox(NULL,WND_CREATION_ERR,ERROR_TITLE,MB_OK|MB_ICONEXCLAMATION);
00448 return false;
00449 }
00450
00451
00452
00453 if(!(renderer->hDC=GetDC(renderer->hWnd))) {
00454 killWindow();
00455 MessageBox(NULL,REGISTER_DC,ERROR_TITLE,MB_OK|MB_ICONEXCLAMATION);
00456 return false;
00457 }
00458
00459 ShowWindow(renderer->hWnd,SW_SHOW);
00460 SetForegroundWindow(renderer->hWnd);
00461 SetFocus(renderer->hWnd);
00462 return true;
00463 }
00464
00466 void CToxiWindow::changeDisplaySize(int width,int height,HWND hWnd)
00467 {
00468 CToxiWindow* win = (CToxiWindow*)GetWindowLong(hWnd,GWL_USERDATA);
00469 win->windowConfig.setWindowSize(width,height);
00470 win->renderer->windowWidth=width;
00471 win->renderer->windowHeight=height;
00472 win->renderer->resizeContext();
00473 }
00474
00476 void CToxiWindow::killWindow()
00477 {
00478 if(windowConfig.getFullscreen()) {
00479 ChangeDisplaySettings(NULL,0);
00480 ShowCursor(TRUE);
00481 }
00482 renderer->killContext();
00483
00484 if (renderer->hDC && !ReleaseDC(renderer->hWnd,renderer->hDC)) {
00485 MessageBox(NULL,RELEASE_DC,ERROR_SHOT_TITLE,MB_OK | MB_ICONINFORMATION);
00486 renderer->hDC=NULL;
00487 }
00488
00489 if (renderer->hWnd && !DestroyWindow(renderer->hWnd)) {
00490 MessageBox(NULL,RELEASE_HWND,ERROR_SHOT_TITLE,MB_OK | MB_ICONINFORMATION);
00491 renderer->hWnd=NULL;
00492 }
00493
00494 if (!UnregisterClass(_wnd_toxi_class,renderer->hInstance)) {
00495 MessageBox(NULL,RELEASE_CLASS,ERROR_SHOT_TITLE,MB_OK | MB_ICONINFORMATION);
00496 renderer->hInstance=NULL;
00497 }
00498 }
00499
00501 void CToxiWindow::onKeyPress(int key)
00502 {
00503 }
00504
00505 void CToxiWindow::onMouseDown(int button,v2i *c)
00506 {
00507 }
00508
00509 void CToxiWindow::onMouseUp(int button,v2i *c)
00510 {
00511 }
00512
00513 void CToxiWindow::onMouseDown(v2i *c)
00514 {
00515 }
00516
00517 void CToxiWindow::onMouseUp(v2i *c)
00518 {
00519 }
00520
00521 void CToxiWindow::onMouseMove(v2i *c)
00522 {
00523 }
00524
00525 void CToxiWindow::onMouseDblClick(int button,v2i *c)
00526 {
00527 }
00528