# Κλίμακα (C)

Monica Kochofar
monicakochofar@gmail.com 2012
Ένας ολισθητής γραφικού συστατικού για επιλογή μιας τιμής από μια περιοχή
Δημήτρης Σπίγγος
dmtrs32@gmail.com 2012, 2013

# Κλίμακα

Ολίσθηση των κλιμάκων!

#περιλαμβάνει <gtk/gtk.h>

/*Αυτή είναι η συνάρτηση επανάκλησης. * Είναι μια συνάρτηση χειριστή που αντιδρά στο σήμα. * Σε αυτήν την περίπτωση, θα ειδοποιεί τον χρήστη για την τιμή της κλίμακας τους ως μια ετικέτα. */ static void hscale_moved (GtkRange *range, gpointer user_data) { GtkWidget *label = user_data;

/* Λήψη της τιμής της περιοχής και μετατροπής της σε μια συμβολοσειρά που θα * χρησιμοποιηθεί ως μια νέα ετικέτα για την οριζόντια κλίμακα. * %.0f - αντιστοιχεί σε διπλής ακριβείας που θα έχει 0 δεκαδικά ψηφία. */ gdouble pos = gtk_range_get_value (range); /* Σημείωση: Χρησιμοποιώντας Using g_strdup_printf επιστρέφει μια συμβολοσειρά που πρέπει να ελευθερωθεί. * (Που γίνεται παρακάτω) */ gchar *str = g_strdup_printf ("Horizontal scale is %.0f", pos); gtk_label_set_text (GTK_LABEL (label), str);

g_free(str); }

/* Αυτή είναι η δεύτερη συνάρτηση επανάκλησης. Είναι μια συνάρτηση χειρισμού που * αντιδρά στο σήμα. Κάνει το ίδιο πράγμα όπως η παραπάνω συνάρτηση, * εκτός από την κάθετη κλίμακα. */ vscale_moved (GtkRange *range, gpointer user_data) { GtkWidget *label = user_data;

gdouble pos = gtk_range_get_value (range); /* %.1f - stands for a double that will have 1 decimal place */ gchar *str = g_strdup_printf ("Vertical scale is %.1f", pos); gtk_label_set_text (GTK_LABEL (label), str);

g_free (str); }

static void activate (GtkApplication *app, gpointer user_data) { /* Declare variables */ GtkWidget *window; GtkWidget *h_scale; GtkWidget *v_scale; GtkWidget *hlabel; GtkWidget *vlabel; GtkWidget *grid;

/* Το αντικείμενο προσαρμογής αναπαριστά μια τιμή * που έχει ένα συσχετισμένο κατώτερο και ανώτερο όριο. */ GtkAdjustment *hadjustment; GtkAdjustment *vadjustment;

/* Δημιουργία ενός παραθύρου με τίτλο και προεπιλεγμένο μέγεθος. */ window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "Scale Example"); gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); gtk_container_set_border_width (GTK_CONTAINER (window), 5);

/* Δύο ετικέτες για εμφάνιση στο παράθυρο */ hlabel = gtk_label_new ("Move the scale handle..."); vlabel = gtk_label_new ("Move the scale handle...");

/* gtk_adjustment_new παίρνει έξι παραμέτρους, τρεις από τις οποίες * μπορεί να είναι δυσνόητες: * step increment- μετακινήστε το χειριστήριο με τα πλήκτρα βελών στο πληκτρολόγιο σας για να δείτε. * page increment - μετακινήστε το χειριστήριο πατώντας μακριά από αυτό * στην κλίμακα για να δείτε. * page size - δεν χρησιμοποιείται εδώ. */ hadjustment = gtk_adjustment_new (0, 0, 100, 5, 10, 0); vadjustment = gtk_adjustment_new (50, 0, 100, 5, 10, 0);

/* Δημιουργία της οριζόντιας κλίμακας, εξασφαλίζοντας ότι τα * χρησιμοποιούμενα ψηφία δεν έχουν δεκαδικά. */ h_scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, hadjustment); gtk_scale_set_digits (GTK_SCALE (h_scale), 0);

/* Να επιτρέπεται η οριζόντια επέκταση (αν υπάρχει χώρος) και * ορισμός της κάθετης στοίχισης */ gtk_widget_set_hexpand (h_scale, TRUE); gtk_widget_set_valign (h_scale, GTK_ALIGN_START);

/* Σύνδεση του σήματος "value-changed" για την οριζόντια κλίμακα * με την κατάλληλη συνάρτηση επανάκλησης. * Σημειώστε ότι η GtkRange είναι μέρος της ιεραρχίας αντικειμένου της GtkScale. */ g_signal_connect (h_scale, "value-changed", G_CALLBACK (hscale_moved), hlabel);

/* Δημιουργία της κάθετης κλίμακας. Αυτή τη φορά, θα δούμε τι συμβαίνει * όταν οι αριθμοί δεν έχουν οριστεί αρχικά. */ v_scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, vadjustment); gtk_widget_set_vexpand (v_scale, TRUE);

/* Σύνδεση του σήματος "value-changed" για την κάθετη κλίμακα στην * κατάλληλη συνάρτηση επανάκλησης. */ g_signal_connect (v_scale, "value-changed", G_CALLBACK (vscale_moved), vlabel);

/* Δημιουργία ενός πλέγματος και τακτοποίηση όλων κατάλληλα */ grid = gtk_grid_new (); gtk_grid_set_column_spacing (GTK_GRID (grid), 10); gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE); gtk_grid_attach (GTK_GRID (grid), h_scale, 0, 0, 1, 1); gtk_grid_attach (GTK_GRID (grid), v_scale, 1, 0, 1, 1); gtk_grid_attach (GTK_GRID (grid), hlabel, 0, 1, 1, 1); gtk_grid_attach (GTK_GRID (grid), vlabel, 1, 1, 1, 1);

gtk_container_add (GTK_CONTAINER (window), grid);

gtk_widget_show_all (window); }

int main (int argc, char **argv) { GtkApplication *app; int status;

app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app);

return status; }

Σε αυτό το παράδειγμα χρησιμοποιήσαμε τα παρακάτω:

GtkApplication

GtkWindow

GtkScale

GtkRange

GtkAdjustment

String Utility Functions