2008年11月11日火曜日

画像表示変更のプログラム

感想
正直あまりよく分からなくなってきた。GTKを理解するのは時間がかかりそうだ。
プログラムはボタンが3つあってそれぞれ別の画像を表示させることができる
ボタン1は押していくと画像の表示部分が増えていく

プログラム
#include
#include
#include
#include

int count = 0;

void button1_clicked(GtkWidget *widget, gpointer data){
static GdkPixbuf *pixbuf = NULL; //staticにしておくことで最初の1回だけファイルを読み込む
GtkWidget *drawing_area = (GtkWidget *)data;
count++;

if(count==6)count=0;

if(!pixbuf) pixbuf = gdk_pixbuf_new_from_file("city.jpg", NULL);
gdk_pixbuf_render_to_drawable (pixbuf, drawing_area->window,
widget->style->fg_gc[GTK_STATE_NORMAL],
0, 0, 0, 0,
gdk_pixbuf_get_width(pixbuf) - 50 + count*10,
gdk_pixbuf_get_height(pixbuf) - 50 + count*10,
GDK_RGB_DITHER_NORMAL, 0, 0);
}

void button2_clicked(GtkWidget *widget, gpointer data){
static GdkPixbuf *pixbuf = NULL; //staticにしておくことで最初の1回だけファイルを読み込む
GtkWidget *drawing_area = (GtkWidget *)data;

if(!pixbuf) pixbuf = gdk_pixbuf_new_from_file("red_flower.jpg", NULL);

gdk_pixbuf_render_to_drawable (pixbuf, drawing_area->window,
widget->style->fg_gc[GTK_STATE_NORMAL],
0, 0, 0, 0,
gdk_pixbuf_get_width(pixbuf),
gdk_pixbuf_get_height(pixbuf),
GDK_RGB_DITHER_NORMAL, 0, 0);
}

void button3_clicked(GtkWidget *widget, gpointer data){
static GdkPixbuf *pixbuf = NULL; //staticにしておくことで最初の1回だけファイルを読み込む
GtkWidget *drawing_area = (GtkWidget *)data;

if(!pixbuf) pixbuf = gdk_pixbuf_new_from_file("result03.jpg", NULL);

gdk_pixbuf_render_to_drawable (pixbuf, drawing_area->window,
widget->style->fg_gc[GTK_STATE_NORMAL],
0, 0, 0, 0,
gdk_pixbuf_get_width(pixbuf),
gdk_pixbuf_get_height(pixbuf),
GDK_RGB_DITHER_NORMAL, 0, 0);
}

void flip_vertical(GdkPixbuf *pixbuf, int x, int y, int w, int h)

int main(int argc, char *argv[]){
GtkWidget *window, *button1, *button2, *button3, *button4,*vbox, *hbox, *drawing_area;

/* 初期化とパラメータの指定 */
gtk_init(&argc, &argv);
gdk_rgb_init();

/**********************/
/* ウィジェットの作成 */
/**********************/
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //メインwindow
button1 = gtk_button_new_with_label("image 1"); //ボタン
button2 = gtk_button_new_with_label("image 2"); //ボタン
button3 = gtk_button_new_with_label("image 3");
button4 = gtk_button_new_with_label("image 4");
vbox = gtk_vbox_new (FALSE, 3); //垂直パッキングボックス
hbox = gtk_hbox_new (FALSE, 3); //水平パッキングボックス
drawing_area = gtk_drawing_area_new(); //描画領域
gtk_drawing_area_size(GTK_DRAWING_AREA(drawing_area), 320, 214);


/**************************/
/* ウィジェットを配置する */
/**************************/
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_box_pack_start(GTK_BOX(vbox), drawing_area, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), button1, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), button2, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), button3, FALSE, FALSE, 0);


/* Window内の全てのウィジェットを表示 */
gtk_widget_show_all(window);


/**************************/
/* コールバック関数の登録 */
/**************************/
/* 右上の×が押されたら終了 */
gtk_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

/* ボタン1が押されたら画像1が表示される */
gtk_signal_connect(GTK_OBJECT(button1), "clicked",
GTK_SIGNAL_FUNC(button1_clicked), (gpointer)drawing_area);
/* ボタン2が押されたら画像が表示される */
gtk_signal_connect(GTK_OBJECT(button2), "clicked",
GTK_SIGNAL_FUNC(button2_clicked), (gpointer)drawing_area);
/*ボタン3が押されたら*/
gtk_signal_connect(GTK_OBJECT(button3), "clicked",
GTK_SIGNAL_FUNC(button3_clicked), (gpointer)drawing_area);

/* メインループ */
gtk_main();

return 0;

}

0 件のコメント: