Mx没有文档,但是NBTK有,我们可以使用NBTK的文档,只要将nbtk都换成为mx就可以。

  先来看看button的使用,下面是一个使用的例子。我们在stage上创建两个clutter button,一个是toggle button,即点击后button的状态变成按下,在点击恢复,一个是普通的button(button1),鼠标移到上面可以浮现解析。button的触发信号,有clicked和long press两种方式。long press比较特别。只要鼠标按下,就会触发long press,进入MX_LONG_PRESS_QUERY状态,即进入询问是否是long press,如果不是,很快释放按键,则触发第二次long press,为MX_LONG_PRESS_CANCEL,如果确实是长按键,也将出发第二次,即MX_LONG_PRESS_ACTION。所以一次按键,将会触发两次long press。clicked是button的常用触发方式,在释放鼠标时触发。

  可以让button同时检测这两种信号。

  在NBTK的文档中,NbtkWidget是继承ClutterActor,而NbtkButton是继承NbtkWidget,所以MxButton应具备clutter所能呈现的动态效果。

#include <linux/string.h> 
#include <mx/mx.h> //mx的头文件 

static int click_num = 0;
 static MxButton * button , * button1;
 static MxComboBox *  comboBox;

//下面long press作触发的函数,请注意函数参数,在这里我们实验了long press的三种触发状态。 
gboolean button_long_press_cb (MxButton *b, gfloat x, gfloat y, MxLongPressAction action) 
 {
     printf("%s %s : Button <%s> was long pressed !/n",__TIME__,  __FUNCTION__,mx_button_get_label(b));
     printf("/t%f %f : ",x,y);
     switch(action){
     case MX_LONG_PRESS_QUERY  :
         printf("long_press query!/n");
         break;
     case MX_LONG_PRESS_ACTION  :
         printf(" it's a long press.../n");
         break;
     case MX_LONG_PRESS_CANCEL  :
         printf("No, it's not  a long press.../n");
         break;
     default:
         break;
     }

   return TRUE;
 }

//这是clicked的触发函数,同样请注意格式,当button1按下的时候,改变toggle按钮button的状态。 
void button1_clicked_func(MxButton * b, gpointer data)  {     //测试获取button名字函数 
     printf("%s %s : Button <%s> was clicked  !/n",__TIME__,  __FUNCTION__,mx_button_get_label  (b));
     //下面学习检查和设置toggle button是否按下的两个函数 
      mx_button_set_checked  !mx_button_get_checked ((MxButton *)button));
 }
 
//这是clicked的触发函数,当button按下的时候,每次按键触发不同的操作来许学习mx的函数。 
 void button_clicked_func(MxButton * button, gpointer data)
 {
     printf("%s %s : Button <%s> was clicked!/n",__TIME__,      __FUNCTION__,  mx_button_get_label(button));
     switch(++click_num){
     case 1: //学习设置button的名字 
         mx_  button_set_label  (button,"Hello,Moblin!");
         break;
     case 2: //实验clutter的动态效果能否加在button。 
         clutter_actor_animate(CLUTTER_ACTOR(button1), CLUTTER_EASE_OUT_BOUNCE,3000,  "x", 100.0, "y", 100.0,NULL);     
         break;
     case 3: //实验clutter的动态效果能否加在button。 
  clutter_actor_animate (CLUTTER_ACTOR(button1), CLUTTER_EASE_IN_SINE, 4000, "rotation-angle-y", 360.0, NULL); 
         break;
     default:
         printf("Toggle button is %s/n", mx_button_get_checked(button)?"checked":"unchecked");
         break;
     }
 }

 int main (int argc , char * argv[])
 {
     ClutterActor * stage;

     clutter_init(&argc, & argv);
     stage = clutter_stage_get_default();
     button =    mx_  button_new_with_label  ("Hello World!"); //创建button 
     clutter_container_add_actor(CLUTTER_CONTAINER(stage), CLUTTER_ACTOR(button));

     button1 = (MxButton *) mx_button_new_with_label("你好,朋友!"); 
     clutter_container_add_actor(CLUTTER_CONTAINER(stage), CLUTTER_ACTOR(button1));
     clutter_actor_set_position(CLUTTER_ACTOR(button1), 150, 0);
    mx_button_set_toggle_mode (button,TRUE); //将button设置为toggle button 
     mx_widget_set_tooltip_text ((MxWidget *) button1, "改变Hello,Moblin的check状态"); //设置提示信息 

     g_signal_connect(button,"clicked   ",G_CALLBACK(button_clicked_func),NULL);
     g_signal_connect(button1,"clicked  ",G_CALLBACK(button1_clicked_func),NULL);
     g_signal_connect(button,"long-press  ",G_CALLBACK(button_long_press_cb),NULL);
     g_signal_connect(button1,"long-press   ",G_CALLBACK(button_long_press_cb),NULL);     clutter_actor_show(stage);
     clutter_main();
     return 0;
 }