Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <wx/wx.h>
- #include <wx/sizer.h>
- using namespace std;
- /********************************************************************************/
- /********************D E C L A R A C I O N E S **********************************/
- class wxImagePanel : public wxPanel
- {
- wxImage image;
- wxBitmap resized;
- int w, h;
- public:
- wxImagePanel(wxFrame* parent, wxString file, wxBitmapType format);
- void paintEvent(wxPaintEvent & evt);
- void paintNow();
- void OnSize(wxSizeEvent& event);
- void render(wxDC& dc);
- // algunos eventos habituales
- /*
- void mouseMoved(wxMouseEvent& event);
- void mouseDown(wxMouseEvent& event);
- void mouseWheelMoved(wxMouseEvent& event);
- void mouseReleased(wxMouseEvent& event);
- void rightClick(wxMouseEvent& event);
- void mouseLeftWindow(wxMouseEvent& event);
- void keyPressed(wxKeyEvent& event);
- void keyReleased(wxKeyEvent& event);
- */
- DECLARE_EVENT_TABLE()
- };
- /********************************************************************************/
- BEGIN_EVENT_TABLE(wxImagePanel, wxPanel)
- // algunos eventos habituales
- /*
- EVT_MOTION(wxImagePanel::mouseMoved)
- EVT_LEFT_DOWN(wxImagePanel::mouseDown)
- EVT_LEFT_UP(wxImagePanel::mouseReleased)
- EVT_RIGHT_DOWN(wxImagePanel::rightClick)
- EVT_LEAVE_WINDOW(wxImagePanel::mouseLeftWindow)
- EVT_KEY_DOWN(wxImagePanel::keyPressed)
- EVT_KEY_UP(wxImagePanel::keyReleased)
- EVT_MOUSEWHEEL(wxImagePanel::mouseWheelMoved)
- */
- // captura eventos de dibujo
- EVT_PAINT(wxImagePanel::paintEvent)
- // evento de tamano ,size
- EVT_SIZE(wxImagePanel::OnSize)
- END_EVENT_TABLE()
- // algunos eventos habituales
- /*
- void wxImagePanel::mouseMoved(wxMouseEvent& event) {}
- void wxImagePanel::mouseDown(wxMouseEvent& event) {}
- void wxImagePanel::mouseWheelMoved(wxMouseEvent& event) {}
- void wxImagePanel::mouseReleased(wxMouseEvent& event) {}
- void wxImagePanel::rightClick(wxMouseEvent& event) {}
- void wxImagePanel::mouseLeftWindow(wxMouseEvent& event) {}
- void wxImagePanel::keyPressed(wxKeyEvent& event) {}
- void wxImagePanel::keyReleased(wxKeyEvent& event) {}
- */
- /********************************************************************************/
- wxImagePanel::wxImagePanel(wxFrame* parent, wxString file, wxBitmapType format) :
- wxPanel(parent)
- {
- image.LoadFile(file, format); //Carga el fichero
- if (image.IsOk()){cout<<" OK LOADING IMAGE "<<endl;}//test
- w = -1;
- h = -1;
- }
- /*
- * Llamado por Widgets cuando el panel necesita ser repintado
- * Puede desencadenarse por una llamada de refresco o actualizacion
- * Refresh() o Update()
- */
- /********************************************************************************/
- void wxImagePanel::paintEvent(wxPaintEvent & evt)
- {
- // depending on your system you may need to look at double-buffered dcs
- wxPaintDC dc(this);
- render(dc);
- }
- /********************************************************************************/
- /*
- * Alternativamente puede usar clientDC para pintar en el panel
- * en cualquier momento. Su uso no te libera de capturar los eventos
- * de pintura ,por ejemplo en e movimiento de la ventana
- */
- void wxImagePanel::paintNow()
- {
- //Dependiendo de su sistema puede ser necesario un doble buffer
- wxClientDC dc(this);
- render(dc);
- }
- /********************************************************************************/
- /*
- * Aqui hacemos el render actual , dentro de este metodo
- * puede utilizar diferentess DC wxPaintDC o wxClientDC()
- */
- void wxImagePanel::render(wxDC& dc)
- {
- int neww, newh;
- dc.GetSize( &neww, &newh );
- if( neww != w || newh != h )
- {
- resized = wxBitmap( image.Scale( neww, newh /*, wxIMAGE_QUALITY_HIGH*/ ) );
- w = neww;
- h = newh;
- dc.DrawBitmap( resized, 0, 0, true );
- }else{
- dc.DrawBitmap( resized, 0, 0, true );
- }
- }
- /********************************************************************************/
- /*
- *Aqui llamamos el refreco para decir al panel de dibujarse el mismo
- * Asi cuando el usuario reescala el panel imagen la imagen se reescala tambien
- */
- void wxImagePanel::OnSize(wxSizeEvent& event){
- Refresh();
- //skip the event.
- event.Skip();
- }
- /********************************************************************************/
- /********************************************************************************/
- /********************************************************************************/
- // Uso de este ejemplo
- class MyApp: public wxApp
- {
- wxFrame *frame;
- wxImagePanel * drawPane;
- public:
- bool OnInit()
- {
- // Primero inicializamos todos los Handlers
- wxInitAllImageHandlers();
- wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
- frame = new wxFrame(NULL, wxID_ANY, wxT("Hello wxDC"), wxPoint(50,50), wxSize(800,600));
- // De forma simple ,se crea asi sobre un wxImagePanel
- // drawPane = new wxImagePanel( frame, wxT("./spaceInvaders/37.xpm"), wxBITMAP_TYPE_XPM);
- drawPane = new wxImagePanel( frame, wxT("37.xpm"), wxBITMAP_TYPE_XPM);
- sizer->Add(drawPane, 1, wxEXPAND);
- frame->SetSizer(sizer);
- frame->Show();
- return true;
- }
- };
- IMPLEMENT_APP(MyApp)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement