Use wxEventFilter to remove the splash screen as soon as any user input is
detected anywhere in the application, not necessarily over the splash screen
itself.
This ensures that the splash screen disappears as soon as the user starts
working with the application instead of sticking around and covering the main
window.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69796
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
#define _WX_SPLASH_H_
#include "wx/bitmap.h"
#define _WX_SPLASH_H_
#include "wx/bitmap.h"
+#include "wx/eventfilter.h"
-class WXDLLIMPEXP_ADV wxSplashScreen: public wxFrame
+class WXDLLIMPEXP_ADV wxSplashScreen: public wxFrame,
+ public wxEventFilter
{
public:
// for RTTI macros only
{
public:
// for RTTI macros only
+ wxSplashScreen() { Init(); }
wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds,
wxWindow* parent, wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds,
wxWindow* parent, wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
wxSplashScreenWindow* GetSplashWindow() const { return m_window; }
int GetTimeout() const { return m_milliseconds; }
wxSplashScreenWindow* GetSplashWindow() const { return m_window; }
int GetTimeout() const { return m_milliseconds; }
+ // Override wxEventFilter method to hide splash screen on any user input.
+ virtual int FilterEvent(wxEvent& event);
+
+ // Common part of all ctors.
+ void Init();
+
wxSplashScreenWindow* m_window;
long m_splashStyle;
int m_milliseconds;
wxSplashScreenWindow* m_window;
long m_splashStyle;
int m_milliseconds;
void OnPaint(wxPaintEvent& event);
void OnEraseBackground(wxEraseEvent& event);
void OnPaint(wxPaintEvent& event);
void OnEraseBackground(wxEraseEvent& event);
- void OnMouseEvent(wxMouseEvent& event);
- void OnChar(wxKeyEvent& event);
void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; }
wxBitmap& GetBitmap() { return m_bitmap; }
void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; }
wxBitmap& GetBitmap() { return m_bitmap; }
EVT_CLOSE(wxSplashScreen::OnCloseWindow)
END_EVENT_TABLE()
EVT_CLOSE(wxSplashScreen::OnCloseWindow)
END_EVENT_TABLE()
+void wxSplashScreen::Init()
+{
+ m_window = NULL;
+
+ wxEvtHandler::AddFilter(this);
+}
+
/* 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.
/* 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.
: wxFrame(parent, id, wxEmptyString, wxPoint(0,0), wxSize(100, 100),
style | wxFRAME_TOOL_WINDOW | wxFRAME_NO_TASKBAR)
{
: wxFrame(parent, id, wxEmptyString, wxPoint(0,0), wxSize(100, 100),
style | wxFRAME_TOOL_WINDOW | wxFRAME_NO_TASKBAR)
{
// splash screen must not be used as parent by the other windows because it
// is going to disappear soon, indicate it by giving it this special style
SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT);
// splash screen must not be used as parent by the other windows because it
// is going to disappear soon, indicate it by giving it this special style
SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT);
GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
#endif
GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
#endif
m_splashStyle = splashStyle;
m_milliseconds = milliseconds;
m_splashStyle = splashStyle;
m_milliseconds = milliseconds;
wxSplashScreen::~wxSplashScreen()
{
m_timer.Stop();
wxSplashScreen::~wxSplashScreen()
{
m_timer.Stop();
+
+ wxEvtHandler::RemoveFilter(this);
+}
+
+int wxSplashScreen::FilterEvent(wxEvent& event)
+{
+ const wxEventType t = event.GetEventType();
+ if ( t == wxEVT_KEY_DOWN ||
+ t == wxEVT_LEFT_DOWN ||
+ t == wxEVT_RIGHT_DOWN ||
+ t == wxEVT_MIDDLE_DOWN )
+ Close(true);
+
+ return -1;
}
void wxSplashScreen::OnNotify(wxTimerEvent& WXUNUSED(event))
}
void wxSplashScreen::OnNotify(wxTimerEvent& WXUNUSED(event))
EVT_PAINT(wxSplashScreenWindow::OnPaint)
#endif
EVT_ERASE_BACKGROUND(wxSplashScreenWindow::OnEraseBackground)
EVT_PAINT(wxSplashScreenWindow::OnPaint)
#endif
EVT_ERASE_BACKGROUND(wxSplashScreenWindow::OnEraseBackground)
- EVT_CHAR(wxSplashScreenWindow::OnChar)
- EVT_MOUSE_EVENTS(wxSplashScreenWindow::OnMouseEvent)
END_EVENT_TABLE()
wxSplashScreenWindow::wxSplashScreenWindow(const wxBitmap& bitmap, wxWindow* parent,
END_EVENT_TABLE()
wxSplashScreenWindow::wxSplashScreenWindow(const wxBitmap& bitmap, wxWindow* parent,
-void wxSplashScreenWindow::OnMouseEvent(wxMouseEvent& event)
-{
- if (event.LeftDown() || event.RightDown())
- GetParent()->Close(true);
- else
- event.Skip();
-}
-
-void wxSplashScreenWindow::OnChar(wxKeyEvent& WXUNUSED(event))
-{
- GetParent()->Close(true);
-}
-