home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / src / generic / splash.cpp < prev    next >
C/C++ Source or Header  |  2002-02-14  |  5KB  |  193 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        splash.cpp
  3. // Purpose:     wxSplashScreen class
  4. // Author:      Julian Smart
  5. // Modified by:
  6. // Created:     28/6/2000
  7. // RCS-ID:      $Id: splash.cpp,v 1.16 2002/02/14 13:50:10 VZ Exp $
  8. // Copyright:   (c) Julian Smart
  9. // Licence:     wxWindows licence
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. #ifdef __GNUG__
  13. #pragma implementation "splash.h"
  14. #endif
  15.  
  16. // For compilers that support precompilation, includes "wx/wx.h".
  17. #include "wx/wxprec.h"
  18.  
  19. #ifdef __BORLANDC__
  20. #pragma hdrstop
  21. #endif
  22.  
  23. #if wxUSE_SPLASH
  24.  
  25. #ifndef WX_PRECOMP
  26. #include "wx/dcmemory.h"
  27. #endif
  28.  
  29. #include "wx/splash.h"
  30.  
  31. /*
  32.  * wxSplashScreen
  33.  */
  34.  
  35. #define wxSPLASH_TIMER_ID 9999
  36.  
  37. IMPLEMENT_DYNAMIC_CLASS(wxSplashScreen, wxFrame);
  38.  
  39. BEGIN_EVENT_TABLE(wxSplashScreen, wxFrame)
  40.     EVT_TIMER(wxSPLASH_TIMER_ID, wxSplashScreen::OnNotify)
  41.     EVT_CLOSE(wxSplashScreen::OnCloseWindow)
  42. END_EVENT_TABLE()
  43.  
  44. /* Note that unless we pass a non-default size to the frame, SetClientSize
  45.  * won't work properly under Windows, and the splash screen frame is sized
  46.  * slightly too small.
  47.  */
  48.  
  49. wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style):
  50.     wxFrame(parent, id, wxEmptyString, wxPoint(0, 0), wxSize(100, 100), style)
  51. {
  52.     m_window = NULL;
  53.     m_splashStyle = splashStyle;
  54.     m_milliseconds = milliseconds;
  55.  
  56.     m_window = new wxSplashScreenWindow(bitmap, this, -1, pos, size, wxNO_BORDER);
  57.  
  58.     SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
  59.  
  60.     if (m_splashStyle & wxSPLASH_CENTRE_ON_PARENT)
  61.         CentreOnParent();
  62.     else if (m_splashStyle & wxSPLASH_CENTRE_ON_SCREEN)
  63.         CentreOnScreen();
  64.  
  65.     if (m_splashStyle & wxSPLASH_TIMEOUT)
  66.     {
  67.         m_timer.SetOwner(this, wxSPLASH_TIMER_ID);
  68.         m_timer.Start(milliseconds, TRUE);
  69.     }
  70.  
  71.     Show(TRUE);
  72.     m_window->SetFocus();
  73. #ifdef __WXMSW__
  74.     Update(); // Without this, you see a blank screen for an instant
  75. #else
  76.     wxYieldIfNeeded(); // Should eliminate this
  77. #endif
  78. }
  79.  
  80. wxSplashScreen::~wxSplashScreen()
  81. {
  82.     m_timer.Stop();
  83. }
  84.  
  85. void wxSplashScreen::OnNotify(wxTimerEvent& WXUNUSED(event))
  86. {
  87.     Close(TRUE);
  88. }
  89.  
  90. void wxSplashScreen::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
  91. {
  92.     m_timer.Stop();
  93.     this->Destroy();
  94. }
  95.  
  96. /*
  97.  * wxSplashScreenWindow
  98.  */
  99.  
  100. BEGIN_EVENT_TABLE(wxSplashScreenWindow, wxWindow)
  101. #ifdef __WXGTK__
  102.     EVT_PAINT(wxSplashScreenWindow::OnPaint)
  103. #endif
  104.     EVT_ERASE_BACKGROUND(wxSplashScreenWindow::OnEraseBackground)
  105.     EVT_CHAR(wxSplashScreenWindow::OnChar)
  106.     EVT_MOUSE_EVENTS(wxSplashScreenWindow::OnMouseEvent)
  107. END_EVENT_TABLE()
  108.  
  109. wxSplashScreenWindow::wxSplashScreenWindow(const wxBitmap& bitmap, wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style):
  110.     wxWindow(parent, id, pos, size, style)
  111. {
  112.     m_bitmap = bitmap;
  113.  
  114. #if !defined(__WXGTK__) && wxUSE_PALETTE
  115.     bool hiColour = (wxDisplayDepth() >= 16) ;
  116.  
  117.     if (bitmap.GetPalette() && !hiColour)
  118.     {
  119.         SetPalette(* bitmap.GetPalette());
  120.     }
  121. #endif
  122.  
  123. }
  124.  
  125. // VZ: why don't we do it under wxGTK?
  126. #if !defined(__WXGTK__) && wxUSE_PALETTE
  127.     #define USE_PALETTE_IN_SPLASH
  128. #endif
  129.  
  130. static void wxDrawSplashBitmap(wxDC& dc, const wxBitmap& bitmap, int WXUNUSED(x), int WXUNUSED(y))
  131. {
  132.     wxMemoryDC dcMem;
  133.  
  134. #ifdef USE_PALETTE_IN_SPLASH
  135.     bool hiColour = (wxDisplayDepth() >= 16) ;
  136.  
  137.     if (bitmap.GetPalette() && !hiColour)
  138.     {
  139.         dcMem.SetPalette(* bitmap.GetPalette());
  140.     }
  141. #endif // USE_PALETTE_IN_SPLASH
  142.  
  143.     dcMem.SelectObject(bitmap);
  144.     dc.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), & dcMem, 0, 0);
  145.     dcMem.SelectObject(wxNullBitmap);
  146.  
  147. #ifdef USE_PALETTE_IN_SPLASH
  148.     if (bitmap.GetPalette() && !hiColour)
  149.     {
  150.         dcMem.SetPalette(wxNullPalette);
  151.     }
  152. #endif // USE_PALETTE_IN_SPLASH
  153. }
  154.  
  155. void wxSplashScreenWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
  156. {
  157.     wxPaintDC dc(this);
  158.     if (m_bitmap.Ok())
  159.         wxDrawSplashBitmap(dc, m_bitmap, 0, 0);
  160. }
  161.  
  162. void wxSplashScreenWindow::OnEraseBackground(wxEraseEvent& event)
  163. {
  164.     if (event.GetDC())
  165.     {
  166.         if (m_bitmap.Ok())
  167.         {
  168.             wxDrawSplashBitmap(* event.GetDC(), m_bitmap, 0, 0);
  169.         }
  170.     }
  171.     else
  172.     {
  173.         wxClientDC dc(this);
  174.         if (m_bitmap.Ok())
  175.         {
  176.             wxDrawSplashBitmap(dc, m_bitmap, 0, 0);
  177.         }
  178.     }
  179. }
  180.  
  181. void wxSplashScreenWindow::OnMouseEvent(wxMouseEvent& event)
  182. {
  183.     if (event.LeftDown() || event.RightDown())
  184.         GetParent()->Close(TRUE);
  185. }
  186.  
  187. void wxSplashScreenWindow::OnChar(wxKeyEvent& WXUNUSED(event))
  188. {
  189.     GetParent()->Close(TRUE);
  190. }
  191.  
  192. #endif // wxUSE_SPLASH
  193.