2012年7月22日 星期日

GTK+2.0


CB的global compiler settings -> compiler settings -> Other options 填-mms-bitfields

include:
$(CODEBLOCKS)\build\gtk\include\gtk-2.0
$(CODEBLOCKS)\build\gtk\include\glib-2.0
$(CODEBLOCKS)\build\gtk\include\cairo
$(CODEBLOCKS)\build\gtk\include\pango-1.0
$(CODEBLOCKS)\build\gtk\include\atk-1.0

link目錄
$(CODEBLOCKS)\build\gtk\lib

link libraries加入
gdk-win32-2.0
gtk-win32-2.0
atk-1.0
gdk_pixbuf-2.0
pangowin32-1.0
gdi32
pangocairo-1.0
pango-1.0
cairo
gobject-2.0
gmodule-2.0
glib-2.0
intl

main.cpp
#include <gtk/gtk.h>
//#include <stdio.h>
#include <stdlib.h>

static GdkPixmap *pixmap = NULL;
/* 創建一個適當大小的後端位圖 */
static gboolean configure_event( GtkWidget         *widget, GdkEventConfigure *event )
{
  if (pixmap) g_object_unref (pixmap);
  pixmap = gdk_pixmap_new (widget->window, widget->allocation.width, widget->allocation.height, -1);
  gdk_draw_rectangle (pixmap, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
  return TRUE;
}
/*  從後端位圖重新繪製螢幕 */
static gboolean expose_event(GtkWidget *widget,GdkEventExpose *event )
{
  gdk_draw_drawable (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)],pixmap,event->area.x, event->area.y,event->area.x, event->area.y,event->area.width, event->area.height);
  return FALSE;
}
/* 在螢幕上繪製一個矩形 */
static void draw_brush( GtkWidget *widget, gdouble    x,gdouble    y)
{
  GdkRectangle update_rect;
  update_rect.x = x - 5;
  update_rect.y = y - 5;
  update_rect.width = 10;
  update_rect.height = 10;
  gdk_draw_rectangle (pixmap,widget->style->black_gc,TRUE,update_rect.x, update_rect.y,update_rect.width, update_rect.height);
  gtk_widget_queue_draw_area (widget, update_rect.x, update_rect.y, update_rect.width, update_rect.height);
}

static gboolean button_press_event(GtkWidget *widget, GdkEventButton *event )
{
  if (event->button == 1 && pixmap != NULL)
    draw_brush(widget, event->x, event->y);
  return TRUE;
}

static gboolean motion_notify_event( GtkWidget *widget, GdkEventMotion *event )
{
  int x, y;
  GdkModifierType state;
  if (event->is_hint)
    gdk_window_get_pointer (event->window, &x, &y, &state);
  else
    {
      x = event->x;
      y = event->y;
      state =(GdkModifierType) event->state;
    }
  if (state & GDK_BUTTON1_MASK && pixmap != NULL)
    draw_brush (widget, x, y);
  return TRUE;
}

gint processDelete_event(GtkWidget *widget, GdkEvent  *event, gpointer   data)
{
g_print ("delete event occurred\n");
return FALSE;
}
static void processButton( GtkWidget *widget, gpointer data)
{
    g_print ("Hello again - %s was pressed\n", (gchar *) data);
    if (!g_strcmp0((gchar *)data ,"button 2"))
    {
        system("dir");
    }
}

void precessDestroy(GtkWidget *widget, gpointer data )
{
   gtk_main_quit();
}
int main(int argc, char* argv[])
{
    GtkWidget* window;
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_container_set_border_width(GTK_CONTAINER (window), 100);
    gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    g_signal_connect(window, "delete_event", G_CALLBACK(processDelete_event), NULL);
    g_signal_connect(window, "destroy", G_CALLBACK(precessDestroy), NULL);
    gtk_window_set_title(GTK_WINDOW(window), "哈囉!GTK+!");
   //------------------------------------------------------
    GtkWidget *vbox = gtk_vbox_new(FALSE, 20);
    gtk_container_add (GTK_CONTAINER(window), vbox);
    gtk_widget_show (vbox);
    GtkWidget *label = gtk_label_new ("底下是塗鴉牆");
    gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 0);
    gtk_widget_show (label);
    GtkWidget *button = gtk_button_new_with_label("Exit");
    gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
    g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);
    gtk_widget_show (button);
    //------------------------------------------------
    GtkWidget *hbox = gtk_hbox_new (TRUE, 30);
    gtk_box_pack_end (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
    gtk_widget_show (hbox);
    button = gtk_button_new_with_label("Button1");
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
    g_signal_connect(button, "clicked",G_CALLBACK (processButton), (gpointer)"button 1");
    gtk_widget_show (button);
    button = gtk_button_new_with_label("Button2-Do DIR");
    gtk_box_pack_end(GTK_BOX(hbox), button, TRUE, TRUE, 0);
    g_signal_connect(button, "clicked",G_CALLBACK (processButton), (gpointer)"button 2");
    gtk_widget_show (button);
    //-------------------------------------------------
    GtkWidget *drawing_area = gtk_drawing_area_new ();
    gtk_widget_set_size_request (GTK_WIDGET(drawing_area), 200, 200);
    gtk_box_pack_start (GTK_BOX(vbox), drawing_area, TRUE, TRUE, 0);
    g_signal_connect (drawing_area, "expose_event",G_CALLBACK(expose_event), NULL);
    g_signal_connect (drawing_area,"configure_event",G_CALLBACK (configure_event), NULL);
/* 事件信號 */
    g_signal_connect (drawing_area, "motion_notify_event",G_CALLBACK(motion_notify_event), NULL);
    g_signal_connect (drawing_area, "button_press_event",G_CALLBACK (button_press_event), NULL);
    gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK| GDK_LEAVE_NOTIFY_MASK| GDK_BUTTON_PRESS_MASK| GDK_POINTER_MOTION_MASK| GDK_POINTER_MOTION_HINT_MASK);
    gtk_widget_show (drawing_area);

    gtk_widget_show(window);
    gtk_main();
    return 0;
}

沒有留言:

張貼留言