在C中获取GTK4中用户鼠标指针的坐标

问题描述 投票:0回答:1

我正在构建一个应用程序,在某些时候需要知道用户指针的位置。我正在使用 GTK4 和 C。

  1. 我找到了这个答案(How to use gdk_device_get_position()?)它指向函数
    gdk_device_get_position
    ,但我在GTK4文档中找不到它,表明它不再受支持。如果我缺少一些同等的东西,我很想知道。
  2. 采取另一种策略,我已经成功地为相关小部件实现了事件控制器,因此:
GtkEventController *my_controller = gtk_event_controller_motion_new ();
gtk_widget_add_controller (my_widget, my_controller);
g_signal_connect(my_controller, "motion", my_function, NULL);

当我将鼠标移动到小部件内时,它会成功触发并运行

my_function
。阅读下面的运动信号签名 (https://docs.gtk.org/gtk4/signal.EventControllerMotion.motion.html),它似乎应该宣布 x 和 y 坐标。可以这么说,我如何“理解”这些?

void
motion (
  GtkEventControllerMotion* self,
  gdouble x,
  gdouble y,
  gpointer user_data
)

抱歉,如果我遗漏了一些明显的东西!如果我没有完成我的文档/SO 尽职调查,就不会问。

谢谢!

c gtk gtk4
1个回答
0
投票

主题曾经出现在以下问题上:如何在gtk4中的鼠标移动事件上旋转开罗圆圈(音量按钮)?

以下是解决方法的总结:



#include"mous-coordin.h"

void pointer_motion_event (GtkEventController *gesture,
                           gdouble x,
                           gdouble y,
                           gpointer user_data)
{
    g_print(" x = %f y = %f\n", x,y);
}

void click_event (GtkEventController *gesture,
                           gdouble x,
                           gdouble y,
                           gpointer user_data)

{
    g_print(" CLICK x = %f y = %f\n", x,y);
}

void end_event(GtkEventController *gesture,
                gdouble x,
                gdouble y,
                gpointer user_data)
{
    g_print(" RELEASE x = %f y = %f\n", x,y);

}

void activate (GtkApplication *app, gpointer data)
{
  GtkWidget *window;

  window =gtk_application_window_new(app);
  gtk_widget_set_size_request(window,150,150);
 
      GtkEventController *gesture_pos;
      gesture_pos = gtk_event_controller_motion_new ();
      gtk_widget_add_controller (window, (GtkEventController *)gesture_pos);
      gtk_event_controller_set_propagation_phase((GtkEventController  *)gesture_pos, GTK_PHASE_CAPTURE);
      g_signal_connect (gesture_pos, "motion", G_CALLBACK (pointer_motion_event), window);

    GtkGesture *gesture = gtk_gesture_click_new();
    gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 0);
    gtk_widget_add_controller(window,(GTK_EVENT_CONTROLLER(gesture)));
    g_signal_connect (gesture, "pressed", G_CALLBACK (click_event), NULL);
    g_signal_connect (gesture,"released",G_CALLBACK(end_event),NULL);

 gtk_widget_set_visible(window,TRUE);
}

祝你编程愉快。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.