Advertisement
AntonioVillanueva

Dibujando en wxWidgets wxPaintDC wxMem Un cuadrado y puntos

Jul 11th, 2018
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.74 KB | None | 0 0
  1. //Dibujandoen wxWidgets con wxPaintDC y desde wxMemoryDC Antonio Villanueva segura
  2. //g++ -Wall -static-libstdc++ -std=c++11 -Wunused-but-set-variable `wx-config --cxxflags` -o hola *.cpp `wx-config --libs`
  3. //Declara la clase aplicacion
  4.  
  5. #include <iostream>
  6. #include "wx/wx.h"
  7. #include <wx/popupwin.h>
  8. #include <wx/menu.h> //menu en el frame
  9. #include <wx/event.h>
  10. #include <wx/pen.h> //lapiz
  11. #include <wx/dcmemory.h>
  12. #include <wx/sizer.h>
  13. #include <wx/button.h>
  14. #include <wx/dc.h>
  15. #include <wx/dcbuffer.h>
  16. //using namespace std;
  17.  
  18. //Declaraciones
  19.  //Cada aplicacion wxWidget define una clase derivada de wxApp
  20. class MiApp:public wxApp
  21. {
  22.     public:
  23.     //Llamado al inicio startup, es como el main en c
  24.     virtual bool OnInit();//main wxWidgets , mas abajo se implementa
  25.    
  26. };
  27.  
  28. //Declaracion de la clase frame principal
  29.  
  30. //----------------------------------------------------------------------
  31.  
  32. class MiFrame:public wxFrame
  33. {
  34.     public:
  35.     //Constructor de la clase
  36.     MiFrame();
  37.    void CreaCuadrado (wxCommandEvent& event);//Crea un cuadrado directo
  38.    void CreaDesdeMem (wxCommandEvent& event);//Dibuja desde ma memoria !!
  39.        // "event handlers" , gestion de evento
  40.    void EnMovimiento (wxMouseEvent& event);//Evento raton ,para pintar ..
  41.  
  42.    
  43.     private:
  44.     wxMenu* m_menu;//Crea menu ..
  45.     wxPanel* Panel1;
  46.     wxPanel* Panel2;
  47.     wxPanel* Panel3;//Crea un wxPanel
  48.     /*Macro para informar a wxWidgets de la gestion de eventos
  49.     *Declara la tabla de eventos en esta clase ,mas abajo
  50.     * la implemento entre BEGIN_ y END_EVENT_TABLE
  51.     */
  52.     DECLARE_EVENT_TABLE()
  53. };
  54.  
  55. //----------------------------------------------------------------------
  56.  
  57. /*Implementacion , MiApp
  58. *Cuando se crea el objeto MiApp se asigna a la variable global wxTheApp
  59. * pero mejor que hacer un CAST emplear el MACRO  DECLARE_APP despues de
  60. * la declaracion de la clase , wxGetApp retorna una ref. al objeto MiApp
  61. */
  62. DECLARE_APP(MiApp)
  63.  
  64. //Macro que Proporciona a wxWidgets los medios de crear el objeto MiApp
  65. IMPLEMENT_APP(MiApp)
  66.  
  67. //----------------------------------------------------------------------
  68.  
  69. //Implementacion OnInit,Inicializa la aplicacion
  70.  
  71. bool MiApp::OnInit()
  72. {
  73.     //Crea la ventana principal , una instancia de nuestra clase MiFrame
  74.     //El titulo lo pasamos al constructor envuelto en el macro wxT
  75.     //macro de conversion de strings y char al tipo apropiado
  76.     MiFrame *frame=new MiFrame();
  77.    
  78.     //Mostrar la ventana
  79.     frame->Show(true);
  80.    
  81.     //Arranca el bucle de eventos
  82.     return true ;//Si false limpia sus estructuras y sale
  83. }
  84.  
  85. //----------------------------------------------------------------------
  86. wxWindowIDRef ID_BUTTON1=wxWindow::NewControlId();
  87. wxWindowIDRef ID_BUTTON2=wxWindow::NewControlId();
  88. //Tabla de eventos para MiFrame DECLARE_EVENT_TABLE() en MiFrame
  89. //Deteccion de los clicks de raton con wxID_ABOUT y wxID_EXIT
  90. //Que se dirigen a MiFrame::OnAbout y OnQuit
  91. BEGIN_EVENT_TABLE ( MiFrame, wxFrame)
  92.     // EVT_MOTION(MiFrame::EnMovimiento) //Evento raton en movimiento
  93.     EVT_BUTTON(ID_BUTTON1,MiFrame::CreaCuadrado)//Evento boton EVT_BUTTON(id, func):
  94.     EVT_BUTTON(ID_BUTTON2,MiFrame::CreaDesdeMem )//Evento boton EVT_BUTTON(id, func):  
  95. END_EVENT_TABLE()
  96.  
  97. //Constructor de MiFrame
  98. MiFrame::MiFrame():wxFrame(NULL,wxID_ANY,"Mi Ventana")
  99. {
  100.  
  101.     //Crea un wxPanel
  102.     Panel1=new wxPanel(this,wxEXPAND);
  103.    
  104.     //Sizer  
  105.     wxBoxSizer* horizontal = new wxBoxSizer(wxHORIZONTAL);//sizer Horizontal
  106.    
  107.     //Anade Sizer al wxPanel
  108.     Panel1->SetSizer(horizontal);
  109.  
  110.     //Crea boton y lo anade al wxSizer horizontal en el wxPanel
  111.     wxButton* boton1=new wxButton(Panel1,ID_BUTTON1,wxT("cuadrado"));
  112.     horizontal->Add(boton1,wxEXPAND);
  113.     //Crea 2 boton y lo anade al wxSizer horizontal en el wxPanel  
  114.     wxButton* boton2=new wxButton(Panel1,ID_BUTTON2,wxT("wxMemory"));
  115.     horizontal->Add(boton2,wxEXPAND);
  116.    
  117.     //Aqui ligamos los eventos del raton en mov. al wxPanel !!!
  118.     Panel1->Bind(wxEVT_MOTION,&MiFrame::EnMovimiento,this);
  119. }
  120.  
  121. void MiFrame::EnMovimiento (wxMouseEvent& event){//Evento raton ...
  122.      // wxMessageBox( wxT("En movimiento !") );
  123.     if (event.Dragging()){//Mueve con boton apretado
  124.         wxClientDC dc(Panel1);//Crea un wxClient sobre MiFrame
  125.         wxPen lapiz(wxT ("RED"),1);//Crea un lapiz rojo 1
  126.         dc.SetPen(lapiz);//wxClient utiliza el lapiz
  127.         dc.DrawPoint(event.GetPosition());//Dibuja un punto desde la posicion del evento
  128.         dc.SetPen(wxNullPen);//anula lapiz del wxClient    
  129.     }  
  130. }
  131.  
  132. void MiFrame::CreaCuadrado (wxCommandEvent& event){
  133.     wxPaintDC dc(Panel1);// wxBufferedPaintDC o wxPaintDC
  134.    
  135.     dc.SetPen(*wxBLACK_PEN);
  136.     dc.SetBrush(*wxRED_BRUSH);
  137.    
  138.     wxSize tamano=GetClientSize();
  139.     //Tamano del rectangulo
  140.     wxCoord ancho=100,alto=50;
  141.    
  142.     //Centrar el rectangulo
  143.     int x=wxMax(0,(tamano.x -ancho)/2);
  144.     int y=wxMax(0,(tamano.y-alto)/2);
  145.    
  146.     //Dibuja el rectangulo
  147.     wxRect rectToDraw(x,y,ancho,alto);
  148.    
  149.     //if (IsExposed(rectToDraw)){//Returns true if the given point or rectangle area has been exposed since the last repaint.
  150.         dc.DrawRectangle(rectToDraw);
  151.     //}
  152.    
  153. }
  154.  
  155. //Dibuja desde ma memoria , no directamente !!!
  156. void MiFrame::CreaDesdeMem (wxCommandEvent& event){
  157.  
  158.     wxMemoryDC memDC;//Dispositivo de memoria
  159.     wxBitmap bitmap(50,50);//wxBitmap  tamano ...
  160.    
  161.     memDC.SelectObject(bitmap);//Seleccionamos el wxBitmap en la memoria
  162.     memDC.SetBackground(*wxLIGHT_GREY_BRUSH);//Color de Fondo
  163.     memDC.Clear();//Limpia
  164.     memDC.SetPen(*wxBLUE_PEN);//Color lapiz
  165.     memDC.SetBrush(*wxTRANSPARENT_BRUSH);
  166.     memDC.DrawRectangle(wxRect(20,20,20,20));//Dibuja un rectangulo
  167.     memDC.SelectObject(wxNullBitmap);//memoria apunta a nada ...
  168.    
  169.     wxPaintDC dc(Panel1);//wxPaintDC Donde vamos a dibujar ...
  170.     dc.DrawBitmap(bitmap,GetClientSize().x/2,GetClientSize().y/2,true);//Vuelvo el wxBitmap anterior   
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement