1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
#include <stdlib.h>
#include <gtk/gtk.h>
/* Callback pour le bouton */
static void on_button_clicked(GtkButton *button, gpointer data) { printf("Button clicked\n"); }
/* Schéma de l'IHM sur la grille */
/* 0 1 2 3 */
/* _________________________________ */
/* 0 | ___________________________ | 0 */
/* | | | | */
/* | | zone | | */
/* | | image | | */
/* | |___________________________| | */
/* 1 | | 1 */
/* | [Bouton] <scrollbar> (Edit) | */
/* 2 |_________________________________| 2 */
/* */
/* 0 1 2 3 */
static void IHM_test(int largeur_image, int marge_externe)
{
const int hauteur_image = 480;
const int hauteur_bouton = 40;
const int hauteur_scrollbar = 10;
const int hauteur_edit_zone = 16;
const int marge_interne = 10;
const int largeur_bouton = 80;
const int largeur_edit_zone = 120;
const int largeur_scrol_min = 200;
int largeur_fenetre, hauteur_fenetre, hauteur_ligne_2, largeur_scrollbar;
/* hauteur ligne 2 */
hauteur_ligne_2 = hauteur_bouton;
if (hauteur_ligne_2 < hauteur_scrollbar)
hauteur_ligne_2 = hauteur_scrollbar;
if (hauteur_ligne_2 < hauteur_edit_zone)
hauteur_ligne_2 = hauteur_edit_zone;
/* Largeur scrollbar : entre bouton et edit zone + marges internes */
largeur_scrollbar = largeur_image - (marge_interne * 2) - (largeur_bouton + largeur_edit_zone);
if (largeur_scrollbar < largeur_scrol_min) /* si trop petit : on agrandit tout */
{
largeur_scrollbar = largeur_scrol_min;
largeur_image = largeur_bouton + largeur_edit_zone + largeur_scrol_min + (marge_interne * 2);
}
/* Dimensions fenêtre */
largeur_fenetre = largeur_image + (marge_externe * 2);
hauteur_fenetre = hauteur_image + hauteur_ligne_2 + marge_interne + (marge_externe * 2);
/* Création dune fenêtre */
GtkWidget * fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(fenetre), "Ma fenêtre");
gtk_window_set_default_size(GTK_WINDOW(fenetre), largeur_fenetre, hauteur_fenetre);
gtk_widget_set_margin_start(fenetre, marge_externe);
gtk_widget_set_margin_end(fenetre, marge_externe);
gtk_widget_set_margin_top(fenetre, marge_externe);
gtk_widget_set_margin_bottom(fenetre, marge_externe);
g_signal_connect(fenetre, "destroy", G_CALLBACK(gtk_main_quit), NULL);
// Création de la grille : ligne et colonnes non homogènes, avec des marges
GtkWidget * grille = gtk_grid_new();
gtk_grid_set_row_spacing(GTK_GRID(grille), marge_interne);
gtk_grid_set_column_spacing(GTK_GRID(grille), marge_interne);
gtk_grid_set_row_homogeneous(GTK_GRID(grille), FALSE);
gtk_grid_set_column_homogeneous(GTK_GRID(grille), FALSE);
gtk_container_add(GTK_CONTAINER(fenetre), grille);
// Zone de l'image (avec cadre autour) : débute en (0,0) sur la grille, occupe 3x1
GtkWidget * cadre = gtk_frame_new("");
gtk_frame_set_shadow_type(GTK_FRAME(cadre), GTK_SHADOW_ETCHED_IN);
GtkWidget * zone_image = gtk_drawing_area_new();
gtk_widget_set_size_request(zone_image, largeur_image, hauteur_image);
gtk_container_add(GTK_CONTAINER(cadre), zone_image);
gtk_grid_attach(GTK_GRID(grille), cadre, 0, 0, 3, 1); // Ligne 0
// Bouton à gauche : débute en (0,1) sur la grille, occupe 1x1
GtkWidget * bouton = gtk_button_new_with_label("OK");
gtk_widget_set_size_request(bouton, largeur_bouton, hauteur_bouton);
gtk_grid_attach(GTK_GRID(grille), bouton, 0, 1, 1, 1);
g_signal_connect(bouton, "clicked", G_CALLBACK(on_button_clicked), NULL);
// Scrollbar au milieu : débute en (1,1) sur la grille, occupe 1x1
GtkAdjustment * ajustement = gtk_adjustment_new(50.0, 0.0, 105.0, 1.0, 10.0, 5.0);
GtkWidget * scrollbar = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, ajustement);
g_object_set(scrollbar, "hexpand", TRUE, NULL);
g_object_set(scrollbar, "vexpand", FALSE, NULL);
g_object_set(scrollbar, "valign", GTK_ALIGN_CENTER, NULL);
gtk_widget_set_size_request(scrollbar, largeur_scrollbar, hauteur_scrollbar);
gtk_grid_attach(GTK_GRID(grille), scrollbar, 1, 1, 1, 1);
// Edit zone à droite : débute en (2,1) sur la grille, occupe 1x1
GtkWidget * edit_zone = gtk_entry_new_with_buffer((GtkEntryBuffer *) gtk_entry_buffer_new("Valeur", -1));
gtk_widget_set_size_request(edit_zone, largeur_edit_zone, hauteur_edit_zone);
gtk_grid_attach(GTK_GRID(grille), edit_zone, 2, 1, 1, 1); // Ligne 2
// Affichage de tous les widgets
gtk_widget_show_all(fenetre);
}
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
IHM_test(640, 40);
IHM_test(640, 20);
gtk_main();
return 0;
} |
Partager