Corrected some precompiled header issues for dynsash samples Corrected IMPLEMENT_ABSTRACT_CLASS in multicell.cpp Added an event function typedef and used it in dynsash sample git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14475 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			234 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        dynsash_switch.cpp
 | |
| // Purpose:     Test custom scrollbar handling of wxDynamicSashWindow by
 | |
| //              creating a dynamic sash window where the client scrolls a
 | |
| //              a subwindow of the client window by responding to scroll
 | |
| //              events itself
 | |
| // Author:      Matt Kimball
 | |
| // Modified by:
 | |
| // Created:     7/15/2001
 | |
| // RCS-ID:      $Id$
 | |
| // Copyright:   (c) 2001 Matt Kimball
 | |
| // Licence:     wxWindows licence
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| // 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 (this file is usually all you
 | |
| // need because it includes almost all "standard" wxWindows headers)
 | |
| #ifndef WX_PRECOMP
 | |
|     #include "wx/wx.h"
 | |
| #endif
 | |
| 
 | |
| #include <wx/app.h>
 | |
| #include <wx/frame.h>
 | |
| #include <wx/choice.h>
 | |
| #include <wx/dcclient.h>
 | |
| #include <wx/gizmos/dynamicsash.h>
 | |
| #include <wx/layout.h>
 | |
| #include <wx/scrolbar.h>
 | |
| 
 | |
| class SwitchDemo : public wxApp {
 | |
| public:
 | |
|     bool OnInit();
 | |
| };
 | |
| 
 | |
| 
 | |
| class SwitchView : public wxWindow {
 | |
| public:
 | |
|     SwitchView(wxDynamicSashWindow *parent);
 | |
| 
 | |
|     wxSize DoGetBestSize() const;
 | |
| 
 | |
| private:
 | |
|     void OnSize(wxSizeEvent& event);
 | |
|     void OnPaint(wxPaintEvent& event);
 | |
|     void OnChoice(wxCommandEvent& event);
 | |
|     void OnScroll(wxScrollEvent& event);
 | |
|     void OnFocus(wxFocusEvent& event);
 | |
|     void OnErase(wxEraseEvent& event);
 | |
|     void OnSplit(wxDynamicSashSplitEvent& event);
 | |
|     void OnUnify(wxDynamicSashUnifyEvent& event);
 | |
| 
 | |
|     wxDynamicSashWindow *m_dyn_sash;
 | |
|     wxWindow *m_bar;
 | |
|     wxChoice *m_choice;
 | |
|     wxWindow *m_view;
 | |
| };
 | |
| 
 | |
| IMPLEMENT_APP(SwitchDemo)
 | |
| 
 | |
| 
 | |
