Advertisement
AntonioVillanueva

wxWidget resize un xpm cargando externo

Oct 4th, 2018
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.29 KB | None | 0 0
  1. #include <wx/wx.h>
  2. #include <wx/sizer.h>
  3. using namespace std;
  4. /********************************************************************************/
  5. /********************D E C L A R A C I O N E S **********************************/
  6.  
  7. class wxImagePanel : public wxPanel
  8. {
  9.     wxImage image;
  10.     wxBitmap resized;
  11.     int w, h;
  12.  
  13. public:
  14.     wxImagePanel(wxFrame* parent, wxString file, wxBitmapType format);
  15.  
  16.     void paintEvent(wxPaintEvent & evt);
  17.     void paintNow();
  18.     void OnSize(wxSizeEvent& event);
  19.     void render(wxDC& dc);
  20.  
  21.     // algunos eventos habituales
  22.     /*
  23.      void mouseMoved(wxMouseEvent& event);
  24.      void mouseDown(wxMouseEvent& event);
  25.      void mouseWheelMoved(wxMouseEvent& event);
  26.      void mouseReleased(wxMouseEvent& event);
  27.      void rightClick(wxMouseEvent& event);
  28.      void mouseLeftWindow(wxMouseEvent& event);
  29.      void keyPressed(wxKeyEvent& event);
  30.      void keyReleased(wxKeyEvent& event);
  31.      */
  32.  
  33.     DECLARE_EVENT_TABLE()
  34. };
  35.  
  36.  /********************************************************************************/
  37.  
  38. BEGIN_EVENT_TABLE(wxImagePanel, wxPanel)
  39. // algunos eventos habituales
  40. /*
  41.  EVT_MOTION(wxImagePanel::mouseMoved)
  42.  EVT_LEFT_DOWN(wxImagePanel::mouseDown)
  43.  EVT_LEFT_UP(wxImagePanel::mouseReleased)
  44.  EVT_RIGHT_DOWN(wxImagePanel::rightClick)
  45.  EVT_LEAVE_WINDOW(wxImagePanel::mouseLeftWindow)
  46.  EVT_KEY_DOWN(wxImagePanel::keyPressed)
  47.  EVT_KEY_UP(wxImagePanel::keyReleased)
  48.  EVT_MOUSEWHEEL(wxImagePanel::mouseWheelMoved)
  49.  */
  50.  
  51. // captura eventos de dibujo
  52. EVT_PAINT(wxImagePanel::paintEvent)
  53. // evento de tamano ,size
  54. EVT_SIZE(wxImagePanel::OnSize)
  55. END_EVENT_TABLE()
  56.  
  57. // algunos eventos habituales
  58. /*
  59.  void wxImagePanel::mouseMoved(wxMouseEvent& event) {}
  60.  void wxImagePanel::mouseDown(wxMouseEvent& event) {}
  61.  void wxImagePanel::mouseWheelMoved(wxMouseEvent& event) {}
  62.  void wxImagePanel::mouseReleased(wxMouseEvent& event) {}
  63.  void wxImagePanel::rightClick(wxMouseEvent& event) {}
  64.  void wxImagePanel::mouseLeftWindow(wxMouseEvent& event) {}
  65.  void wxImagePanel::keyPressed(wxKeyEvent& event) {}
  66.  void wxImagePanel::keyReleased(wxKeyEvent& event) {}
  67.  */
  68. /********************************************************************************/
  69.  
  70. wxImagePanel::wxImagePanel(wxFrame* parent, wxString file, wxBitmapType format) :
  71. wxPanel(parent)
  72. {
  73.     image.LoadFile(file, format);   //Carga el fichero
  74.  
  75.     if (image.IsOk()){cout<<" OK LOADING IMAGE "<<endl;}//test
  76.     w = -1;
  77.     h = -1;
  78. }
  79.  
  80.  /*
  81.   * Llamado por Widgets cuando el panel necesita ser repintado
  82.   * Puede desencadenarse por una llamada de refresco o actualizacion
  83.   * Refresh() o Update()
  84.   */
  85.  
  86. /********************************************************************************/
  87. void wxImagePanel::paintEvent(wxPaintEvent & evt)
  88. {
  89.     // depending on your system you may need to look at double-buffered dcs
  90.     wxPaintDC dc(this);
  91.     render(dc);
  92. }
  93.  
  94. /********************************************************************************/
  95. /*
  96.  * Alternativamente puede usar clientDC para pintar en el panel
  97.  * en cualquier momento. Su uso no te libera de capturar los eventos
  98.  * de pintura ,por ejemplo en e movimiento de la ventana
  99.  */
  100. void wxImagePanel::paintNow()
  101. {
  102.     //Dependiendo de su sistema puede ser necesario un doble buffer
  103.     wxClientDC dc(this);
  104.     render(dc);
  105. }
  106.  
  107. /********************************************************************************/  
  108.  /*
  109.   * Aqui hacemos el render actual , dentro de este metodo
  110.   * puede utilizar diferentess DC wxPaintDC o wxClientDC()
  111.   */
  112. void wxImagePanel::render(wxDC&  dc)
  113. {
  114.  
  115.     int neww, newh;
  116.     dc.GetSize( &neww, &newh );
  117.  
  118.     if( neww != w || newh != h )
  119.     {
  120.        resized = wxBitmap( image.Scale( neww, newh /*, wxIMAGE_QUALITY_HIGH*/ ) );
  121.  
  122.         w = neww;
  123.         h = newh;
  124.         dc.DrawBitmap( resized, 0, 0, true );
  125.     }else{
  126.         dc.DrawBitmap( resized, 0, 0, true );
  127.     }
  128.    
  129.  
  130. }
  131.  
  132. /********************************************************************************/
  133.  /*
  134.   *Aqui llamamos el refreco para decir al panel de dibujarse el mismo
  135.   * Asi cuando el usuario reescala el panel imagen la imagen se reescala tambien
  136.   */
  137.  
  138. void wxImagePanel::OnSize(wxSizeEvent& event){
  139.     Refresh();
  140.     //skip the event.
  141.     event.Skip();
  142. }
  143.  
  144. /********************************************************************************/
  145. /********************************************************************************/
  146. /********************************************************************************/
  147. // Uso de este ejemplo
  148. class MyApp: public wxApp
  149. {
  150.  
  151.     wxFrame *frame;
  152.     wxImagePanel * drawPane;
  153. public:
  154.     bool OnInit()
  155.     {
  156.         // Primero inicializamos todos los Handlers
  157.         wxInitAllImageHandlers();
  158.  
  159.         wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
  160.         frame = new wxFrame(NULL, wxID_ANY, wxT("Hello wxDC"), wxPoint(50,50), wxSize(800,600));
  161.  
  162.         // De forma simple ,se crea asi sobre un wxImagePanel
  163. //        drawPane = new wxImagePanel( frame, wxT("./spaceInvaders/37.xpm"), wxBITMAP_TYPE_XPM);
  164.         drawPane = new wxImagePanel( frame, wxT("37.xpm"), wxBITMAP_TYPE_XPM);
  165.         sizer->Add(drawPane, 1, wxEXPAND);
  166.  
  167.         frame->SetSizer(sizer);
  168.  
  169.         frame->Show();
  170.         return true;
  171.     }
  172.  
  173. };
  174.  
  175. IMPLEMENT_APP(MyApp)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement