LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 883|回复: 5

gtk_signal_emit_by_name的问题

[复制链接]
发表于 2003-11-20 15:06:52 | 显示全部楼层 |阅读模式
gtk_signal_emit_by_name的变参怎么用阿?我试了不管用?
gtk_signal_emit_by_name( GTK_OBJECT(text),"changed",1 );
程序

        /* File: gdkdrawing.c */
        /* example from gtk+ package */
        #include <gtk/gtk.h>

        static GdkPixmap *pixmap = NULL;
                GtkWidget *text;

        static gint configure_event( GtkWidget *widget,GdkEventConfigure *event)
        {
                if (pixmap) gdk_pixmap_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 gint expose_event( GtkWidget *widget, GdkEventExpose *event )
        {
                gdk_draw_pixmap(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_draw (widget, &update_rect);
        }

        static gint button_press_event( GtkWidget *widget,GdkEventButton *event)
        {
                printf("button press\n");
                if (event->button == 1 && pixmap != NULL)
                        draw_brush (widget, event->x, event->y);
                gtk_signal_emit_by_name( GTK_OBJECT(text),"changed",1 );
                return TRUE;
        }
        static gint keypress_event( GtkWidget *widget,GdkEventKey *event)
{
        printf("key pressed\n");
}

        static gint textchanged( GtkWidget *widget,
                int nval )
{
        printf("textchanged :%d\n", nval );
}
        static gint 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 = event->state;
                }
   
                if (state & GDK_BUTTON1_MASK && pixmap != NULL)
                        draw_brush (widget, x, y);
  
                return TRUE;
        }

        void quit ()
        {
                gtk_exit (0);
        }

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

                //初始化
                gtk_set_locale();
                gtk_init (&argc, &argv);

                window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
                gtk_widget_set_name (window, "Drawing Area");

                vbox = gtk_vbox_new (FALSE, 0);
                gtk_container_add (GTK_CONTAINER (window), vbox);
                gtk_widget_show (vbox);

                gtk_signal_connect (GTK_OBJECT (window), "destroy",
                      GTK_SIGNAL_FUNC (quit), NULL);

                //建立绘图区
                drawing_area = gtk_drawing_area_new ();
                gtk_drawing_area_size(GTK_DRAWING_AREA(drawing_area), 200, 200);
                gtk_box_pack_start(GTK_BOX(vbox), drawing_area, TRUE, TRUE, 0);
                gtk_widget_show (drawing_area);

                //建立信号触发
                gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
                      (GtkSignalFunc) expose_event, NULL);
                gtk_signal_connect (GTK_OBJECT(drawing_area),"configure_event",
                      (GtkSignalFunc) configure_event, NULL);
                gtk_signal_connect (GTK_OBJECT(window),"key_release_event",
                      (GtkSignalFunc) keypress_event, NULL);
                gtk_signal_connect (GTK_OBJECT (drawing_area),
                        "motion_notify_event",
                        (GtkSignalFunc) motion_notify_event, NULL);
                gtk_signal_connect (GTK_OBJECT (window),
                        "button_press_event",
                        (GtkSignalFunc) 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
                         | GDK_KEY_RELEASE_MASK
                         | GDK_KEY_PRESS_MASK );
                        text = gtk_text_new (NULL, NULL);
                gtk_signal_connect (GTK_OBJECT (text),
                        "changed",
                        (GtkSignalFunc)textchanged, NULL);
                gtk_text_set_editable (GTK_TEXT (text), TRUE);
                gtk_box_pack_start (GTK_BOX (vbox), text, FALSE, FALSE, 0);
                gtk_widget_show ( text );

                button = gtk_button_new_with_label ("退出");
                gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);

                gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                             GTK_SIGNAL_FUNC (gtk_widget_destroy),
                             GTK_OBJECT (window));
                gtk_widget_show (button);

                gtk_widget_show (window);

                gtk_main ();

                return 0;
        }
发表于 2003-11-20 21:49:47 | 显示全部楼层
兄弟有空读一读,论坛左下角的 “vb 代码”吧。会让读贴的朋友多不少的。
发表于 2003-11-20 22:19:45 | 显示全部楼层
兄弟的使用那个函数的意图是干什么??
 楼主| 发表于 2003-11-20 23:18:12 | 显示全部楼层

我想发送一个键盘事件到一个指定的widget

实际情况是我的应用程序左边是画图区,要响应预定义的热键。而右边是一些输入框。后来发现只要把鼠标移到左边,按键盘事件就会变成热键处理了,而客户要求点中左边以后才按热键处理,郁闷中。。。其实只要没有热键,一切都很正常。。。大侠帮忙看看吧
发表于 2003-11-21 19:19:57 | 显示全部楼层
我也帮你看看,建议求助其他高人
 楼主| 发表于 2003-11-23 14:00:16 | 显示全部楼层
好的,多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表