1. 程式人生 > >GTK進階學習:滑鼠事件

GTK進階學習:滑鼠事件

滑鼠事件,可以理解為操作滑鼠的動作。對於視窗而言,使用者操作滑鼠,視窗檢測到滑鼠的操作( 產生一個訊號 ),然後去做相應處理( 呼叫其規定的回撥函式 ),即可認為是滑鼠事件,還是訊號與回撥函式的知識點。

視窗預設不接收滑鼠的操作,需要手動新增讓其接收。

設定控制元件捕獲(接收)相應的事件:

void gtk_widget_add_events( GtkWidget *widget, gint events );

widget:控制元件

events:事件型別,它是GdkEventMask的列舉常量,取值列舉如下

GDK_BUTTON_PRESS_MASK:滑鼠點選

GDK_BUTTON_RELEASE_MASK:滑鼠釋放

GDK_BUTTON_MOTION_MASK:滑鼠移動

GDK_KEY_PRESS_MASK:鍵盤按下

GDK_ENTER_NOTIFY_MASK:進入控制元件區域

…… ……

滑鼠點選事件產生的訊號:button-press-event

滑鼠釋放事件產生的訊號:button-release-event

其回撥函式的定義如下:

gboolean callback( GtkWidget *widget, GdkEventButton *event, gpointer data )

{

event:鼠鍵事件結構體變數,系統內部的變數,不是使用者傳參的

event->x,event->y:得到點選座標值

event->button:滑鼠哪個鍵按下

event->type:        是否雙擊

返回值:沒有太大意義

}

滑鼠移動事件產生的訊號:motion-notify-event

其回撥函式的定義如下:

gboolean callback( GtkWidget *widget, GdkEventMotion *event, gpointer data )

{

event->x,event->y:得到移動的座標值

}

注意:可以在 GtkWidget 裡找到相應的事件訊號,回撥函式如何定義應該檢視幫助文件。

下面的例子為點選滑鼠能獲取點選的座標,同時能判定哪個鍵按下,移動滑鼠也能獲取其座標:

#include <gtk/gtk.h>	// 標頭檔案

// 滑鼠點選事件處理函式
gboolean deal_mouse_press(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
	switch(event->button){	// 判斷滑鼠點選的型別
		case 1:
			printf("Left Button!!\n");
			break;
		case 2:
			printf("Middle Button!!\n");
			break;
		case 3:
			printf("Right Button!!\n");
			break;
		default:
			printf("Unknown Button!!\n");
	}

	if(event->type == GDK_2BUTTON_PRESS){
		printf("double click\n");
	}

	// 獲得點選的座標值,距離視窗左頂點
	gint i = event->x;
	gint j = event->y;
	printf("press_x = %d, press_y = %d\n", i, j);

	return TRUE;
}

// 滑鼠移動事件(點選滑鼠任何鍵)的處理函式
gboolean deal_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
{
	// 獲得移動滑鼠的座標值,距離視窗左頂點
	gint i = event->x;
	gint j = event->y;
	printf("motion_x = %d, motion_y = %d\n", i, j);
	
	return TRUE;
}

int main( int argc,char *argv[] )
{
	gtk_init(&argc, &argv);		// 初始化
	
	// 建立頂層視窗
	GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	// 設定視窗的標題
	gtk_window_set_title(GTK_WINDOW(window), "mouse_event");
	// 設定視窗在顯示器中的位置為居中
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	// 設定視窗的最小大小
	gtk_widget_set_size_request(window, 400, 300);
	// "destroy" 和 gtk_main_quit 連線
	g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

	// 視窗接收滑鼠事件
	// GDK_BUTTON_PRESS_MASK:滑鼠點選事件
	// GDK_BUTTON_MOTION_MASK:按住滑鼠移動事件
	gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_MOTION_MASK);

	// "button-press-event" 與 deal_mouse_event 連線,滑鼠點選事件
	g_signal_connect(window, "button-press-event", G_CALLBACK(deal_mouse_press), NULL);
	// "motion-notify-event" 與 deal_motion_notify_event 連線,按住滑鼠移動事件
	g_signal_connect(window, "motion-notify-event", G_CALLBACK(deal_motion_notify_event), NULL);

	gtk_widget_show_all(window);	// 顯示視窗全部控制元件

	gtk_main();		// 主事件迴圈
	
    return 0;
}
原始碼下載請點此處。