Как обнаружить щелчок мыши по изображению в GTK+?


Я работаю над проектом на языке Си, используя gtk+ 2.0.

Я должен проверить, нажал ли пользователь на изображение левой кнопкой мыши. Я думал вызвать функцию при нажатии левой кнопки мыши и получить положение мыши, но как я могу это сделать?

3 3
gtk

3 ответа:

Проблема заключается в том, что виджетGtkImage , который используется для отображения изображения в GTK+, не генерирует события.

Это виджет "nowindow", то есть это пассивный контейнер, который используется для отображения информации, а не для взаимодействия с пользователем.

Вы можете исправить это, обернув изображение вGtkEventBox , который добавит поддержку событий.

Я надеюсь, что могу предположить, что вы знаете, как подключить событие к виджету, но если нет: вот мой предыдущий ответ, который демонстрирует, как это сделать.

G_signal_connect для щелчка правой кнопкой мыши?

Как вы можете видеть, событие передается как GdkEventButton * (event с этого момента). Эта структура имеет поля-члены, которые вы ищете: event->x и event->y оба являются полями gdouble.

В любом случае, @unwind прав. Как ясно сказано в документах GTK:

GtkImage является виджетом" no window " (не имеет собственного GdkWindow), поэтому по умолчанию не получает события. Если вы хотите получать события на изображении, такие как щелчки кнопок, поместите изображение в GtkEventBox,а затем подключитесь к сигналам событий в окне событий.

GtkImage это не единственный "windowless" виджет, кстати. GtkLabel, например, требуется аналогичный подход, если вы хотите обрабатывать клики по метке. Так или иначе: Подробнее здесь.
Затем человек-страница продолжает: полный пример кода о том, как обрабатывать клики на виджете GtkImage. Просто найдите заголовок " обработка событий нажатия кнопок на GtkImage." для полного объяснения, но вот код на случай разрыва связи:

static gboolean
button_press_callback (GtkWidget      *event_box,
                       GdkEventButton *event,
                       gpointer        data)
{
    g_print ("Event box clicked at coordinates %f,%f\n",
         event->x, event->y);

    // Returning TRUE means we handled the event, so the signal
    // emission should be stopped (don’t call any further callbacks
    // that may be connected). Return FALSE to continue invoking callbacks.
    return TRUE;
}

static GtkWidget*
create_image (void)
{
    GtkWidget *image;
    GtkWidget *event_box;

    image = gtk_image_new_from_file ("myfile.png");

    event_box = gtk_event_box_new ();

    gtk_container_add (GTK_CONTAINER (event_box), image);

    g_signal_connect (G_OBJECT (event_box),
                  "button_press_event",
                  G_CALLBACK (button_press_callback),
                  image);

    return image;
}

В GTK вы можете использовать виджет кнопка-нажата-событие gtk для этого

В чистом языке Си, из упрощенного программирования

#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<dos.h>

int initmouse();
void showmouseptr();
void hidemouseptr();
void getmousepos(int*,int*,int*);

union REGS i, o;

main()
{
   int gd = DETECT, gm, status, button, x, y, tempx, tempy;
   char array[50];

   initgraph(&gd,&gm,"C:\\TC\\BGI");
   settextstyle(DEFAULT_FONT,0,2);

   status = initmouse();

   if ( status == 0 )
      printf("Mouse support not available.\n");
   else
   {
      showmouseptr();

      getmousepos(&button,&x,&y);

      tempx = x;
      tempy = y;

      while(!kbhit())
      {
         getmousepos(&button,&x,&y);

         if( x == tempx && y == tempy )
         {}
         else
         {
            cleardevice();
            sprintf(array,"X = %d, Y = %d",x,y);
            outtext(array);
            tempx = x;
            tempy = y;
         }
      }
   }

   getch();
   return 0;
}

int initmouse()
{
   i.x.ax = 0;
   int86(0X33,&i,&o);
   return ( o.x.ax );
}

void showmouseptr()
{
   i.x.ax = 1;
   int86(0X33,&i,&o);
}

void getmousepos(int *button, int *x, int *y)
{
   i.x.ax = 3;
   int86(0X33,&i,&o);

   *button = o.x.bx;
   *x = o.x.cx;
   *y = o.x.dx;
}