рдЧреНрд▓реЗрдб рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ GTK + / gtkmm рдПрдкреНрд▓реАрдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг

рдпрд╣ рдкреЛрд╕реНрдЯ "рдЧреНрд▓реЗрдб рдПрдиреНрд╡рд╛рдпрд░рдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреАрдЯреАрдХреЗ + рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛" рд▓реЗрдЦ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдФрд░ рдЙрди рд╢рдмреНрджреЛрдВ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ, рдЬрд┐рдирдХрд╛ рдЙрджрд╛рд╣рд░рдг C ++ рдореЗрдВ рд╣реЛрдЧрд╛, рддреЛ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╕рдиреНрди рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рд╕рдордп рдореИрдВ Glade рдФрд░ gtkmm рдХреЗ рдмреАрдЪ рдХреЗ рд▓рд┐рдВрдХ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ - GTK + рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдореЗрд░реА рдирд┐рд░рд╛рд╢рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд▓реЗрдЦрдХ, рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд╕реА рдХреЛрдб рдЬреАрдЯреАрдХреЗ + рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ ".cpp" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ C ++ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╣рд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВрдиреЗ рдЙрд╕ рд▓реЗрдЦ рд╕реЗ C ++ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдкрд░рд┐рдгрд╛рдо рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рд╣реИред

рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдЬреАрдЯреАрдХреЗ + рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рднреА рдореБрдЭреЗ рджреЛрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП, рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдореВрд▓ рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА рдкрдврд╝реЗрдВред

рдШрдЯрдХ рд╕реНрдерд╛рдкрдирд╛


C ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ gtkmm рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ GTK + рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИред рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рд╕реНрд╡рдпрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЦреАрдВрдЪ рд▓реЗрдЧрд╛, рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рднреА рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреИрд░рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЬреЛ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдХреИрд░реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (2D рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди) рдХреЗ рд▓рд┐рдП рдПрдХ C ++ рдЖрд╡рд░рдг рд╣реИред рдбреЗрдмрд┐рдпрди рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
sudo apt-get install libgtkmm-2.4-dev 

рдЖрдкрдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╕реНрд░реЛрдд рдХреЛрдб


рдиреАрдЪреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рд▓реЗрдХрд┐рди C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдореИрдВ рдХреЛрдб рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред

 #include <gtkmm.h> #include <cairomm/cairomm.h> /** Main window class. */ class MainWindow: public Gtk::Window { private: /** Subclass for drawing area. */ class CDrawingArea: public Gtk::DrawingArea { public: typedef enum { SHAPE_RECTANGLE, SHAPE_ELLIPSE, SHAPE_TRIANGLE } shape_t; private: shape_t _curShape = SHAPE_RECTANGLE; /** Drawing event handler. */ virtual bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) { switch (_curShape) { case SHAPE_RECTANGLE: cr->rectangle(20, 20, 200, 100); cr->set_source_rgb(0, 0.8, 0); cr->fill_preserve(); break; case SHAPE_ELLIPSE: cr->arc(150, 100, 90, 0, 2 * 3.14); cr->set_source_rgb(0.8, 0, 0); cr->fill_preserve(); break; case SHAPE_TRIANGLE: cr->move_to(40, 40); cr->line_to(200, 40); cr->line_to(120, 160); cr->line_to(40, 40); cr->set_source_rgb(0.8, 0, 0.8); cr->fill_preserve(); cr->set_line_cap(Cairo::LINE_CAP_ROUND); cr->set_line_join(Cairo::LINE_JOIN_ROUND); break; } cr->set_line_width(3); cr->set_source_rgb(0, 0, 0); cr->stroke(); return true; } public: CDrawingArea(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder): Gtk::DrawingArea(cobject) { } void SetShape(shape_t shape) { if (_curShape != shape) { _curShape = shape; /* Request re-drawing. */ queue_draw(); } } }; Glib::RefPtr<Gtk::Builder> _builder; Gtk::RadioButton *_rbRect, *_rbEllipse, *_rbTriangle; CDrawingArea *_drawingArea; public: /** Signal handler which is called when any radio button is clicked. */ void OnRadiobuttonClick() { if (_rbRect->get_active()) { _drawingArea->SetShape(CDrawingArea::SHAPE_RECTANGLE); } else if (_rbEllipse->get_active()) { _drawingArea->SetShape(CDrawingArea::SHAPE_ELLIPSE); } else if (_rbTriangle->get_active()) { _drawingArea->SetShape(CDrawingArea::SHAPE_TRIANGLE); } } /** "quit" action handler. */ void OnQuit() { hide(); } MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder): Gtk::Window(cobject), _builder(builder) { /* Retrieve all widgets. */ _builder->get_widget("rbRectangle", _rbRect); _builder->get_widget("rbEllipse", _rbEllipse); _builder->get_widget("rbTriangle", _rbTriangle); _builder->get_widget_derived("drawing_area", _drawingArea); /* Connect signals. */ _rbRect->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::OnRadiobuttonClick)); _rbEllipse->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::OnRadiobuttonClick)); _rbTriangle->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::OnRadiobuttonClick)); /* Actions. */ Glib::RefPtr<Gtk::Action>::cast_dynamic(_builder->get_object("action_quit"))-> signal_activate().connect(sigc::mem_fun(*this, &MainWindow::OnQuit)); } }; int main(int argc, char **argv) { Gtk::Main app(argc, argv); Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("sample.glade"); MainWindow *mainWindow = 0; builder->get_widget_derived("main_wnd", mainWindow); app.run(*mainWindow); delete mainWindow; return 0; } 


