| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:        shaped.cpp
 
- // Purpose:     Shaped Window sample
 
- // Author:      Robin Dunn
 
- // Modified by:
 
- // Created:     28-Mar-2003
 
- // Copyright:   (c) Robin Dunn
 
- // Licence:     wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- // ============================================================================
 
- // declarations
 
- // ============================================================================
 
- // ----------------------------------------------------------------------------
 
- // headers
 
- // ----------------------------------------------------------------------------
 
- // For compilers that support precompilation, includes "wx/wx.h".
 
- #include "wx/wxprec.h"
 
- #ifdef __BORLANDC__
 
-     #pragma hdrstop
 
- #endif
 
- // for all others, include the necessary headers
 
- #ifndef WX_PRECOMP
 
-     #include "wx/app.h"
 
-     #include "wx/log.h"
 
-     #include "wx/frame.h"
 
-     #include "wx/panel.h"
 
-     #include "wx/stattext.h"
 
-     #include "wx/menu.h"
 
-     #include "wx/layout.h"
 
-     #include "wx/msgdlg.h"
 
-     #include "wx/image.h"
 
- #endif
 
- #include "wx/dcclient.h"
 
- #include "wx/graphics.h"
 
- #include "wx/image.h"
 
- #ifndef wxHAS_IMAGES_IN_RESOURCES
 
-     #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
 
- // ----------------------------------------------------------------------------
 
- // Define a new application type, each program should derive a class from wxApp
 
- class MyApp : public wxApp
 
- {
 
- public:
 
-     // override base class virtuals
 
-     // ----------------------------
 
-     // this one is called on application startup and is a good place for the app
 
-     // initialization (doing it here and not in the ctor allows to have an error
 
-     // return: if OnInit() returns false, the application terminates)
 
-     virtual bool OnInit();
 
- };
 
- // 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);
 
-     void OnExit(wxCommandEvent& event);
 
-     wxDECLARE_EVENT_TABLE();
 
- };
 
- // Define a new frame type: this is going to the frame showing the
 
- // effect of wxFRAME_SHAPED
 
- class ShapedFrame : public wxFrame
 
- {
 
- public:
 
-     // ctor(s)
 
-     ShapedFrame(wxFrame *parent);
 
-     void SetWindowShape();
 
-     // event handlers (these functions should _not_ be virtual)
 
-     void OnDoubleClick(wxMouseEvent& evt);
 
-     void OnLeftDown(wxMouseEvent& evt);
 
-     void OnLeftUp(wxMouseEvent& evt);
 
-     void OnMouseMove(wxMouseEvent& evt);
 
-     void OnExit(wxMouseEvent& evt);
 
-     void OnPaint(wxPaintEvent& evt);
 
- private:
 
-     enum ShapeKind
 
-     {
 
-         Shape_None,
 
-         Shape_Star,
 
- #if wxUSE_GRAPHICS_CONTEXT
 
-         Shape_Circle,
 
- #endif // wxUSE_GRAPHICS_CONTEXT
 
-         Shape_Max
 
-     } m_shapeKind;
 
-     wxBitmap m_bmp;
 
-     wxPoint  m_delta;
 
-     // any class wishing to process wxWidgets events must use this macro
 
-     wxDECLARE_EVENT_TABLE();
 
- };
 
- // Define a new frame type: this is going to the frame showing the
 
- // effect of wxWindow::SetTransparent and of
 
- // wxWindow::SetBackgroundStyle(wxBG_STYLE_TRANSPARENT)
 
- class SeeThroughFrame : public wxFrame
 
- {
 
- public:
 
-     void Create();
 
- private:
 
-     // event handlers (these functions should _not_ be virtual)
 
-     void OnDoubleClick(wxMouseEvent& evt);
 
-     void OnPaint(wxPaintEvent& evt);
 
-     // any class wishing to process wxWidgets events must use this macro
 
-     wxDECLARE_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));
 
-         ShowWithEffect(m_effect, m_timeout);
 
-         Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(EffectFrame::OnClose));
 
-     }
 
