GTK +

2016-06-20 6 views
0

を使用してメニューのメニュー項目を作成し、機能させるこのコードでは、メニューバーを作成してメニューとメニュー項目を追加しました... しかし、作成されたメニュー項目を機能的にする方法はわかりません。 。例えばのために:私はGTK + 3GTK +

#include <gtk/gtk.h> 


    GtkWidget  *window; 
    GdkPixbuf  *icon; 
    GtkWidget  *vbox; 

    GtkWidget  *menubar; 
    GtkWidget  *fileMenu; 
    GtkWidget  *fileMi; 
    GtkWidget  *editMenu; 
    GtkWidget  *editMi; 
    GtkWidget  *searchMenu; 
    GtkWidget  *searchMi; 
    GtkWidget  *newMi; 
    GtkWidget  *openMi; 
    GtkWidget  *saveMi; 
    GtkWidget  *saveasMi; 
    GtkWidget  *quitMi; 
    GtkWidget  *undoMi; 
    GtkWidget  *redoMi; 
    GtkWidget  *cutMi; 
    GtkWidget  *copyMi; 
    GtkWidget  *pasteMi; 
    GtkWidget  *fontMi; 
    GtkWidget  *findMi; 
    GtkWidget  *replaceMi; 
    GtkWidget  *text_view; 
    GtkTextBuffer *buffer; 

    void txt(){ 

    text_view = gtk_text_view_new(); 
    gtk_box_pack_start (GTK_BOX (vbox), text_view, TRUE, TRUE, 0); 


    } 

    GdkPixbuf *create_pixbuf (const gchar *filename) 
    { 
    GdkPixbuf *pixbuf; 
    GError *error = NULL; 

    pixbuf = gdk_pixbuf_new_from_file (filename, &error); 

    if (!pixbuf) 
    { 
    fprintf (stderr, "%s\n", error->message); 
    g_error_free (error); 
    } 

    return pixbuf; 
    } 

    static void fileOpen(GtkWidget *load, gpointer window) 
    { 
    GtkWidget *choose; 
    GtkFileChooserAction action= GTK_FILE_CHOOSER_ACTION_OPEN; 

    choose  = gtk_file_chooser_dialog_new("Choose a file to open", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); 
    if (gtk_dialog_run(GTK_DIALOG(choose)) == GTK_RESPONSE_ACCEPT) 
    { 

    char *path  = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(choose)); 
    gtk_text_buffer_set_text(buffer, path, -1); 
    } 

    gtk_widget_destroy(choose); 
    } 

    static void fileSave(GtkWidget *save, gpointer window) 
    { 
    GtkWidget *saved; 

    saved  = gtk_file_chooser_dialog_new("Choose a file to open", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); 
    gtk_widget_show_all(saved); 

    gint resp =  gtk_dialog_run(GTK_DIALOG(saved)); 

    gtk_widget_destroy(saved); 
    } 


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


    gtk_init (&argc, &argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    icon = create_pixbuf ("Web.png"); 

    gtk_window_set_title (GTK_WINDOW (window), "Write Pad"); 
    gtk_window_set_default_size (GTK_WINDOW (window), 500, 400); 
    gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER); 
    gtk_window_set_icon (GTK_WINDOW (window), icon); 

    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); 
    gtk_container_add (GTK_CONTAINER (window), vbox); 

    menubar = gtk_menu_bar_new(); 
    fileMenu = gtk_menu_new(); 


    fileMi = gtk_menu_item_new_with_label ("File"); 
    newMi = gtk_menu_item_new_with_label ("New"); 
    openMi = gtk_menu_item_new_with_label ("Open"); 
    saveMi = gtk_menu_item_new_with_label ("Save"); 
    saveasMi = gtk_menu_item_new_with_label ("Save As"); 
    quitMi = gtk_menu_item_new_with_label ("Quit"); 

    menubar = gtk_menu_bar_new(); 
    editMenu = gtk_menu_new(); 

    editMi = gtk_menu_item_new_with_label ("Edit"); 
    undoMi = gtk_menu_item_new_with_label ("Undo"); 
    redoMi = gtk_menu_item_new_with_label ("Redo"); 
    cutMi = gtk_menu_item_new_with_label ("Cut"); 
    copyMi = gtk_menu_item_new_with_label ("Copy"); 
    pasteMi = gtk_menu_item_new_with_label ("Paste"); 
    fontMi = gtk_menu_item_new_with_label ("Font"); 

    menubar = gtk_menu_bar_new(); 
    searchMenu = gtk_menu_new(); 

    searchMi = gtk_menu_item_new_with_label ("Search"); 
    findMi = gtk_menu_item_new_with_label ("Find"); 
    replaceMi = gtk_menu_item_new_with_label ("Replace"); 

    gtk_menu_item_set_submenu (GTK_MENU_ITEM (fileMi), fileMenu); 
    gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), newMi); 
    gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), openMi); 
    gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), saveMi); 
    gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), saveasMi); 
    gtk_menu_shell_append (GTK_MENU_SHELL (fileMenu), quitMi); 
    gtk_menu_shell_append (GTK_MENU_SHELL (menubar), fileMi); 

    gtk_menu_item_set_submenu (GTK_MENU_ITEM (editMi), editMenu); 
    gtk_menu_shell_append(GTK_MENU_SHELL(editMenu), undoMi); 
    gtk_menu_shell_append(GTK_MENU_SHELL(editMenu), redoMi); 
    gtk_menu_shell_append(GTK_MENU_SHELL(editMenu), cutMi); 
    gtk_menu_shell_append(GTK_MENU_SHELL(editMenu), copyMi); 
    gtk_menu_shell_append (GTK_MENU_SHELL (editMenu), pasteMi); 
    gtk_menu_shell_append (GTK_MENU_SHELL (editMenu), fontMi); 
    gtk_menu_shell_append (GTK_MENU_SHELL (menubar), editMi); 

    gtk_menu_item_set_submenu (GTK_MENU_ITEM (searchMi), searchMenu); 
    gtk_menu_shell_append(GTK_MENU_SHELL(searchMenu), findMi); 
    gtk_menu_shell_append(GTK_MENU_SHELL(searchMenu), replaceMi); 

    gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0); 
    txt(); 
    buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); 

    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); 
    g_signal_connect (G_OBJECT (quitMi), "activate", G_CALLBACK (gtk_main_quit), NULL); 
    g_signal_connect (G_OBJECT (newMi), "activate", G_CALLBACK (main), NULL); 
    g_signal_connect(G_OBJECT (openMi), "activate", G_CALLBACK(fileOpen), NULL); 
    g_signal_connect(G_OBJECT (saveMi), "activate", G_CALLBACK(fileSave), NULL); 

    gtk_widget_show_all (window); 

    gtk_main(); 

    return 0; 
    } 