рдпрд╣ рд╕рднреА "Gtk :: рдореБрдЦреНрдп" рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдХрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЖрд░рдВрдн рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдмрд┐рд▓реНрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЧреНрд▓реЗрдб рдПрдбрд┐рдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЖрд░рдореНрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред
 Gtk::Main app(argc, argv); Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("sample.glade"); 

Glib :: RefPtr рд╡рд░реНрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ glibmm рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ - рдирд┐рдореНрди рд╕реНрддрд░ рдХреА рдЧреНрд▓рд┐рдм рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрд╕рдкрд╛рд╕ C ++ рд░реИрдкрд░ред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреЙрдЗрдВрдЯрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

 class MainWindow: public Gtk::Window 

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ gtkmm - "Gtk :: Window" рдореЗрдВ рдорд╛рдирдХ рд╡рд┐рдВрдбреЛ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рд╕рдмрдХреНрд▓рд╛рд╕рд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 MainWindow *mainWindow = 0; builder->get_widget_derived("main_wnd", mainWindow); 


рдпрд╣рд╛рдВ рд╣рдо рдмрд┐рд▓реНрдбрд░ рдореЗрдВ рдЗрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред рд╕рдмрдХреНрд▓рд╛рд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, get_widget_derived рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рдорд╛рдирдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ "Gtk :: Window" рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рддреЛ рдмрд┐рд▓реНрдбрд░ рдХреЗ get_widget рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 app.run(*mainWindow); delete mainWindow; 

рд░рди рд╡рд┐рдзрд┐ рд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рддрд░реНрдХ рд▓реЗрддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рдЫрд┐рдкреЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдирд┐рдпрдВрддреНрд░рдг рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐, рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рд╡рд┐рдЧреЗрдЯреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдПрдореНрдмреЗрдбреЗрдб рд╡рд┐рдЬреЗрдЯреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реА рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рд╡рд┐рдЬреЗрдЯреНрд╕ рдкрд░, рдЬреЛ рдиреАрдЪреЗ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧреА)ред

рдЕрдм рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреНрд▓рд╛рд╕ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рд╕рднреА рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реЛрддрд╛ рд╣реИ:
 MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder): Gtk::Window(cobject), _builder(builder) 

