【问题标题】:How to print a continuous message while mouse button pressed (g_timeout_add)?如何在按下鼠标按钮时打印连续消息(g_timeout_add)?
【发布时间】:2019-03-26 15:26:30
【问题描述】:

我有这个代码:

#include <stdio.h>
#include <gtk/gtk.h>
#include <glib/gi18n.h>

guint threadID = 0;
guint serial_counter = 0;

static gboolean
serial_data (gpointer user_data)
{
    printf("hello\n");
    printf("counter: %d\n", serial_counter);
    serial_counter++;
    return user_data;
}

static void
on_pressed (GtkButton* button, gpointer user_data)
{
    if (user_data == 1)
    {
        threadID = g_timeout_add(250, serial_data, user_data);
    }
    else if (user_data == 0)
    {
        g_source_remove(threadID);
        threadID = 0;   
    }
}

int
main (int argc, char *argv[])
{
    GtkWidget *window;
    gtk_init (&argc, &argv);
    GtkWidget *stop_button;
    GtkWidget *box;

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "test.c");

    box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);

    stop_button = gtk_button_new_with_label (_("Stop"));

    gtk_box_pack_start (GTK_BOX (box), stop_button, FALSE, FALSE, 0);

    gtk_container_add (GTK_CONTAINER (window), box);

    g_signal_connect (window, "button-press-event", G_CALLBACK (on_pressed), 1);
    g_signal_connect (stop_button, "clicked", G_CALLBACK (on_pressed), 0);
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    gtk_widget_show_all (window);

    gtk_main ();
    return 0;
}

可以通过以下方式编译:

gcc prueba.c `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0` -o test

我只想在按下鼠标按钮(单击但未释放)时打印一条消息。这可以通过修改此代码来实现吗? 目标是在当前窗口的任意位置按下鼠标右键并打印一条消息,直到释放该按钮。

【问题讨论】:

  • 请在您的问题中包含实现的输出。你得到的行为是什么,它与你想要的有什么不同?
  • 您是否在reference 中查找"button-press-event"?你的签名看起来不对。

标签: c gtk3


【解决方案1】:

我不知道你从哪里得到你的信号处理函数的声明。根据GTK manual应该看起来不一样

这是一些剥离示例,我使用“按下”和“释放”事件来指示按钮状态,并根据状态相应地处理“鼠标移动”事件。 为了您的目的,您可以添加打印功能和计时器。

static gboolean on_mouse_button_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
  if (event->button.button != 3) // right button
    return FALSE;

  if (event->button.type == GDK_BUTTON_PRESS)
  {
    if (!button_pressed)
    {
      button_pressed = TRUE;
      // Start timer
    }
  }
  else if (event->button.type == GDK_BUTTON_RELEASE)
  {
    if (button_pressed)
    {
      button_pressed = FALSE;
      // Stop timer
    }
  }

  return TRUE;
}

...
  g_signal_connect(G_OBJECT(widget), "button-press-event", G_CALLBACK(on_mouse_button_event), NULL);
  g_signal_connect(G_OBJECT(widget), "button-release-event", G_CALLBACK(on_mouse_button_event), NULL);

【讨论】:

  • 谢谢,终于找到解决办法了。
猜你喜欢
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
相关资源
最近更新 更多