Как получить положение указателя мыши относительно GtkImage - PullRequest
0 голосов
/ 22 марта 2019

Я разрабатываю в 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.

Большое спасибо за вашу помощь и советы.

Приветствия

...