- 论坛徽章:
- 5
|
回复 1# fengtom_lcdtv
看你的另一篇帖子,你要的就是下面的功能吧:- #include <gtk/gtk.h>
- gboolean progress_button_release (GtkWidget *progress, GdkEvent *event, gpointer data);
- gboolean progress_button_press (GtkWidget *progress, GdkEvent *event, gpointer data);
- gboolean progress_motion_notify (GtkWidget *progress, GdkEvent *event, gpointer data);
- int main (int argc, char* argv[])
- {
- GtkWidget *window;
- GtkWidget *label;
- GtkWidget *progress;
- GtkWidget *vbox;
- gtk_init (&argc, &argv);
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_widget_set_size_request (window, 400, 300);
- label = gtk_label_new ("mouse progress bar");
- gtk_widget_show (label);
- progress = gtk_progress_bar_new ();
- gtk_widget_show (progress);
- gtk_widget_set_size_request (progress, -1, 30);
- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), 0.2);
- gtk_widget_add_events (progress, GDK_BUTTON_RELEASE_MASK |
- GDK_BUTTON_PRESS_MASK |
- GDK_POINTER_MOTION_MASK );
- g_signal_connect (progress, "button-release-event",
- G_CALLBACK (progress_button_release), NULL);
- g_signal_connect (progress, "button-press-event",
- G_CALLBACK (progress_button_press), NULL);
- g_signal_connect (progress, "motion-notify-event",
- G_CALLBACK (progress_motion_notify), NULL);
- vbox = gtk_vbox_new (FALSE, 5);
- gtk_widget_show (vbox);
- gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 5);
- gtk_box_pack_start (GTK_BOX(vbox), progress, TRUE, FALSE, 5);
- gtk_container_add (GTK_CONTAINER(window), vbox);
- gtk_widget_show (window);
- gtk_main ();
- return 0;
- }
- gboolean
- progress_button_release (GtkWidget *progress, GdkEvent *event, gpointer data)
- {
- GdkEventButton *eb = (GdkEventButton *)event;
- GtkAllocation allocation;
- gint pressed;
- pressed = (gint)g_object_get_data (G_OBJECT(progress), "pressed");
- #if GTK_MINOR_VERSION >= 18
- gtk_widget_get_allocation (progress, &allocation);
- #else
- allocation = progress->allocation;
- #endif
- if (pressed)
- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), eb->x / (allocation.width * 1.0));
- g_object_set_data (G_OBJECT(progress), "pressed", (gpointer)0);
- return FALSE;
- }
- gboolean
- progress_button_press (GtkWidget *progress, GdkEvent *event, gpointer data)
- {
- g_object_set_data (G_OBJECT(progress), "pressed", (gpointer)1);
- return FALSE;
- }
- gboolean
- progress_motion_notify (GtkWidget *progress, GdkEvent *event, gpointer data)
- {
- GdkEventMotion *em = (GdkEventMotion *)event;
- gint pressed;
- GtkAllocation allocation;
- pressed = (gint)g_object_get_data (G_OBJECT(progress), "pressed");
- #if GTK_MINOR_VERSION >= 18
- gtk_widget_get_allocation (progress, &allocation);
- #else
- allocation = progress->allocation;
- #endif
- if (pressed)
- {
- gdouble fraction = em->x / (allocation.width * 1.0);
- if (fraction > 1.0)
- fraction = 1.0;
- if (fraction < 0.0)
- fraction = 0.0;
- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress), fraction);
- }
- return FALSE;
- }
复制代码 注意 gtk_widget_add_events |
|