Я разрабатываю в C графический пользовательский интерфейс GTK, состоящий из главного окна, в которое встроен виджет GtkImage.
Я не могу получить правильные координаты указателя мыши относительно виджета GtkImage внутри обработчика события щелчка при нажатии на мой виджет GtkImage.
Я пробовал оба решения по ссылке ниже, но ни одно из них не работает:
Как найти абсолютную позицию виджета GTK в окне?
Смотрите ниже мой код:
static void activate(GtkApplication *app, gpointer user_data)
{
GtkWidget *window;
GtkWidget *grid;
id.rows = ROWS;
id.cols = COLS;
id.stride = COLS * BYTES_PER_PIXEL;
id.stride += (4 - id.stride % 4) % 4; // ensure multiple of 4
// Allocate a bitmap
guchar *pixels = (guchar *)calloc(ROWS * id.stride, 1);
// Create a GDK Pix buffer from a pre-allocated pixel array
GdkPixbuf *pixelBuf = gdk_pixbuf_new_from_data(pixels,
GDK_COLORSPACE_RGB, // colorspace
0, // has_alpha
8, // bits-per-sample
COLS, ROWS, // cols, rows
id.stride, // rowstride
free_pixels, // destroy_fn
NULL // destroy_fn_data
);
// Create theGtkImage widget
GtkImage *image = GTK_IMAGE(gtk_image_new_from_pixbuf(pixelBuf));;
// Create the main win
window = gtk_application_window_new(app);
// Create a grid to automatically place the child widgets
grid = gtk_grid_new();
// Stick this grid to the main window
gtk_container_add(GTK_CONTAINER(window), grid);
// Create an event box to catch mouse event
GtkWidget *event_box = gtk_event_box_new();
// gtk image does'nt handle events, => attach it the event box
gtk_container_add(GTK_CONTAINER(event_box), GTK_WIDGET(image));
// Insert the event box into the grid
gtk_grid_attach(GTK_GRID(grid), GTK_WIDGET(event_box), 0, 0, 1, 1);
// Connect mouse event to the event box
g_signal_connect(GTK_WIDGET(event_box), "button-press-event", G_CALLBACK(on_mouse_press),
pixValEntry);
// LEt's start the show !
gtk_widget_show_all(window);
}
static gboolean on_mouse_press(GtkWidget *widget, GdkEvent *event,
gpointer user_data)
{
GdkEventButton *mouse_click = (GdkEventButton *)event;
char str[20];
(void)widget;
(void)user_data;
cout << gtk_widget_get_name(widget) << endl;
if (mouse_click->type == GDK_BUTTON_PRESS)
{
cout << "mouse_click->x = " << mouse_click->x << endl;
cout << "mouse_click->y = " << mouse_click->y << endl;
}
}
(x, y) координаты, отображаемые в обработчике событий щелчка мыши, смещены и зависят от размера основного окна.
Я не нахожу способ перейти от реальной системы координат к системе координат GtkImage.
Большое спасибо за вашу помощь и советы.
Приветствия