获取指针绝对坐标和窗口内的相对坐标
方法一:直接调用函数获得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int ax, ay; /* absolutely postition*/ int wx, wy; /* The absolutely position of the left up corner of window*/ int rx, ry; /* The position of the pointer relative to the left up corner of window*/ GdkDisplay *display = gdk_display_get_default (); GdkSeat *device_manager = gdk_display_get_default_seat (display); GdkDevice *device = gdk_seat_get_pointer (device_manager); /*获取指针在屏幕上的绝对坐标*/ gdk_device_get_position (device, NULL, &ax, &ay); /*获取窗口左上角在屏幕上的绝对坐标*/ gdk_window_get_position ( gtk_widget_get_window(window), &wx, &wy ); rx = ax - wx; /*通过计算获取指针相对于窗口的坐标rx*/ ry = ay - wy; /*通过计算获取指针相对于窗口的坐标ry*/ |
详情见注释,注意window变量来自 Gtkwidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 代码中没有给出
方法二: 注册回调函数获得
1 2 3 4 |
/*主函数内*/ g_signal_connect(window, "motion-notify-event", G_CALLBACK(deal_motion_notify_event), NULL); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/*回调函数*/ gboolean deal_motion_notify_event ( GtkWidget *widget, GdkEventMotion *event, gpointer *data) { int wx, wy; /* The absolutely position of the left up corner of window*/ int rx, ry; /* The position of the pointer relative to the left up corner of window*/ gdk_window_get_position ( gtk_widget_get_window(window), &wx, &wy ); rx = (int)event->x_root - wx; ry = (int)event->y_root - wy; } |
其中 event->x_root ,event->y_root 就是指针在屏幕上的绝对坐标,wx,wy同方法一,为窗口左上角的坐标值,二者作差即可得指针在窗口内的坐标(相对于窗口左上角的坐标值)。
注意window变量来自 Gtkwidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 代码中没有给出,请自行想办法传递进去
其中主函数内监听的信号该从GTK文档中何处寻找呢?
首先我们用 gtk_window_new 新建了一个窗口,窗口类型由 GtkWidget * 声明,所以所有需要用到的信号应从 GtkWidget 中去寻找,点开链接后,下拉至 Signals,下面指示的所有信号都是 Gtkwidget 可以监听的,如下:
Signals
void accel-closures-changed gboolean button-press-event Run Last gboolean button-release-event Run Last gboolean can-activate-accel Run Last void child-notify No Hooks void composited-changed Action gboolean configure-event Run Last gboolean damage-event Run Last …
最左侧是回调函数的返回类型,中间的为监听的信号名称,点击监听名称,可跳转至回调函数的原型示例,包含内部参数应是什么类型等内容。