| SwitchView::SwitchView(wxDynamicSashWindow *win) {
 | |
|     Create(win, -1);
 | |
| 
 | |
|     m_dyn_sash = win;
 | |
| 
 | |
|     m_bar = new wxWindow(this, -1, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER, "bar");
 | |
|     m_choice = new wxChoice(m_bar, -1);
 | |
|     m_choice->SetEventHandler(this);
 | |
|     m_view = new wxWindow(this, -1, wxDefaultPosition, wxDefaultSize, 0, "view");
 | |
|     m_view->SetBackgroundColour(*wxWHITE);
 | |
|     m_view->SetEventHandler(this);
 | |
| 
 | |
|     m_choice->Append("Triangle");
 | |
|     m_choice->Append("Square");
 | |
|     m_choice->SetSelection(0);
 | |
| 
 | |
|     wxLayoutConstraints *layout;
 | |
| 
 | |
|     layout = new wxLayoutConstraints();
 | |
|     layout->left.Absolute(0);
 | |
|     layout->top.Absolute(0);
 | |
|     layout->height.Absolute(36);
 | |
|     layout->width.SameAs(this, wxWidth);
 | |
|     m_bar->SetConstraints(layout);
 | |
| 
 | |
|     layout = new wxLayoutConstraints();
 | |
|     layout->left.Absolute(3);
 | |
|     layout->width.AsIs();
 | |
|     layout->height.AsIs();
 | |
|     layout->top.Absolute(3);
 | |
|     m_choice->SetConstraints(layout);
 | |
| 
 | |
|     layout = new wxLayoutConstraints();
 | |
|     layout->left.Absolute(0);
 | |
|     layout->width.SameAs(this, wxWidth);
 | |
|     layout->top.Below(m_bar);
 | |
|     layout->bottom.SameAs(this, wxBottom);
 | |
|     m_view->SetConstraints(layout);
 | |
| 
 | |
|     wxScrollBar *hscroll = m_dyn_sash->GetHScrollBar(this);
 | |
|     wxScrollBar *vscroll = m_dyn_sash->GetVScrollBar(this);
 | |
| 
 | |
|     hscroll->SetEventHandler(this);
 | |
|     vscroll->SetEventHandler(this);
 | |
| 
 | |
|     Connect(GetId(), wxEVT_SIZE, (wxObjectEventFunction)&SwitchView::OnSize);
 | |
|     Connect(m_choice->GetId(), wxEVT_COMMAND_CHOICE_SELECTED, (wxObjectEventFunction)&SwitchView::OnChoice);
 | |
|     Connect(m_view->GetId(), wxEVT_PAINT, (wxObjectEventFunction)&SwitchView::OnPaint);
 | |
| 
 | |
|     Connect(-1, wxEVT_SET_FOCUS, (wxObjectEventFunction)&SwitchView::OnFocus);
 | |
|     Connect(-1, wxEVT_SCROLL_TOP, (wxObjectEventFunction)&SwitchView::OnScroll);
 | |
|     Connect(-1, wxEVT_SCROLL_BOTTOM, (wxObjectEventFunction)&SwitchView::OnScroll);
 | |
|     Connect(-1, wxEVT_SCROLL_LINEUP, (wxObjectEventFunction)&SwitchView::OnScroll);
 | |
|     Connect(-1, wxEVT_SCROLL_LINEDOWN, (wxObjectEventFunction)&SwitchView::OnScroll);
 | |
|     Connect(-1, wxEVT_SCROLL_PAGEUP, (wxObjectEventFunction)&SwitchView::OnScroll);
 | |
|     Connect(-1, wxEVT_SCROLL_PAGEDOWN, (wxObjectEventFunction)&SwitchView::OnScroll);
 | |
|     Connect(-1, wxEVT_SCROLL_THUMBTRACK, (wxObjectEventFunction)&SwitchView::OnScroll);
 | |
|     Connect(-1, wxEVT_SCROLL_THUMBRELEASE, (wxObjectEventFunction)&SwitchView::OnScroll);
 | |
|     Connect(-1, wxEVT_ERASE_BACKGROUND, (wxObjectEventFunction)&SwitchView::OnErase);
 | |
| 
 | |
|     Connect(-1, wxEVT_DYNAMIC_SASH_SPLIT, (wxObjectEventFunction)&SwitchView::OnSplit);
 | |
|     Connect(-1, wxEVT_DYNAMIC_SASH_UNIFY, (wxObjectEventFunction)&SwitchView::OnUnify);
 | |
| }
 | |
| 
 | |
| wxSize SwitchView::DoGetBestSize() const {
 | |
|     return wxSize(64, 64);
 | |
| }
 | |
| 
 | |
| void SwitchView::OnSize(wxSizeEvent& event) {
 | |
|     Layout();
 | |
| 
 | |
|     wxScrollBar *hscroll = m_dyn_sash->GetHScrollBar(this);
 | |
|     wxScrollBar *vscroll = m_dyn_sash->GetVScrollBar(this);
 | |
| 
 | |
|     if (hscroll && vscroll) {
 | |
|         int hpos = hscroll->GetThumbPosition();
 | |
|         int vpos = vscroll->GetThumbPosition();
 | |
| 
 | |
|         wxSize size = m_view->GetSize();
 | |
|         if (hpos + size.GetWidth() > 300)
 | |
|             hpos = 300 - size.GetWidth();
 | |
|         if (vpos + size.GetHeight() > 300)
 | |
|             vpos = 300 - size.GetHeight();
 | |
| 
 | |
|         hscroll->SetScrollbar(hpos, size.GetWidth(), 300, size.GetWidth());
 | |
|         vscroll->SetScrollbar(vpos, size.GetHeight(), 300, size.GetHeight());
 | |
|     }
 | |
| }
 | |
