#include "wx/dcclient.h"
#include "wx/image.h"
+#ifndef __WXMSW__
+ #include "../sample.xpm"
+#endif
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// menu ids
+enum
+{
+ Show_Shaped = 100,
+ Show_Transparent,
+
+ // must be consecutive and in the same order as wxShowEffect enum elements
+ Show_Effect_First,
+ Show_Effect_Roll = Show_Effect_First,
+ Show_Effect_Slide,
+ Show_Effect_Blend,
+ Show_Effect_Expand,
+ Show_Effect_Last = Show_Effect_Expand
+};
+
// ----------------------------------------------------------------------------
// private classes
// ----------------------------------------------------------------------------
};
+// Main frame just contains the menu items invoking the other tests
+class MainFrame : public wxFrame
+{
+public:
+ MainFrame();
+
+private:
+ void OnShowShaped(wxCommandEvent& event);
+ void OnShowTransparent(wxCommandEvent& event);
+ void OnShowEffect(wxCommandEvent& event);
+
+ DECLARE_EVENT_TABLE()
+};
+
// Define a new frame type: this is going to the frame showing the
// effect of wxFRAME_SHAPED
class ShapedFrame : public wxFrame
void OnMouseMove(wxMouseEvent& evt);
void OnExit(wxMouseEvent& evt);
void OnPaint(wxPaintEvent& evt);
- void OnWindowCreate(wxWindowCreateEvent& evt);
private:
bool m_hasShape;
// event handlers (these functions should _not_ be virtual)
void OnDoubleClick(wxMouseEvent& evt);
void OnPaint(wxPaintEvent& evt);
- void OnSize(wxSizeEvent& evt);
private:
enum State
DECLARE_EVENT_TABLE()
};
+class EffectFrame : public wxFrame
+{
+public:
+ EffectFrame(wxWindow *parent,
+ wxShowEffect effect,
+ // TODO: add menu command to the main frame to allow changing
+ // these parameters
+ unsigned timeout = 1000)
+ : wxFrame(parent, wxID_ANY,
+ wxString::Format("Frame shown with %s effect",
+ GetEffectName(effect)),
+ wxDefaultPosition, wxSize(450, 300)),
+ m_effect(effect),
+ m_timeout(timeout)
+ {
+ new wxStaticText(this, wxID_ANY,
+ wxString::Format("Effect: %s", GetEffectName(effect)),
+ wxPoint(20, 20));
+ new wxStaticText(this, wxID_ANY,
+ wxString::Format("Timeout: %ums", m_timeout),
+ wxPoint(20, 60));
-// ----------------------------------------------------------------------------
-// event tables and other macros for wxWidgets
-// ----------------------------------------------------------------------------
+ ShowWithEffect(m_effect, m_timeout);
-// the event tables connect the wxWidgets events with the functions (event
-// handlers) which process them. It can be also done at run-time, but for the
-// simple menu events like this the static method is much simpler.
-BEGIN_EVENT_TABLE(ShapedFrame, wxFrame)
- EVT_LEFT_DCLICK(ShapedFrame::OnDoubleClick)
- EVT_LEFT_DOWN(ShapedFrame::OnLeftDown)
- EVT_LEFT_UP(ShapedFrame::OnLeftUp)
- EVT_MOTION(ShapedFrame::OnMouseMove)
- EVT_RIGHT_UP(ShapedFrame::OnExit)
+ Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(EffectFrame::OnClose));
+ }
- EVT_PAINT(ShapedFrame::OnPaint)
+private:
+ static const char *GetEffectName(wxShowEffect effect)
+ {
+ static const char *names[] =
+ {
+ "none",
+ "roll to left",
+ "roll to right",
+ "roll to top",
+ "roll to bottom",
+ "slide to left",
+ "slide to right",
+ "slide to top",
+ "slide to bottom",
+ "fade",
+ "expand",
+ };
+ wxCOMPILE_TIME_ASSERT( WXSIZEOF(names) == wxSHOW_EFFECT_MAX,
+ EffectNamesMismatch );
+
+ return names[effect];
+ }
-#ifdef __WXGTK__
- EVT_WINDOW_CREATE(ShapedFrame::OnWindowCreate)
-#endif
-END_EVENT_TABLE()
+ void OnClose(wxCloseEvent& event)
+ {
+ HideWithEffect(m_effect, m_timeout);
+ event.Skip();
+ }
-// Create a new application object: this macro will allow wxWidgets to create
-// the application object during program execution (it's better than using a
-// static object for many reasons) and also declares the accessor function
-// wxGetApp() which will return the reference of the right type (i.e. MyApp and
-// not wxApp)
-IMPLEMENT_APP(MyApp)
+ wxShowEffect m_effect;
+ unsigned m_timeout;
+};
// ============================================================================
// implementation
// the application class
// ----------------------------------------------------------------------------
+IMPLEMENT_APP(MyApp)
+
// `Main program' equivalent: the program execution "starts" here
bool MyApp::OnInit()
{
wxInitAllImageHandlers();
- // Create the transparent window
- SeeThroughFrame *seeThroughFrame = new SeeThroughFrame();
- seeThroughFrame->Show(true);
- SetTopWindow(seeThroughFrame);
-
- // Create the shaped window
- ShapedFrame *shapedFrame = new ShapedFrame(seeThroughFrame);
- shapedFrame->Show(true);
+ new MainFrame;
// success: wxApp::OnRun() will be called which will enter the main message
// loop and the application will run. If we returned false here, the
return true;
}
+// ----------------------------------------------------------------------------
+// main frame
+// ----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(MainFrame, wxFrame)
+ EVT_MENU(Show_Shaped, MainFrame::OnShowShaped)
+ EVT_MENU(Show_Transparent, MainFrame::OnShowTransparent)
+ EVT_MENU_RANGE(Show_Effect_First, Show_Effect_Last, MainFrame::OnShowEffect)
+END_EVENT_TABLE()
+
+MainFrame::MainFrame()
+ : wxFrame(NULL, wxID_ANY, "wxWidgets Shaped Sample",
+ wxDefaultPosition, wxSize(200, 100))
+{
+ SetIcon(wxICON(sample));
+
+ wxMenuBar * const mbar = new wxMenuBar;
+ wxMenu * const menuFrames = new wxMenu;
+ menuFrames->Append(Show_Shaped, "Show &shaped window\tCtrl-S");
+ menuFrames->Append(Show_Transparent, "Show &transparent window\tCtrl-T");
+ menuFrames->AppendSeparator();
+ menuFrames->Append(Show_Effect_Roll, "Show &rolled effect\tCtrl-R");
+ menuFrames->Append(Show_Effect_Slide, "Show s&lide effect\tCtrl-L");
+ menuFrames->Append(Show_Effect_Blend, "Show &fade effect\tCtrl-F");
+ menuFrames->Append(Show_Effect_Expand, "Show &expand effect\tCtrl-E");
+ menuFrames->AppendSeparator();
+ menuFrames->Append(wxID_EXIT, "E&xit");
+
+ mbar->Append(menuFrames, "&Show");
+ SetMenuBar(mbar);
+
+ Show();
+}
+
+void MainFrame::OnShowShaped(wxCommandEvent& WXUNUSED(event))
+{
+ ShapedFrame *shapedFrame = new ShapedFrame(this);
+ shapedFrame->Show(true);
+}
+
+void MainFrame::OnShowTransparent(wxCommandEvent& WXUNUSED(event))
+{
+ SeeThroughFrame *seeThroughFrame = new SeeThroughFrame();
+ seeThroughFrame->Show(true);
+}
+
+void MainFrame::OnShowEffect(wxCommandEvent& event)
+{
+ int effect = event.GetId();
+ static wxDirection direction = wxLEFT;
+ direction = (wxDirection)(((int)direction)<< 1);
+ if ( direction > wxDOWN )
+ direction = wxLEFT ;
+
+ wxShowEffect eff;
+ switch ( effect )
+ {
+ case Show_Effect_Roll:
+ switch ( direction )
+ {
+ case wxLEFT:
+ eff = wxSHOW_EFFECT_ROLL_TO_LEFT;
+ break;
+ case wxRIGHT:
+ eff = wxSHOW_EFFECT_ROLL_TO_RIGHT;
+ break;
+ case wxTOP:
+ eff = wxSHOW_EFFECT_ROLL_TO_TOP;
+ break;
+ case wxBOTTOM:
+ eff = wxSHOW_EFFECT_ROLL_TO_BOTTOM;
+ break;
+ default:
+ wxFAIL_MSG( "invalid direction" );
+ return;
+ }
+ break;
+ case Show_Effect_Slide:
+ switch ( direction )
+ {
+ case wxLEFT:
+ eff = wxSHOW_EFFECT_SLIDE_TO_LEFT;
+ break;
+ case wxRIGHT:
+ eff = wxSHOW_EFFECT_SLIDE_TO_RIGHT;
+ break;
+ case wxTOP:
+ eff = wxSHOW_EFFECT_SLIDE_TO_TOP;
+ break;
+ case wxBOTTOM:
+ eff = wxSHOW_EFFECT_SLIDE_TO_BOTTOM;
+ break;
+ default:
+ wxFAIL_MSG( "invalid direction" );
+ return;
+ }
+ break;
+
+ case Show_Effect_Blend:
+ eff = wxSHOW_EFFECT_BLEND;
+ break;
+
+ case Show_Effect_Expand:
+ eff = wxSHOW_EFFECT_EXPAND;
+ break;
+
+ default:
+ wxFAIL_MSG( "invalid effect" );
+ return;
+ }
+
+ new EffectFrame(this, eff, 1000);
+}
+
// ----------------------------------------------------------------------------
// shaped frame
// ----------------------------------------------------------------------------
+BEGIN_EVENT_TABLE(ShapedFrame, wxFrame)
+ EVT_LEFT_DCLICK(ShapedFrame::OnDoubleClick)
+ EVT_LEFT_DOWN(ShapedFrame::OnLeftDown)
+ EVT_LEFT_UP(ShapedFrame::OnLeftUp)
+ EVT_MOTION(ShapedFrame::OnMouseMove)
+ EVT_RIGHT_UP(ShapedFrame::OnExit)
+ EVT_PAINT(ShapedFrame::OnPaint)
+END_EVENT_TABLE()
+
+
// frame constructor
ShapedFrame::ShapedFrame(wxFrame *parent)
: wxFrame(parent, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxSize(100, 100), //wxDefaultSize,
+ wxDefaultPosition, wxSize(100, 100),
0
| wxFRAME_SHAPED
| wxSIMPLE_BORDER
)
{
m_hasShape = false;
- m_bmp = wxBitmap(_T("star.png"), wxBITMAP_TYPE_PNG);
+ m_bmp = wxBitmap(wxT("star.png"), wxBITMAP_TYPE_PNG);
SetSize(wxSize(m_bmp.GetWidth(), m_bmp.GetHeight()));
- SetToolTip(wxT("Right-click to exit"));
-
-#ifndef __WXGTK__
- // On wxGTK we can't do this yet because the window hasn't been created
- // yet so we wait until the EVT_WINDOW_CREATE event happens. On wxMSW and
- // wxMac the window has been created at this point so we go ahead and set
- // the shape now.
+ SetToolTip(wxT("Right-click to close"));
SetWindowShape();
-#endif
}
void ShapedFrame::SetWindowShape()
void ShapedFrame::OnLeftDown(wxMouseEvent& evt)
{
CaptureMouse();
- //printf("Mouse captured\n");
wxPoint pos = ClientToScreen(evt.GetPosition());
wxPoint origin = GetPosition();
int dx = pos.x - origin.x;
if (HasCapture())
{
ReleaseMouse();
- //printf("Mouse released\n");
}
}
void ShapedFrame::OnMouseMove(wxMouseEvent& evt)
{
wxPoint pt = evt.GetPosition();
- //printf("x:%d y:%d\n", pt.x, pt.y);
if (evt.Dragging() && evt.LeftIsDown())
{
wxPoint pos = ClientToScreen(pt);
dc.DrawBitmap(m_bmp, 0, 0, true);
}
-void ShapedFrame::OnWindowCreate(wxWindowCreateEvent& WXUNUSED(evt))
-{
- SetWindowShape();
-}
-
// ----------------------------------------------------------------------------
// see-through frame
// ----------------------------------------------------------------------------
-// frame constructor
+BEGIN_EVENT_TABLE(SeeThroughFrame, wxFrame)
+ EVT_LEFT_DCLICK(SeeThroughFrame::OnDoubleClick)
+ EVT_PAINT(SeeThroughFrame::OnPaint)
+END_EVENT_TABLE()
+
SeeThroughFrame::SeeThroughFrame()
: wxFrame(NULL, wxID_ANY, "Transparency test: double click here",
wxPoint(100, 30), wxSize(300, 300),
- wxDEFAULT_FRAME_STYLE | wxSTAY_ON_TOP),
+ wxDEFAULT_FRAME_STYLE |
+ wxFULL_REPAINT_ON_RESIZE |
+ wxSTAY_ON_TOP),
m_currentState(STATE_SEETHROUGH)
{
SetBackgroundColour(wxColour(255, 255, 255, 255));
SetBackgroundStyle(wxBG_STYLE_TRANSPARENT);
}
-// Redraws the whole window on resize
-void SeeThroughFrame::OnSize(wxSizeEvent& WXUNUSED(evt))
-{
- Refresh();
-}
-
// Paints a grid of varying hue and alpha
void SeeThroughFrame::OnPaint(wxPaintEvent& WXUNUSED(evt))
{
Refresh();
}
-BEGIN_EVENT_TABLE(SeeThroughFrame, wxFrame)
- EVT_LEFT_DCLICK(SeeThroughFrame::OnDoubleClick)
- EVT_PAINT(SeeThroughFrame::OnPaint)
- EVT_SIZE(SeeThroughFrame::OnSize)
-END_EVENT_TABLE()
-