Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

CToxiWindow.cpp

Go to the documentation of this file.
00001 
00009 /* 
00010         ---- Copyright (C) 2002  Jose Eduardo R. Mourão (eduardo_rdm@hotmail.com) ----
00011           
00012         This file is part of ToxiTea.
00013 
00014     ToxiTea is free software; you can redistribute it and/or modify
00015     it under the terms of the GNU General Public License as published by
00016     the Free Software Foundation; either version 2 of the License, or
00017     (at your option) any later version.
00018 
00019     ToxiTea is distributed in the hope that it will be useful,
00020     but WITHOUT ANY WARRANTY; without even the implied warranty of
00021     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00022     GNU General Public License for more details.
00023 
00024     You should have received a copy of the GNU General Public License
00025     along with ToxiTea; if not, write to the Free Software
00026     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00027 
00028         For more information and updates visit: 
00029         http://toxitea.sourceforge.net
00030         or mail to: eduardo_rdm@hotmail.com
00031 
00032         COMPILING AND/OR USING YOU ARE ACCEPTING ALL TERMS ABOVE.
00033         THIS LICENSE CAN BE CHANGED ANY TIME FOR ANY REASON WITHOUT NO COMMUNICATION.
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 

Generated on Mon Sep 23 23:07:01 2002 for ToxiTea by doxygen1.2.18