星期四, 5月 07, 2009

[C/C++]GtkDrawingArea 與 gtk_widget_set_events()

GtkDrawingArea 預設是不收 button_press_event 跟 key_press_event 的,所以要使用 gtk_widget_set_events() 告訴 GtkDrawingArea 要接收才行。

這個,我是去 Google Code Search 找來的,雖然 devhelp 可以查指令,但沒有範例,還是很難猜到怎麼用。


#include <gdk/gdkkeysyms.h> // 定義按鍵值的 header

static gboolean press_event( GtkWidget* widget, GdkEventButton* event, gpointer data )
{
if( debug )
g_print("press_event: x=%f y=%f button=%d\n", event->x, event->y, event->button );

if( event->button==1 ) { // left
}
}

static gboolean key_event( GtkWidget* widget, GdkEventKey* event )
{
if( debug )
g_print( "event->keyval=%d event->state=%d\n", event->keyval, event->state );
switch (event->keyval) {
// 省略...
}
return TRUE;
}

int main( int argc, char* argv[] )
{
// 省略一萬行...
g_signal_connect( drawing_area, "button_press_event", G_CALLBACK( press_event ), NULL );
g_signal_connect( drawing_area, "key_press_event", G_CALLBACK( key_event ), NULL );

// 要接收 button_press_event 跟 key_press_event 喔~
gtk_widget_set_events( drawing_area, gtk_widget_get_events(drawing_area) | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK );
// 省略兩萬行...
}

沒有留言: