Как обнаружить щелчок мыши по изображению в GTK+?
Я работаю над проектом на языке Си, используя gtk+ 2.0.
Я должен проверить, нажал ли пользователь на изображение левой кнопкой мыши. Я думал вызвать функцию при нажатии левой кнопки мыши и получить положение мыши, но как я могу это сделать?
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; }