Frameの枠


フレーム・ウィジェットの枠は4種類有る。
・Shadow In
・Shadow Out
・Shadow Etched In
・Shadow Etched Out
である。

#include <gtk/gtk.h>

int main( int argc, char *argv[])
{

  GtkWidget *window;
  GtkWidget *grid;

  GtkWidget *frame1;
  GtkWidget *frame2;
  GtkWidget *frame3;
  GtkWidget *frame4;
  GtkWidget *label1;
  GtkWidget *label2;
  GtkWidget *label3;
  GtkWidget *label4;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  //ウィンドウを画面の中央に配置
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_widget_set_size_request(window, 300, 200);
  gtk_window_set_title(GTK_WINDOW(window), "GtkFrame");
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);

  grid = gtk_grid_new();
  gtk_container_add(GTK_CONTAINER(window), grid);

  label1 = gtk_label_new("Label1");
  label2 = gtk_label_new("Label2");
  label3 = gtk_label_new("Label3");
  label4 = gtk_label_new("Label4");

  frame1 = gtk_frame_new("Shadow In");
  gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_IN);
  gtk_grid_attach(GTK_GRID(grid), frame1, 0, 0, 2, 2);
  gtk_container_add(GTK_CONTAINER(frame1), label1);

  frame2 = gtk_frame_new("Shadow Out");
  gtk_frame_set_shadow_type(GTK_FRAME(frame2), GTK_SHADOW_OUT);
  gtk_grid_attach(GTK_GRID(grid), frame2, 3, 0, 2, 2);
  gtk_container_add(GTK_CONTAINER(frame2), label2);

  frame3 = gtk_frame_new("Shadow Etched In");
  gtk_frame_set_shadow_type(GTK_FRAME(frame3), GTK_SHADOW_ETCHED_IN);
  gtk_grid_attach(GTK_GRID(grid), frame3, 0, 3, 2, 2);
  gtk_container_add(GTK_CONTAINER(frame3), label3);

  frame4 = gtk_frame_new("Shadow Etched Out");
  gtk_frame_set_shadow_type(GTK_FRAME(frame4), GTK_SHADOW_ETCHED_OUT);
  gtk_grid_attach(GTK_GRID(grid), frame4, 3, 3, 2, 2);
  gtk_container_add(GTK_CONTAINER(frame4), label4);

  g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

格好良く立体的になるはずが・・・Ubuntuでは大差無かった。 gtk_window_set_positionの第2引数をGTK_WIN_POS_CENTERにする事で、 起動時にウィンドウがモニター中央に現れるようになった。 この設定は5種類用意されているらしい。

・GTK_WIN_POS_NONE:設定無し
・GTK_WIN_POS_CENTER:画面の中央に表示
・GTK_WIN_POS_MOUSE:マウスのアイコンの位置に表示
・GTK_WIN_POS_CENTER_ALWAYS:ウィンドウのサイズ変更などでも、中央表示をキープ
・GTK_WIN_POS_CENTER_ON_PARENT:メイン・ウィンドウの中央に表示

OSが変われば、表示も変わると思われる。


ラベル


ラベルの表示にも少し触れてみる。

#include <gtk/gtk.h>

int main( int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *label;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_title(GTK_WINDOW(window), "GtkLabel");

  char *str = "<b>Bold:</b>:normal\n\
    this program is the test of Label widget";

  label = gtk_label_new(NULL);
  //マークアップ言語の分析
  gtk_label_set_markup(GTK_LABEL(label), str);
  //ラベルの文字を中央揃えに設定する
  gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
  gtk_container_add(GTK_CONTAINER(window), label);
  gtk_widget_show(label);

  gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);

  g_signal_connect(window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  gtk_widget_show(window);

  gtk_main();

  return 0;
}

strに格納した文字列を表示してみる。 太字はHTMLタグのように<b>〜</b>で囲むだけ。 改行は\n\を使う。
gtk_label_set_justifyで文字を左右中央に揃えられる。

GTK_JUSTIFY_LEFT:左揃え(デフォルト)
GTK_JUSTIFY_RIGHT:右揃え
GTK_JUSTIFY_CENTER:中央揃え

これで、新しいダイアログでメッセージを表示させる事ができる。

GDKで文字を表示


Labelに触れたので、再びGDKのCairoにも触れてみたい。

#include <gtk/gtk.h>
#include <gdk/gdk.h>

GtkWidget *window;

static gboolean cb_expose_event(GtkWidget *widget, cairo_t *cr, gpointer data)
{
  cr = gdk_cairo_create(gtk_widget_get_window(widget));

  cairo_set_source_rgb(cr, 0.1, 0.1, 0.1);

  //フォントを指定する
  cairo_select_font_face(cr, "TakaoMincho", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
  //フォントサイズを指定する
  cairo_set_font_size(cr, 13.0);

  //文字の位置(x,y)を指定する
  cairo_move_to(cr, 20, 30);

  //表示したい文字を指定する(文字コードはUTF-8)
  cairo_show_text(cr, "Label1");

  //複数文字列を表示させる
  cairo_move_to(cr, 20, 60);
  cairo_show_text(cr, "Label2");

  cairo_destroy(cr);
  return FALSE;
}

int main(int argc, char *argv[])
{
  GtkWidget *window;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Label");
  gtk_widget_set_size_request(window, 300,200);
  gtk_widget_set_app_paintable(window, TRUE);
  gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK);

  g_signal_connect(G_OBJECT(window), "draw", G_CALLBACK(cb_expose_event), NULL);
  g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

GDKを使うと、座標位置とサイズを指定できるので便利である。 次章では、Notebookウィジェットを使ってみたい。


前章  | 目次 |  次章



トップ



/