2014-06-24 61 views
3

我正在使用gtk + 2.0在C中進行一個項目。使用gtk獲取鼠標在C中的位置?

我必須檢查用戶是否按下了左鍵單擊圖像。我想在按下左鍵單擊時調用一個函數,並獲取鼠標的位置,但我該怎麼做?

+0

答案編輯... –

回答

2

的問題是,它是用來顯示圖像中的GTK +沒有的GtkImage widget生成事件。

這是一個「nowindow」小部件,這意味着它是一個被動容器,用於顯示信息並且不與用戶交互。

您可以通過將圖像包裝在GtkEventBox中來修復該問題,該功能將添加事件支持。

-1

在GTK可以使用button-pressed-event GTK控件做到這一點

純C,從Programming Simplified

#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; 
} 
+4

沒有什麼「純」關於C.我不明白爲什麼它包括在約GTK問題+ 。 – unwind

2

我希望我可以假設你知道如何將一個事件連接到一個小部件,但如果沒有:這是我的以前的答案,演示如何做到這一點。

g_signal_connect for right mouse click?

正如你可以看到有該事件爲通過一項GdkEventButton *event從現在起)。此結構具有後面的成員字段:event->xevent->y都是gdouble字段。

無論如何,@unwind是正確的。正如GTK文檔所述:

GtkImage是一個「無窗口」小部件(沒有自己的GdkWindow),因此默認情況下不會接收事件。如果您想要接收圖像上的事件(如按鈕單擊),請將圖像放入GtkEventBox中,然後連接到事件框上的事件信號。

GtkImage不是唯一「窗戶」部件,BTW。例如,GtkLabel需要類似的方法才能處理對標籤的點擊。無論如何:More info here
手冊頁然後繼續完整的代碼示例如何處理點擊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; 
}