Το πρότυπο σχεδίασης Cairo

Η βασική ιδέα σχεδίασης στο Cairo εμπεριέχει τον ορισμό 'αόρατων' μονοπατιών και έπειτα βάψιμο ή γέμισμά τους για να γίνουν ορατά.

Για να κάνετε οποιαδήποτε σχεδίαση στο gtkmm με το Cairo, πρέπει πρώτα να δημιουργήσετε ένα αντικείμενο Cairo::Context. Αυτή η κλάση κρατά όλες τις παραμέτρους κατάστασης των γραφικών που περιγράφουν πώς πρόκειται να γίνει η σχεδίαση. Αυτό περιλαμβάνει πληροφορίες όπως πλάτος γραμμής, χρώμα, την επιφάνεια για σχεδίαση και πολλά άλλα. Αυτό επιτρέπει στις ενεργές λειτουργίες σχεδίασης να πάρουν λιγότερα ορίσματα για να απλοποιήσουν τη διεπαφή. Στην gtkmm, μια Cairo::Context δημιουργείται καλώντας τη συνάρτηση Gdk::Window::create_cairo_context(). Αφού τα περιεχόμενα Cairo είναι αντικείμενα με μετρημένες αναφορές, αυτή η συνάρτηση επιστρέφει ένα αντικείμενο Cairo::RefPtr<Cairo::Context>.

Το παρακάτω παράδειγμα εμφανίζει πώς να ρυθμιστεί ένα περιεχόμενο Cairo με ένα χρώμα προσκηνίου κόκκινου και ένα πλάτος 2. Οποιεσδήποτε λειτουργίες σχεδίασης που χρησιμοποιούν αυτό το περιεχόμενο θα χρησιμοποιήσουν αυτές τις ρυθμίσεις.

Gtk::DrawingArea myArea;
Cairo::RefPtr<Cairo::Context> myContext = myArea.get_window()->create_cairo_context();
myContext->set_source_rgb(1.0, 0.0, 0.0);
myContext->set_line_width(2.0);

Κάθε Cairo::Context συσχετίζεται με μια ειδική Gdk::Window, έτσι ώστε η πρώτη γραμμή του παραπάνω παραδείγματος να δημιουργεί ένα γραφικό συστατικό Gtk::DrawingArea και η δεύτερη γραμμή να χρησιμοποιεί την συνδεμένη Gdk::Window για να δημιουργήσει ένα αντικείμενο Cairo::Context. Οι τελικές δύο γραμμές αλλάζουν την κατάσταση γραφικών του περιεχομένου.

Υπάρχει ένας αριθμός από μεταβλητές κατάστασης γραφικών που μπορεί να οριστεί για περιεχόμενο Cairo. Τα πιο κοινά γνωρίσματα περιεχομένου είναι χρώμα (χρησιμοποιώντας set_source_rgb() ή set_source_rgba() για ημιδιαφανή χρώματα), πλάτος γραμμής (χρησιμοποιώντας set_line_width()), μοτίβο παύλας γραμμής (χρησιμοποιώντας set_dash()), τεχνοτροπία άκρου γραμμής (χρησιμοποιώντας set_line_cap()), και τεχνοτροπία ένωσης γραμμών (χρησιμοποιώντας set_line_join()), και τεχνοτροπίες γραμματοσειρών (χρησιμοποιώντας set_font_size(), set_font_face() και άλλες). Υπάρχουν επίσης πολλές άλλες ρυθμίσεις, όπως πίνακες μετασχηματισμών, γέμισμα κανόνων, αν θα εκτελεστεί εξομάλυνση κι άλλες. Για περισσότερες πληροφορίες, δείτε την τεκμηρίωση API cairomm.

The current state of a Cairo::Context can be saved to an internal stack of saved states and later be restored to the state it was in when you saved it. To do this, use the save() method and the restore() method. This can be useful if you need to temporarily change the line width and color (or any other graphics setting) in order to draw something and then return to the previous settings. In this situation, you could call Cairo::Context::save(), change the graphics settings, draw the lines, and then call Cairo::Context::restore() to restore the original graphics state. Multiple calls to save() and restore() can be nested; each call to restore() restores the state from the matching paired save().

It is good practice to put all modifications to the graphics state between save()/restore() function calls. For example, if you have a function that takes a Cairo::Context reference as an argument, you might implement it as follows:

void doSomething(const Cairo::RefPtr<Cairo::Context>& context, int x)
{
    context->save();
    // change graphics state
    // perform drawing operations
    context->restore();
}

Η εικονική μέθοδος on_draw() παρέχει ένα περιεχόμενο Cairo που θα χρησιμοποιήσετε για σχεδίαση στο γραφικό συστατικό Gtk::DrawingArea. Δεν είναι απαραίτητο να αποθηκεύσετε και να επαναφέρετε αυτό το περιεχόμενο Cairo στην on_draw().