| 
 | |
| void SwitchView::OnPaint(wxPaintEvent& event) {
 | |
|     wxPaintDC dc(m_view);
 | |
| 
 | |
|     wxScrollBar *hscroll = m_dyn_sash->GetHScrollBar(this);
 | |
|     wxScrollBar *vscroll = m_dyn_sash->GetVScrollBar(this);
 | |
| 
 | |
|     dc.Clear();
 | |
|     dc.SetDeviceOrigin(-hscroll->GetThumbPosition(), -vscroll->GetThumbPosition());
 | |
| 
 | |
|     if (m_choice->GetSelection()) {
 | |
|         dc.DrawLine(20, 20, 280, 20);
 | |
|         dc.DrawLine(280, 20, 280, 280);
 | |
|         dc.DrawLine(280, 280, 20, 280);
 | |
|         dc.DrawLine(20, 280, 20, 20);
 | |
|     } else {
 | |
|         dc.DrawLine(150, 20, 280, 280);
 | |
|         dc.DrawLine(280, 280, 20, 280);
 | |
|         dc.DrawLine(20, 280, 150, 20);
 | |
|     }
 | |
| }
 | |
| 
 | |
| void SwitchView::OnErase(wxEraseEvent& event) {
 | |
|     // Do nothing
 | |
| }
 | |
| 
 | |
| void SwitchView::OnSplit(wxDynamicSashSplitEvent& event) {
 | |
|     SwitchView *view = new SwitchView(m_dyn_sash);
 | |
|     view->m_choice->SetSelection(m_choice->GetSelection());
 | |
| 
 | |
|     wxScrollBar *hscroll = m_dyn_sash->GetHScrollBar(this);
 | |
|     wxScrollBar *vscroll = m_dyn_sash->GetVScrollBar(this);
 | |
| 
 | |
|     hscroll->SetEventHandler(this);
 | |
|     vscroll->SetEventHandler(this);
 | |
| }
 | |
| 
 | |
| void SwitchView::OnUnify(wxDynamicSashUnifyEvent& event) {
 | |
|     wxScrollBar *hscroll = m_dyn_sash->GetHScrollBar(this);
 | |
|     wxScrollBar *vscroll = m_dyn_sash->GetVScrollBar(this);
 | |
| 
 | |
|     hscroll->SetEventHandler(this);
 | |
|     vscroll->SetEventHandler(this);
 | |
| }
 | |
| 
 | |
| void SwitchView::OnChoice(wxCommandEvent& event) {
 | |
|     m_view->Refresh();
 | |
| }
 | |
| 
 | |
| void SwitchView::OnScroll(wxScrollEvent& event) {
 | |
|     m_view->Refresh();
 | |
| }
 | |
| 
 | |
| void SwitchView::OnFocus(wxFocusEvent& event) {
 | |
|     wxScrollBar *hscroll = m_dyn_sash->GetHScrollBar(this);
 | |
|     wxScrollBar *vscroll = m_dyn_sash->GetVScrollBar(this);
 | |
| 
 | |
|     if (event.m_eventObject == hscroll || event.m_eventObject == vscroll) {
 | |
|         m_view->SetFocus();
 | |
|     } else {
 | |
|         event.Skip();
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| bool SwitchDemo::OnInit() {
 | |
|     wxFrame *frame;
 | |
|     wxDynamicSashWindow *dyn;
 | |
| 
 | |
|     frame = new wxFrame(NULL, -1, "Dynamic Sash Window Switch Demo");
 | |
|     dyn = new wxDynamicSashWindow(frame, -1, wxDefaultPosition, wxDefaultSize, wxCLIP_CHILDREN);
 | |
|     new SwitchView(dyn);
 | |
| 
 | |
|     frame->SetSize(480, 480);
 | |
|     frame->Show();
 | |
| 
 | |
|     return TRUE;
 | |
| }
 |