- 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];
 
-     }
 
-     void OnClose(wxCloseEvent& event)
 
-     {
 
-         HideWithEffect(m_effect, m_timeout);
 
-         event.Skip();
 
-     }
 
-     wxShowEffect m_effect;
 
-     unsigned m_timeout;
 
- };
 
- // ============================================================================
 
- // implementation
 
- // ============================================================================
 
- // ----------------------------------------------------------------------------
 
- // the application class
 
- // ----------------------------------------------------------------------------
 
- IMPLEMENT_APP(MyApp)
 
- // `Main program' equivalent: the program execution "starts" here
 
- bool MyApp::OnInit()
 
- {
 
-     if ( !wxApp::OnInit() )
 
-         return false;
 
-     wxInitAllImageHandlers();
 
-     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
 
-     // application would exit immediately.
 
-     return true;
 
- }
 
- // ----------------------------------------------------------------------------
 
- // main frame
 
- // ----------------------------------------------------------------------------
 
- wxBEGIN_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)
 
-     EVT_MENU(wxID_EXIT, MainFrame::OnExit)
 
- wxEND_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))
 
- {
 
-     if (IsTransparentBackgroundSupported())
 
-     {
 
-         SeeThroughFrame *seeThroughFrame = new SeeThroughFrame;
 
-         seeThroughFrame->Create();
 
-         seeThroughFrame->Show(true);
 
-     }
 
-     else
 
-         wxMessageBox(wxS("transparent window requires a composited screen"));
 
- }
 
- 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);
 
- }
 
- void MainFrame::OnExit(wxCommandEvent& WXUNUSED(event))
 
- {
 
-     Close();
 
- }
 
- // ----------------------------------------------------------------------------
 
- // shaped frame
 
- // ----------------------------------------------------------------------------
 
- wxBEGIN_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)
 
- wxEND_EVENT_TABLE()
 
- // frame constructor
 
- ShapedFrame::ShapedFrame(wxFrame *parent)
 
-        : wxFrame(parent, wxID_ANY, wxEmptyString,
 
-                   wxDefaultPosition, wxSize(100, 100),
 
-                   0
 
-                   | wxFRAME_SHAPED
 
-                   | wxSIMPLE_BORDER
 
-                   | wxFRAME_NO_TASKBAR
 
-                   | wxSTAY_ON_TOP
 
-             )
 
- {
 
-     m_shapeKind = Shape_Star;
 
-     m_bmp = wxBitmap(wxT("star.png"), wxBITMAP_TYPE_PNG);
 
-     SetSize(wxSize(m_bmp.GetWidth(), m_bmp.GetHeight()));
 
-     SetToolTip(wxT("Right-click to close, double click to cycle shape"));
 
-     SetWindowShape();
 
- }
 
- void ShapedFrame::SetWindowShape()
 
- {
 
-     switch ( m_shapeKind )
 
-     {
 
-         case Shape_None:
 
-             SetShape(wxRegion());
 
-             break;
 
-         case Shape_Star:
 
-             SetShape(wxRegion(m_bmp, *wxWHITE));
 
-             break;
 
- #if wxUSE_GRAPHICS_CONTEXT
 
-         case Shape_Circle:
 
-             {
 
-                 wxGraphicsPath
 
-                     path = wxGraphicsRenderer::GetDefaultRenderer()->CreatePath();
 
-                 path.AddCircle(m_bmp.GetWidth()/2, m_bmp.GetHeight()/2, 30);
 
-                 SetShape(path);
 
-             }
 
-             break;
 
- #endif // wxUSE_GRAPHICS_CONTEXT
 
-         case Shape_Max:
 
-             wxFAIL_MSG( "invalid shape kind" );
 
-             break;
 
-     }
 
- }
 
- void ShapedFrame::OnDoubleClick(wxMouseEvent& WXUNUSED(evt))
 
- {
 
-     m_shapeKind = static_cast<ShapeKind>((m_shapeKind + 1) % Shape_Max);
 
-     SetWindowShape();
 
- }
 
