Gtk问题(回调时关闭,不应关闭;Cairo不绘制;分隔符不显示)

Gtk问题(回调时关闭,不应关闭;Cairo不绘制;分隔符不显示),c,terminal,gtk,cairo,gtk2,C,Terminal,Gtk,Cairo,Gtk2,我有一些问题,我不知道如何用GTK+2解决 我做了一个函数,当我点击“Ajuda”(帮助)菜单上的“Manual”项时,应该是一个回调。然而,当我编译并点击那里时,程序关闭了,我不知道为什么 开罗并没有在其中一个盒子上画画,事实上,它并没有在任何地方画画 我试图在菜单和工具栏之间设置一个水平分隔符,但它似乎不可见 对不起,葡萄牙语的半代码,我希望不会有什么不同 #include <gtk/gtk.h> #include <stdlib.h> #inc

我有一些问题,我不知道如何用GTK+2解决

  • 我做了一个函数,当我点击“Ajuda”(帮助)菜单上的“Manual”项时,应该是一个回调。然而,当我编译并点击那里时,程序关闭了,我不知道为什么

  • 开罗并没有在其中一个盒子上画画,事实上,它并没有在任何地方画画

  • 我试图在菜单和工具栏之间设置一个水平分隔符,但它似乎不可见

  • 对不起,葡萄牙语的半代码,我希望不会有什么不同

       #include <gtk/gtk.h>
        #include <stdlib.h>
        #include <math.h>
        #include <cairo.h>
    
            /*FALTA:
              - Abrir o manual (dar mensagem de erro em caso de falha E compatibilidade com Windows/Mac)
    
            */            
    
            gboolean
            help_manual(void)
            {
              short int x;
              //x = system("xdg-open GCDmanual.pdf");
              /*if (x==-1)
                {
              */
              return TRUE;
            }
    
            gboolean
            on_expose_event (GtkWidget       *widget ,
                             GdkEventExpose  *event  ,
                             gpointer         data   )
            {
              cairo_t        *cr ;
              gchar           texto[128] ;
              gint            width, height;
    
              static double   pos1x = 100., pos1y = 80., pos2x = 600., pos2y = 100.;
              static double   s1x = 1., s1y = 0., s2x = 0., s2y = 0.; 
              static double   velscale1=4, velscale2=0;
              double r1=30, r2=50;
    
              gtk_window_get_size(GTK_WINDOW(widget), &width, &height);
              cr = gdk_cairo_create(widget->window);
    
              cairo_move_to (cr, 20, 20);
              cairo_select_font_face(cr, "Courier", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
              cairo_set_font_size (cr, 18);
              sprintf (texto, "Exemplo de funcionamento de GTK+ Cairo                 Velocidade: %d\n",
                       (gint) velscale1);
              cairo_show_text (cr, texto);
    
              /* Circulo1 */
    
              cairo_set_source_rgb (cr, 0., 0., 0.);
              cairo_set_line_width (cr, 4.0);
              cairo_arc (cr, pos1x, pos1y, r1, 0., 2. * M_PI);
              cairo_stroke_preserve (cr);
              cairo_set_source_rgb (cr, 1, 1, 1);
              cairo_fill (cr);
    
              if ((pos1x < 30.) || ((pos1x + 30.) > width))
                s1x = - s1x;
    
    
              if ((pos1y < 30.) || ((pos1y + 30.) > height))
                s1y = - s1y;
              /* Circulo2 */
    
              cairo_set_source_rgb (cr, 0., 0., 0.);
              cairo_set_line_width (cr, 4.0);
              cairo_arc (cr, pos2x, pos2y, r2, 0., 2. * M_PI);
              cairo_stroke_preserve (cr);
              cairo_set_source_rgb (cr, 0, 1, 0);
              cairo_fill (cr);
    
              if ((pos2x < r2) || ((pos2x + r2) > width))
                s2x = - s2x;
    
    
              if ((pos2y < r2) || ((pos2y + r2) > height))
                s2y = - s2y;
    
              if ((pos1y-pos2y)*(pos1y-pos2y)+(pos1x-pos2x)*(pos1x-pos2x) <= (r1+r2)*(r1+r2))
                {
                  printf("COLISAO");
                  //angulovelrel
                  printf("%lf", atan2((s2y*velscale2-s1y*velscale1),(s2x*velscale2-s1x*velscale1)));
                  printf("%lf", atan2((pos2y-pos1y),(pos2x-pos1x)));
                }
              else
                {   
                  pos1x = pos1x + s1x * velscale1;
                  pos1y = pos1y + s1y * velscale1;
    
    
    
                  pos2x = pos2x + s2x * velscale2;
                  pos2y = pos2y + s2y * velscale2;
                }
    
    
              cairo_stroke(cr);
              cairo_destroy(cr);
    
              return FALSE;
            }
    
            static gboolean
            time_handler (GtkWidget *widget)
            {
              if (widget->window == NULL) 
                return FALSE;
    
              gtk_widget_queue_draw(widget);
    
              return TRUE;
            }
    
            int
            main(int argc, char **argv)
            {
    
              GtkWidget *janela;
              GtkWidget *vbox1, *hbox2, *vbox3_sett, *vbox3_field;
              GtkWidget *vboxseparator1;
              GtkWidget *menubar, *lvl1file, *lvl2file, *lvl1help, *lvl2help;
              GtkWidget *file_new, * file_open, *file_sep1, *file_quit;
              GtkWidget *help_manual, *help_about;
              GtkWidget *toolbar;
              GtkToolItem *tb_restart, *tb_pause, *tb_undo, *tb_redo, *tb_sep1;
              GtkWidget *statusbar;
    
    
    
              gtk_init(&argc, &argv);
    
              janela=gtk_window_new(GTK_WINDOW_TOPLEVEL);
              gtk_window_set_title(GTK_WINDOW(janela), "Grande Colisor de Discos");
              gtk_window_set_position (GTK_WINDOW (janela), GTK_WIN_POS_CENTER);
              gtk_window_set_default_size (GTK_WINDOW(janela), 800, 600); 
    
              g_signal_connect_swapped (G_OBJECT(janela), "destroy",
                                        G_CALLBACK(gtk_main_quit), NULL);
              g_signal_connect (janela, "expose-event", G_CALLBACK(on_expose_event), NULL);
    
    
              vbox1 = gtk_vbox_new (FALSE, 0);
              gtk_box_set_homogeneous (GTK_BOX (vbox1), FALSE);
              gtk_container_add (GTK_CONTAINER(janela), vbox1);
    
    
              /* MENU */
    
              menubar = gtk_menu_bar_new ();
              gtk_box_pack_start (GTK_BOX (vbox1), menubar, FALSE, TRUE, 0);
    
              lvl1file= gtk_menu_item_new_with_mnemonic ("_Ficheiro"); 
              gtk_menu_shell_append (GTK_MENU_SHELL(menubar), lvl1file); 
              lvl2file = gtk_menu_new ();
              gtk_menu_item_set_submenu (GTK_MENU_ITEM (lvl1file), lvl2file);
    
              file_new = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, NULL);
            #if GTK_CHECK_VERSION(2,18,0)
              gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (file_new), TRUE);
            #endif
    
              file_open = gtk_image_menu_item_new_from_stock (GTK_STOCK_OPEN, NULL);
            #if GTK_CHECK_VERSION(2,18,0)
              gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (file_open), TRUE);
            #endif
    
              file_sep1= gtk_separator_menu_item_new();
              file_quit= gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
            #if GTK_CHECK_VERSION(2,18,0)
              gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (file_quit), TRUE);
            #endif
    
              gtk_menu_shell_append (GTK_MENU_SHELL (lvl2file), file_new);
              gtk_menu_shell_append (GTK_MENU_SHELL (lvl2file), file_open);
              gtk_menu_shell_append (GTK_MENU_SHELL (lvl2file), file_sep1);
              gtk_menu_shell_append (GTK_MENU_SHELL (lvl2file), file_quit);
    
    
    
              //Ajuda
    
              lvl1help = gtk_menu_item_new_with_mnemonic ("_Ajuda");
              gtk_menu_shell_append (GTK_MENU_SHELL (menubar), lvl1help);
              lvl2help = gtk_menu_new();
              gtk_menu_item_set_submenu (GTK_MENU_ITEM (lvl1help), lvl2help);
              help_manual=gtk_menu_item_new_with_label("Manual de ajuda");
              help_about= gtk_menu_item_new_with_label("Sobre...");
    
              gtk_menu_shell_append(GTK_MENU_SHELL(lvl2help), help_manual);
              gtk_menu_shell_append(GTK_MENU_SHELL(lvl2help), help_about);
    
    
    
              //Menu Callbacks
    
              g_signal_connect(G_OBJECT(file_quit), "activate", G_CALLBACK(gtk_main_quit), NULL);
              g_signal_connect(G_OBJECT(help_manual), "activate", G_CALLBACK(help_manual), NULL);
    
    
    
              /* TOOLBAR */
    
              toolbar = gtk_toolbar_new();
              gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
              gtk_container_set_border_width (GTK_CONTAINER (toolbar), 0);
    
              tb_undo = gtk_tool_button_new_from_stock (GTK_STOCK_UNDO);
              gtk_widget_set_name (GTK_WIDGET (tb_undo), "undo");
              gtk_toolbar_insert (GTK_TOOLBAR (toolbar), tb_undo, -1);
    
              tb_redo = gtk_tool_button_new_from_stock (GTK_STOCK_REDO);
              gtk_toolbar_insert (GTK_TOOLBAR (toolbar), tb_redo, -1);
    
              tb_sep1 = gtk_separator_tool_item_new ();
              gtk_toolbar_insert (GTK_TOOLBAR (toolbar), tb_sep1, -1);
    
              tb_pause = gtk_tool_button_new_from_stock (GTK_STOCK_MEDIA_PAUSE);
              gtk_toolbar_insert (GTK_TOOLBAR (toolbar), tb_pause, -1);
    
              tb_restart = gtk_tool_button_new_from_stock (GTK_STOCK_REFRESH);
              gtk_toolbar_insert (GTK_TOOLBAR (toolbar), tb_restart, -1);
    
              /*tb_sep = gtk_separator_tool_item_new ();
                gtk_toolbar_insert (GTK_TOOLBAR (toolbar), tb_sep, -1);*/
    
              gtk_box_pack_start (GTK_BOX(vbox1), toolbar, FALSE, FALSE, 0); 
    
              /* HBOX2 */
    
              vboxseparator1 = gtk_hseparator_new ();
              gtk_box_pack_start (GTK_BOX (vbox1), vboxseparator1, FALSE, TRUE, 0);
              gtk_widget_show (vboxseparator1);
    
              hbox2= gtk_hbox_new (FALSE, 0);
              gtk_container_add (GTK_CONTAINER(vbox1), hbox2); 
    
              /* STATUSBAR */
    
              statusbar = gtk_statusbar_new();
              gtk_box_pack_end (GTK_BOX (vbox1), statusbar, FALSE, TRUE, 0);
              gtk_statusbar_push  (GTK_STATUSBAR (statusbar), 1, "  Isto e' uma     statusbar.");
    
              gtk_widget_show_all (janela);
              gtk_main();
    
    
              /* ÁREA DE TRABALHO */
    
              vbox3_field = gtk_vbox_new (FALSE, 0);
              gtk_container_add (GTK_CONTAINER (hbox2), vbox3_field);
    
              vbox3_sett = gtk_vbox_new (FALSE, 0);
              gtk_container_add (GTK_CONTAINER (hbox2), vbox3_sett);
    
              gtk_widget_set_app_paintable (vbox3_field, TRUE);
    }
    
    #包括
    #包括
    #包括
    #包括
    /*法尔塔:
    -Abrir o手册(适用于Windows/Mac操作系统)
    */            
    gboolean
    帮助手册(作废)
    {
    短int x;
    //x=系统(“xdg open GCDmanual.pdf”);
    /*如果(x==-1)
    {
    */
    返回TRUE;
    }
    gboolean
    在_expose_事件(GtkWidget*小部件,
    GdkEventExpose*事件,
    gpointer数据)
    {
    开罗*cr;
    gchartexto[128];
    轧棉宽度、高度;
    静态双位置1X=100,位置1Y=80,位置2X=600,位置2Y=100。;
    静态双s1x=1,s1y=0,s2x=0,s2y=0。;
    静态双velscale1=4,velscale2=0;
    双r1=30,r2=50;
    gtk_窗口_获取_大小(gtk_窗口(小部件),&宽度和高度);
    cr=gdk\u cairo\u create(小部件->窗口);
    开罗(cr,20,20);
    cairo字体选择(cr,“信使”,cairo字体倾斜,cairo字体粗体);
    cairo_set_font_size(cr,18);
    sprintf(texto,“GTK+Cairo Velociade的功能示例:%d\n”,
    (gint)velscale1);
    cairo_show_text(cr,texto);
    /*圈1*/
    cairo_set_source_rgb(cr,0,0,0.);
    cairo\u set\u line\u width(cr,4.0);
    开罗弧(cr,位置1X,位置1Y,r1,0,2.*M_PI);
    cairo_-stroke_-preserve(cr);
    cairo_set_source_rgb(cr,1,1,1);
    开罗填料(cr);
    如果((位置1X<30。)| |((位置1X+30。)>宽度))
    s1x=-s1x;
    如果((位置1Y<30。)| |((位置1Y+30。)>高度))
    s1y=-s1y;
    /*圈2*/
    cairo_set_source_rgb(cr,0,0,0.);
    cairo\u set\u line\u width(cr,4.0);
    开罗弧(cr、pos2x、pos2y、r2、0、2.*M_-PI);
    cairo_-stroke_-preserve(cr);
    cairo\u set\u source\u rgb(cr,0,1,0);
    开罗填料(cr);
    如果((pos2x宽度))
    s2x=-s2x;
    如果((pos2y高度))
    s2y=-s2y;
    如果((pos1y-pos2y)*(pos1y-pos2y)+(pos1x-pos2x)*(pos1x-pos2x)窗口==NULL)
    返回FALSE;
    gtk_小部件_队列_绘制(小部件);
    返回TRUE;
    }
    int
    主(内部argc,字符**argv)
    {
    GtkWidget*janela;
    GtkWidget*vbox1、*hbox2、*vbox3_设置、*vbox3_字段;
    GtkWidget*vboxseparator1;
    GtkWidget*menubar、*lvl1文件、*lvl2文件、*lvl1帮助、*lvl2帮助;
    GtkWidget*文件更新,*文件打开,*文件sep1,*文件退出;
    GtkWidget*帮助手册,*关于帮助;
    GtkWidget*工具栏;
    GtkToolItem*tb_重启、*tb_暂停、*tb_撤消、*tb_重做、*tb_sep1;
    GtkWidget*状态栏;
    gtk_init(&argc,&argv);
    janela=gtk_窗新(gtk_窗顶层);
    gtk_window_set_title(gtk_window(janela),“Grande Colisor de Discos”);
    gtk_窗口设置位置(gtk_窗口(janela)、gtk_WIN_位置中心);
    gtk_窗口设置默认大小(gtk_窗口(janela),800600);
    g_信号连接交换(g_对象(janela),“销毁”,
    G_回调(gtk_main_quit),NULL);
    g_信号连接(janela,“暴露事件”,g_回调(在暴露事件上),NULL);
    vbox1=gtk_vbox_new(FALSE,0);
    gtk_盒_集_齐次(gtk_盒(vbox1),假);
    gtk_容器添加(gtk_容器(janela),vbox1);
    /*菜单*/
    菜单栏=gtk_菜单栏_新建();
    gtk_-box_-pack_启动(gtk_-box(vbox1),菜单栏,假,真,0);
    lvl1file=gtk_菜单项_新建_,带助记符(“_fichero”);
    gtk_菜单_外壳_附加(gtk_菜单_外壳(菜单栏),LVL1文件);
    lvl2file=gtk_menu_new();
    gtk_菜单项设置子菜单(gtk_菜单项(LVL1文件)、LVL2文件);
    文件_new=gtk_图像_菜单_项_new_from_stock(gtk_stock_new,NULL);
    #如果GTK_检查_版本(2,18,0)
    gtk_图像_菜单_项设置_始终显示_图像(gtk_图像_菜单_项(文件_新),真);
    #恩迪夫
    文件\打开=gtk\ U图像\菜单\项目\新\来自\库存(gtk\ U库存\打开,空);
    #如果GTK_检查_版本(2,18,0)
    gtk_图像_菜单_项设置_始终显示_图像(gtk_图像_菜单_项(文件_打开),真);
    #恩迪夫
    file_sep1=gtk_separator_menu_item_new();
    file_quit=gtk_image_菜单项_new_from_stock(gtk_stock_quit,NULL);
    #如果GTK_检查_版本(2,18,0)
    gtk_图像_菜单_项设置_始终显示_图像(gtk_图像_菜单_项(文件_退出),TRUE);
    #恩迪夫
    gtk_menu_shell_append(gtk_menu_shell(lvl2file),文件_new);
    gtk_菜单_外壳_附加(gtk_菜单_外壳(lvl2file),文件_打开);
    gtk_menu_shell_append(gtk_menu_shell(lvl2文件),文件_sep1);
    gtk_菜单_外壳_附加(gtk_菜单_外壳(lvl2file),文件_退出);
    //阿尤达
    lvl1help=gtk_菜单项_新建_,带助记符(“_Ajuda”);
    gtk_menu_shell_append(gtk_menu_shell(menubar),lvl1帮助);
    lvl2help=gtk_menu_new();
    gtk_菜单_i
    
    static void
    help_manual_callback(GtkMenuItem *item, gpointer data)
    {
      fprintf(stderr, "ajuda!\n");
    
      if (fork() == 0)
      {
        system("xdg-open GCDmanual.pdf");
        _exit(0);
      }
    }
    
      g_signal_connect(G_OBJECT(help_manual), "activate", 
                           G_CALLBACK(help_manual_callback), NULL);