1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxSplashScreen class 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  13 #pragma implementation "splash.h" 
  16 // For compilers that support precompilation, includes "wx/wx.h". 
  17 #include "wx/wxprec.h" 
  26 #include "wx/dcmemory.h" 
  27 #include "wx/dcclient.h" 
  30 #include "wx/splash.h" 
  36 #define wxSPLASH_TIMER_ID 9999 
  38 IMPLEMENT_DYNAMIC_CLASS(wxSplashScreen
, wxFrame
); 
  40 BEGIN_EVENT_TABLE(wxSplashScreen
, wxFrame
) 
  41     EVT_TIMER(wxSPLASH_TIMER_ID
, wxSplashScreen::OnNotify
) 
  42     EVT_CLOSE(wxSplashScreen::OnCloseWindow
) 
  45 /* Note that unless we pass a non-default size to the frame, SetClientSize 
  46  * won't work properly under Windows, and the splash screen frame is sized 
  50 wxSplashScreen::wxSplashScreen(const wxBitmap
& bitmap
, long splashStyle
, int milliseconds
, wxWindow
* parent
, wxWindowID id
, const wxPoint
& pos
, const wxSize
& size
, long style
): 
  51     wxFrame(parent
, id
, wxEmptyString
, wxPoint(0, 0), wxSize(100, 100), style
) 
  54     m_splashStyle 
= splashStyle
; 
  55     m_milliseconds 
= milliseconds
; 
  57     m_window 
= new wxSplashScreenWindow(bitmap
, this, -1, pos
, size
, wxNO_BORDER
); 
  59     SetClientSize(bitmap
.GetWidth(), bitmap
.GetHeight()); 
  61     if (m_splashStyle 
& wxSPLASH_CENTRE_ON_PARENT
) 
  63     else if (m_splashStyle 
& wxSPLASH_CENTRE_ON_SCREEN
) 
  66     if (m_splashStyle 
& wxSPLASH_TIMEOUT
) 
  68         m_timer
.SetOwner(this, wxSPLASH_TIMER_ID
); 
  69         m_timer
.Start(milliseconds
, TRUE
); 
  74 #if defined( __WXMSW__ ) || defined(__WXMAC__) 
  75     Update(); // Without this, you see a blank screen for an instant 
  77     wxYieldIfNeeded(); // Should eliminate this 
  81 wxSplashScreen::~wxSplashScreen() 
  86 void wxSplashScreen::OnNotify(wxTimerEvent
& WXUNUSED(event
)) 
  91 void wxSplashScreen::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
)) 
  98  * wxSplashScreenWindow 
 101 BEGIN_EVENT_TABLE(wxSplashScreenWindow
, wxWindow
) 
 103     EVT_PAINT(wxSplashScreenWindow::OnPaint
) 
 105     EVT_ERASE_BACKGROUND(wxSplashScreenWindow::OnEraseBackground
) 
 106     EVT_CHAR(wxSplashScreenWindow::OnChar
) 
 107     EVT_MOUSE_EVENTS(wxSplashScreenWindow::OnMouseEvent
) 
 110 wxSplashScreenWindow::wxSplashScreenWindow(const wxBitmap
& bitmap
, wxWindow
* parent
, wxWindowID id
, const wxPoint
& pos
, const wxSize
& size
, long style
): 
 111     wxWindow(parent
, id
, pos
, size
, style
) 
 115 #if !defined(__WXGTK__) && wxUSE_PALETTE 
 116     bool hiColour 
= (wxDisplayDepth() >= 16) ; 
 118     if (bitmap
.GetPalette() && !hiColour
) 
 120         SetPalette(* bitmap
.GetPalette()); 
 126 // VZ: why don't we do it under wxGTK? 
 127 #if !defined(__WXGTK__) && wxUSE_PALETTE 
 128     #define USE_PALETTE_IN_SPLASH 
 131 static void wxDrawSplashBitmap(wxDC
& dc
, const wxBitmap
& bitmap
, int WXUNUSED(x
), int WXUNUSED(y
)) 
 135 #ifdef USE_PALETTE_IN_SPLASH 
 136     bool hiColour 
= (wxDisplayDepth() >= 16) ; 
 138     if (bitmap
.GetPalette() && !hiColour
) 
 140         dcMem
.SetPalette(* bitmap
.GetPalette()); 
 142 #endif // USE_PALETTE_IN_SPLASH 
 144     dcMem
.SelectObject(bitmap
); 
 145     dc
.Blit(0, 0, bitmap
.GetWidth(), bitmap
.GetHeight(), & dcMem
, 0, 0); 
 146     dcMem
.SelectObject(wxNullBitmap
); 
 148 #ifdef USE_PALETTE_IN_SPLASH 
 149     if (bitmap
.GetPalette() && !hiColour
) 
 151         dcMem
.SetPalette(wxNullPalette
); 
 153 #endif // USE_PALETTE_IN_SPLASH 
 156 void wxSplashScreenWindow::OnPaint(wxPaintEvent
& WXUNUSED(event
)) 
 160         wxDrawSplashBitmap(dc
, m_bitmap
, 0, 0); 
 163 void wxSplashScreenWindow::OnEraseBackground(wxEraseEvent
& event
) 
 169             wxDrawSplashBitmap(* event
.GetDC(), m_bitmap
, 0, 0); 
 177             wxDrawSplashBitmap(dc
, m_bitmap
, 0, 0); 
 182 void wxSplashScreenWindow::OnMouseEvent(wxMouseEvent
& event
) 
 184     if (event
.LeftDown() || event
.RightDown()) 
 185         GetParent()->Close(TRUE
); 
 188 void wxSplashScreenWindow::OnChar(wxKeyEvent
& WXUNUSED(event
)) 
 190     GetParent()->Close(TRUE
); 
 193 #endif // wxUSE_SPLASH