- void ShapedFrame::OnLeftDown(wxMouseEvent& evt)
 
- {
 
-     CaptureMouse();
 
-     wxPoint pos = ClientToScreen(evt.GetPosition());
 
-     wxPoint origin = GetPosition();
 
-     int dx =  pos.x - origin.x;
 
-     int dy = pos.y - origin.y;
 
-     m_delta = wxPoint(dx, dy);
 
- }
 
- void ShapedFrame::OnLeftUp(wxMouseEvent& WXUNUSED(evt))
 
- {
 
-     if (HasCapture())
 
-     {
 
-         ReleaseMouse();
 
-     }
 
- }
 
- void ShapedFrame::OnMouseMove(wxMouseEvent& evt)
 
- {
 
-     wxPoint pt = evt.GetPosition();
 
-     if (evt.Dragging() && evt.LeftIsDown())
 
-     {
 
-         wxPoint pos = ClientToScreen(pt);
 
-         Move(wxPoint(pos.x - m_delta.x, pos.y - m_delta.y));
 
-     }
 
- }
 
- void ShapedFrame::OnExit(wxMouseEvent& WXUNUSED(evt))
 
- {
 
-     Close();
 
- }
 
- void ShapedFrame::OnPaint(wxPaintEvent& WXUNUSED(evt))
 
- {
 
-     wxPaintDC dc(this);
 
-     dc.DrawBitmap(m_bmp, 0, 0, true);
 
- }
 
- // ----------------------------------------------------------------------------
 
- // see-through frame
 
- // ----------------------------------------------------------------------------
 
- wxBEGIN_EVENT_TABLE(SeeThroughFrame, wxFrame)
 
-     EVT_LEFT_DCLICK(SeeThroughFrame::OnDoubleClick)
 
-     EVT_PAINT(SeeThroughFrame::OnPaint)
 
- wxEND_EVENT_TABLE()
 
- void SeeThroughFrame::Create()
 
- {
 
-     SetBackgroundStyle(wxBG_STYLE_TRANSPARENT);
 
-     wxFrame::Create(NULL, wxID_ANY, "Transparency test: double click here",
 
-            wxPoint(100, 30), wxSize(300, 300),
 
-            wxDEFAULT_FRAME_STYLE |
 
-            wxFULL_REPAINT_ON_RESIZE |
 
-            wxSTAY_ON_TOP);
 
-     SetBackgroundColour(*wxWHITE);
 
- }
 
- // Paints a grid of varying hue and alpha
 
- void SeeThroughFrame::OnPaint(wxPaintEvent& WXUNUSED(evt))
 
- {
 
-     wxPaintDC dc(this);
 
-     dc.SetPen(wxNullPen);
 
-     int xcount = 8;
 
-     int ycount = 8;
 
-     float xstep = 1. / xcount;
 
-     float ystep = 1. / ycount;
 
-     int width = GetClientSize().GetWidth();
 
-     int height = GetClientSize().GetHeight();
 
-     for ( float x = 0.; x < 1.; x += xstep )
 
-     {
 
-         for ( float y = 0.; y < 1.; y += ystep )
 
-         {
 
-             wxImage::RGBValue v = wxImage::HSVtoRGB(wxImage::HSVValue(x, 1., 1.));
 
-             dc.SetBrush(wxBrush(wxColour(v.red, v.green, v.blue,
 
-                                 (int)(255*(1. - y)))));
 
-             int x1 = (int)(x * width);
 
-             int y1 = (int)(y * height);
 
-             int x2 = (int)((x + xstep) * width);
 
-             int y2 = (int)((y + ystep) * height);
 
-             dc.DrawRectangle(x1, y1, x2 - x1, y2 - y1);
 
-         }
 
-     }
 
- }
 
- void SeeThroughFrame::OnDoubleClick(wxMouseEvent& WXUNUSED(evt))
 
- {
 
-     SetBackgroundStyle(wxBG_STYLE_PAINT);
 
-     SetTransparent(255);
 
-     SetTitle("Opaque");
 
-     Refresh();
 
- }
 
 
  |