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 ((MxButton * )button, !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;
}
相关链接:我的Clutter相关博客