+1

のための答えへのリンクを追加する:あなたは、アクティブコールバックにウィンドウを渡していない:「活性化」、 'g_signal_connect(G_OBJECT(openMi)、G_CALLBACK G_CALLBACK(fileOpen)、(gpointer)ウィンドウ); '' gpointer'(a void * ')は、どのようにしてあなたはコールバックに追加データを渡すことができます –

+0

コードを編集してここに投稿できますか?私はそれほど難しいので、私のためには難しい –

+0

あなたはすでに 'activate'シグナルに接続しています。問題? – oldtechaa

答えて

1
使用してテキストエディタでプロジェクトを作ってるんだ ...メニューバーの「ファイル」の「開く」メニュー項目は、それをファイルを開き、表示したいです

基本的には、あなたのウィジェットはすべてグローバル変数ですが、fileOpen関数は引数をとります:

//global 
GtkWidget *window; 

//gpointer window argument -> local variable, not global 
static void fileOpen(GtkWidget *load, gpointer window) 
{ 
    GtkWidget *choose; 
    GtkFileChooserAction action= GTK_FILE_CHOOSER_ACTION_OPEN; 

    choose = gtk_file_chooser_dialog_new(
     "Choose a file to open", 
     GTK_WINDOW(window),//window is not global, but function argument here ! 
     GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL 
    ); 
    if (gtk_dialog_run(GTK_DIALOG(choose)) == GTK_RESPONSE_ACCEPT) 
    { 
     char *path = gtk_file_chooser_get_filename(
      GTK_FILE_CHOOSER(choose) 
     ); 
     gtk_text_buffer_set_text(buffer, path, -1); 
    } 
    gtk_widget_destroy(choose); 
} 

すぐに解決できるのは、引数の名前をgp_dataなどの名前に変更することです。

g_signal_connect(
    G_OBJECT (openMi), 
    "activate", 
    G_CALLBACK(fileOpen), 
    (gpointer)text_view // text_view and buffer needn't be global now 
); 

そしてあなたがかもしれない窓や何かを得るためにgpointer引数を使用:より良い修正はグローバル変数を使用して、代わりにあなたが必要とするオブジェクトを渡すためにgpointerに依存しないになります必要。カスタムのstructやウィジェットの配列を使用して、作業が必要な場合に備えてコールバックに渡すこともできますが、この場合はtext_viewウィジェットを渡してコールバックをこのように変更するだけでOKです:

static void fileOpen(GtkWidget *load, gpointer widget) 
{ 
    //get the buffer 
    GtkTextBuffer *buffer = gtk_text_view_get_buffer(
     GTK_TEXT_VIEW (widget) 
    ); 
    //get window from text_View widget passed to callback 
    //so window doesn't have to be global either... 
    GtkWidget *window = gtk_widget_get_toplevel(
     widget 
    ), *choose; 
    GtkFileChooserAction action= GTK_FILE_CHOOSER_ACTION_OPEN; 

    choose = gtk_file_chooser_dialog_new(
     "Choose a file to open", 
     GTK_WINDOW(window), 
     GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL 
    ); 
    if (gtk_dialog_run(GTK_DIALOG(choose)) == GTK_RESPONSE_ACCEPT) 
    { 
     char *path = gtk_file_chooser_get_filename(
      GTK_FILE_CHOOSER(choose) 
     ); 
     gtk_text_buffer_set_text(buffer, path, -1); 
    } 
    gtk_widget_destroy(choose); 
} 

このコードはテストしていませんが、これで十分です。あなたはちょっとしたコードを変更する必要がありますが、単に右ウィジェットをコールバックに渡すだけで、それらのグローバル変数をすべて取り除くことができます。

いつものように:Read the documentation、ただ手始めに今後の参考の