X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b96340e6f457071d63196f877c6df0ea1cc2af04..7948c0c24401c496c04da3c28f1f1f2f282ba327:/src/generic/splash.cpp?ds=sidebyside diff --git a/src/generic/splash.cpp b/src/generic/splash.cpp index a407dd1653..fa641bdf1e 100644 --- a/src/generic/splash.cpp +++ b/src/generic/splash.cpp @@ -6,7 +6,7 @@ // Created: 28/6/2000 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -20,8 +20,10 @@ #pragma hdrstop #endif +#if wxUSE_SPLASH + #ifndef WX_PRECOMP -#include "wx/wx.h" +#include "wx/dcmemory.h" #endif #include "wx/splash.h" @@ -32,13 +34,20 @@ #define wxSPLASH_TIMER_ID 9999 +IMPLEMENT_DYNAMIC_CLASS(wxSplashScreen, wxFrame); + BEGIN_EVENT_TABLE(wxSplashScreen, wxFrame) EVT_TIMER(wxSPLASH_TIMER_ID, wxSplashScreen::OnNotify) EVT_CLOSE(wxSplashScreen::OnCloseWindow) END_EVENT_TABLE() +/* Note that unless we pass a non-default size to the frame, SetClientSize + * won't work properly under Windows, and the splash screen frame is sized + * slightly too small. + */ + wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style): - wxFrame(parent, id, wxEmptyString, pos, size, style) + wxFrame(parent, id, wxEmptyString, wxPoint(0, 0), wxSize(100, 100), style) { m_window = NULL; m_splashStyle = splashStyle; @@ -46,14 +55,7 @@ wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int mil m_window = new wxSplashScreenWindow(bitmap, this, -1, pos, size, wxNO_BORDER); - // For some reason, we need to make the client size a couple of pixels - // bigger for all of the bitmap to show. -#ifdef __WXMSW__ - int fudge = 2; -#else - int fudge = 0; -#endif - SetClientSize(bitmap.GetWidth()+fudge, bitmap.GetHeight()+fudge); + SetClientSize(bitmap.GetWidth(), bitmap.GetHeight()); if (m_splashStyle & wxSPLASH_CENTRE_ON_PARENT) CentreOnParent(); @@ -68,7 +70,11 @@ wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int mil Show(TRUE); m_window->SetFocus(); - wxYield(); // Without this, you see a blank screen for an instant +#ifdef __WXMSW__ + Update(); // Without this, you see a blank screen for an instant +#else + wxYieldIfNeeded(); // Should eliminate this +#endif } wxSplashScreen::~wxSplashScreen() @@ -76,13 +82,12 @@ wxSplashScreen::~wxSplashScreen() m_timer.Stop(); } -void wxSplashScreen::OnNotify(wxTimerEvent& event) +void wxSplashScreen::OnNotify(wxTimerEvent& WXUNUSED(event)) { - m_timer.Stop(); - this->Destroy(); + Close(TRUE); } -void wxSplashScreen::OnCloseWindow(wxCloseEvent& event) +void wxSplashScreen::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) { m_timer.Stop(); this->Destroy(); @@ -93,7 +98,9 @@ void wxSplashScreen::OnCloseWindow(wxCloseEvent& event) */ BEGIN_EVENT_TABLE(wxSplashScreenWindow, wxWindow) - //EVT_PAINT(wxSplashScreenWindow::OnPaint) +#ifdef __WXGTK__ + EVT_PAINT(wxSplashScreenWindow::OnPaint) +#endif EVT_ERASE_BACKGROUND(wxSplashScreenWindow::OnEraseBackground) EVT_CHAR(wxSplashScreenWindow::OnChar) EVT_MOUSE_EVENTS(wxSplashScreenWindow::OnMouseEvent) @@ -103,40 +110,53 @@ wxSplashScreenWindow::wxSplashScreenWindow(const wxBitmap& bitmap, wxWindow* par wxWindow(parent, id, pos, size, style) { m_bitmap = bitmap; -} -void wxSplashScreenWindow::OnPaint(wxPaintEvent& event) -{ - wxPaintDC dc(this); - if (m_bitmap.Ok()) - dc.DrawBitmap(m_bitmap, 0, 0); +#if !defined(__WXGTK__) && wxUSE_PALETTE + bool hiColour = (wxDisplayDepth() >= 16) ; + + if (bitmap.GetPalette() && !hiColour) + { + SetPalette(* bitmap.GetPalette()); + } +#endif + } -static void wxDrawSplashBitmap(wxDC& dc, const wxBitmap& bitmap, int x, int y) +// VZ: why don't we do it under wxGTK? +#if !defined(__WXGTK__) && wxUSE_PALETTE + #define USE_PALETTE_IN_SPLASH +#endif + +static void wxDrawSplashBitmap(wxDC& dc, const wxBitmap& bitmap, int WXUNUSED(x), int WXUNUSED(y)) { wxMemoryDC dcMem; +#ifdef USE_PALETTE_IN_SPLASH bool hiColour = (wxDisplayDepth() >= 16) ; - -#ifndef __WXGTK__ + if (bitmap.GetPalette() && !hiColour) { - dc.SetPalette(* bitmap.GetPalette()); dcMem.SetPalette(* bitmap.GetPalette()); } -#endif +#endif // USE_PALETTE_IN_SPLASH dcMem.SelectObject(bitmap); dc.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), & dcMem, 0, 0); dcMem.SelectObject(wxNullBitmap); -#ifndef __WXGTK__ +#ifdef USE_PALETTE_IN_SPLASH if (bitmap.GetPalette() && !hiColour) { - dc.SetPalette(wxNullPalette); dcMem.SetPalette(wxNullPalette); } -#endif +#endif // USE_PALETTE_IN_SPLASH +} + +void wxSplashScreenWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + if (m_bitmap.Ok()) + wxDrawSplashBitmap(dc, m_bitmap, 0, 0); } void wxSplashScreenWindow::OnEraseBackground(wxEraseEvent& event) @@ -164,8 +184,9 @@ void wxSplashScreenWindow::OnMouseEvent(wxMouseEvent& event) GetParent()->Close(TRUE); } -void wxSplashScreenWindow::OnChar(wxKeyEvent& event) +void wxSplashScreenWindow::OnChar(wxKeyEvent& WXUNUSED(event)) { GetParent()->Close(TRUE); } +#endif // wxUSE_SPLASH