рдкрд╣рд▓рд╛ рддрд░реНрдХ рдореВрд▓ GTK + рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ - рдкреНрд░рдХрд╛рд░ "BaseObjectType" рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рднреА gtkmm рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ GtkWindow рд╣реЛрдЧрд╛)ред рдЗрд╕реЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рджреВрд╕рд░рд╛ рддрд░реНрдХ рдмрд┐рд▓реНрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдПрдореНрдмреЗрдбреЗрдб рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдиреАрдЪреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 _builder->get_widget("rbRectangle", _rbRect); _builder->get_widget("rbEllipse", _rbEllipse); _builder->get_widget("rbTriangle", _rbTriangle); _builder->get_widget_derived("drawing_area", _drawingArea); 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░реЗрдбрд┐рдпреЛрдмреВрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдШрдЯрдирд╛ рдХреЗ рд╕рдВрдХреЗрдд рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ "рдСрдирд░реЗрдбрд┐рдУрдмрдЯрди рдХреНрд▓реАрдХ" рд╡рд┐рдзрд┐ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВ:
 _rbRect->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::OnRadiobuttonClick)); _rbEllipse->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::OnRadiobuttonClick)); _rbTriangle->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::OnRadiobuttonClick)); 

Sigc ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ sigc :: mem_fun рдкрджреНрдзрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЬреЛ рдХрд┐ gtkmm рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдврд╛рдВрдЪрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдирдХрд╛рд░ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрдЧ рдХрд╛ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк sigc :: ptr_fun рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рд┐рдЧреНрдирд▓ рдмрд╛рдБрдзрдиреЗ рдХреА рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдмрдХреНрд▓рд╛рд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд░реЗрдбрд┐рдпреЛрдмреВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреАрди-рдХрд╣рд╛рдиреА рд╕рдВрд░рдЪрдирд╛ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рдСрдирдХреНрдпреВрдЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдпрдг рд╕рдВрдХреЗрдд рд╕рдВрд▓рдЧреНрди рдХрд░рддреА рд╣реИ:
 Glib::RefPtr<Gtk::Action>::cast_dynamic(_builder->get_object("action_quit"))-> signal_activate().connect(sigc::mem_fun(*this, &MainWindow::OnQuit)); 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреНрд▓реЗрдб рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХреНрд╢рди_рдХреНрд╡рд┐рдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореБрдЦреНрдп рдореЗрдиреВ рдореЗрдВ рдХреНрд╡рд┐рдЯ рддрддреНрд╡ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ, рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрд╖рдг рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░реВрдВрдЧрд╛ред рдЬреАрдЯреАрдХреЗ + рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдкрд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп - рдореЗрдиреВ рдЖрдЗрдЯрдо, рдЯреВрд▓рдмрд╛рд░ рдмрдЯрди, рдЧрд░реНрдо рдХреБрдВрдЬреАред рдПрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдиреЗ рдмрд╛рд╣рд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдиреВ рдФрд░ рдЯреВрд▓рдмрд╛рд░ рдореЗрдВ) - рд▓реЗрдмрд▓, рдЖрдЗрдХрди, рдЯреВрд▓рдЯрд┐рдк рдкрд╛рдаред Gtkmm рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╡рд░реНрдЧ "Gtk :: Action" рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдмрд┐рд▓реНрдбрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ get_object рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдЧреНрд▓рд┐рдм :: рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЧреНрд▓рд┐рдм :: RefPtr рд╡рд░реНрдЧ рдХреА рдХрд╛рд╕реНрдЯ_рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред OnQuit рд╡рд┐рдзрд┐ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
 void OnQuit() { hide(); } 

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, "рдореБрдЦреНрдп" рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ "рд░рди" рд╡рд┐рдзрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХреА рдЧрдИ рдЦрд┐рдбрд╝рдХреА рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреЛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ "Gtk :: DrawingArea" рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд╡рд░реНрдЧ рд╣реИ, рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ on_draw рддрд░реАрдХрд╛ рд╣реИ:
 virtual bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) 

рдпрд╣ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдЙрдкрд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдЧреЗрдЯреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ gtkmm рдореЗрдВ рд╡рд┐рдЬреЗрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рдЬреЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЙрдкрд╡рд░реНрдЧ рд╡рд╛рдВрдЫрд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдВрдЫрд┐рдд рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡рд┐рдзрд┐ рд╡рд┐рдЬреЗрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдШрдЯрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓рддреА рд╣реИред рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдХреИрд░рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдЙрд╕реЗ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред

рдпрд╣ рдкреЛрд╕реНрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрд╡рдпрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕реНрд╡-рдкреНрд░рд▓реЗрдЦрд┐рдд рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рд▓реА рдЧрдИ рд╣реИред

Source: https://habr.com/ru/post/In145160/


All Articles