如何在GTK+中检测鼠标点击图像?

问题描述 投票:0回答:3

我正在使用 gtk+ 2.0 开发一个 C 项目。

我必须检查用户是否在图像上按下了左键单击。我想在按下左键时调用一个函数并获取鼠标的位置,但我该怎么做呢?

c gtk mouse
3个回答
5
投票

我希望我可以假设您知道如何将事件连接到小部件,但如果不知道:这是我之前的答案,演示了如何做到这一点。

g_signal_connect 用于单击鼠标右键?

如您所见,事件作为

GdkEventButton *
传递(从现在开始为
event
)。该结构体具有您要查找的成员字段:
event->x
event->y
都是
gdouble
字段。

无论如何,@unwind 是对的。正如 GTK 文档明确指出的那样:

GtkImage 是一个“无窗口”小部件(没有自己的 GdkWindow),因此默认情况下不接收事件。如果您想接收图像上的事件,例如按钮单击,请将图像放置在 GtkEventBox 中,然后连接到事件框上的事件信号。

顺便说一句,

GtkImage
并不是唯一的“无窗口”小部件。例如,如果您想处理标签上的点击,则
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;
}

3
投票

问题是用于在 GTK+ 中显示图像的 GtkImage 小部件不会生成事件。

它是一个“nowindow”小部件,这意味着它是一个被动容器,用于显示信息而不是与用户交互。

您可以通过将图像包装在 GtkEventBox 中来解决此问题,这将添加事件支持。


-1
投票

在 GTK 中,您可以使用 button-pressed-event gtk 小部件来执行此操作

在纯 c 语言中,来自 编程简化

#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;
}
© www.soinside.com 2019 - 2024. All rights reserved.