nukes 发表于 2011-8-23 21:06:46

列表视图调用另一个视图不成功

我用一个列表视图调用另一个视图就是没有变化,搞两个星期了。本人很菜,有高人指点下:

我先这样写:
#include <rtthread.h>
#include <rtgui.h>
#include <list_view.h>
#include <rtgui_server.h>
#include <rtgui_system.h>
#include <workbench.h>

static struct rtgui_view* view;
static struct rtgui_view* drawpad_view;
static struct rtgui_list_view* function_view;
static struct rtgui_workbench* workbench;


static void workbench_info_ui(void* parameter)
{
rt_mq_t mq;

/* 创建GUI应用需要的消息队列 */
mq = rt_mq_create("wmq1", 256, 4, RT_IPC_FLAG_FIFO);
/* 注_册当前线程为GUI线程 */
rtgui_thread_register(rt_thread_self(), mq);
/* 创建一个工作台 */
workbench = rtgui_workbench_create("info", "workbench #1");
if(workbench == RT_NULL) return;

/* 创建一个视图 */
view = rtgui_view_create("view1");
if(view == RT_NULL) return;
/* 指定视图的背景色 */
RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(view)) = light_grey;

/* 在工作台上添加一个视图 */
rtgui_workbench_add_view(workbench, view);
/* 非模式方式显示视图 */
rtgui_view_show(view, RT_FALSE);
/* 执行工作台事件循环 */
rtgui_workbench_event_loop(workbench);
/* 去注_册GUI线程 */
rtgui_thread_deregister(rt_thread_self());
/* delete message queue */
rt_mq_delete(mq);
}


void function_sketchpad(struct rtgui_widget* widget, void* paramter)
{
rtgui_workbench_remove_view(workbench, RTGUI_VIEW(function_view));
rtgui_view_destroy(RTGUI_VIEW(function_view));
function_view = RT_NULL;

    drawpad_view = rtgui_view_create("sketchpad_view");
    /* 指定视图的背景色 */
    RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(drawpad_view)) = black;

    RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(drawpad_view)) = white ;
    /* this view can be focused */
    RTGUI_WIDGET(drawpad_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;

    /* 添加到父workbench中 */
    rtgui_workbench_add_view(workbench, drawpad_view);
    /* 非模式方式显示视图 */
    rtgui_view_show(drawpad_view, RT_FALSE);
}

void function_action(void* parameter)
{
return;
}

static const struct rtgui_list_item function_list[] =
{
{"列表1", RT_NULL, function_action, RT_NULL},
{"列表2", RT_NULL, function_sketchpad, RT_NULL},
{"列表3", RT_NULL, function_action, RT_NULL},
{"列表4", RT_NULL, function_action, RT_NULL},
{"列表5", RT_NULL, function_action, RT_NULL},
{"列表6", RT_NULL, function_action, RT_NULL},
};

static void workbench_main_ui(void* parameter)
{
rt_mq_t mq;
rtgui_rect_t rect;

/* 创建GUI应用需要的消息队列 */
mq = rt_mq_create("wmq2", 256, 4, RT_IPC_FLAG_FIFO);
/* 注_册当前线程为GUI线程 */
rtgui_thread_register(rt_thread_self(), mq);

/* 创建一个工作台 */
workbench = rtgui_workbench_create("main", "workbench #2");
if(workbench == RT_NULL) return;

/* add function view */
rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect);
/* 创建一个例表视图 */
function_view = rtgui_list_view_create(function_list, 6, &rect, RTGUI_LIST_VIEW_LIST);
/* 指定视图的背景色 */
RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(function_view)) = white;

/* 在工作台上添加一个视图 */
rtgui_workbench_add_view(workbench, RTGUI_VIEW(function_view));
/* 非模式方式显示视图 */
rtgui_view_show(RTGUI_VIEW(function_view), RT_FALSE);
/* 执行工作台事件循环 */
rtgui_workbench_event_loop(workbench);
/* 去注_册GUI线程 */
rtgui_thread_deregister(rt_thread_self());
/* delete message queue */
rt_mq_delete(mq);
}


/* 初始化两个workbench,分别位于info,panel2和panel3 */
void workbench_init()
{
rt_thread_t info_tid, main_tid;

info_tid = rt_thread_create("wb1", workbench_info_ui, RT_NULL, 1024, 20, 5);
if(info_tid != RT_NULL) rt_thread_startup(info_tid);

main_tid = rt_thread_create("wb2", workbench_main_ui, RT_NULL, 1024, 20, 5);
if(main_tid != RT_NULL) rt_thread_startup(main_tid);
}

extern void rt_hw_lcd_init(void);

void rtgui_init(void *p)
{
rtgui_rect_t rect;

/* 初始化RT-Thread/GUI server */
rtgui_system_server_init();

/* 注_册面板1 */
rect.x1 = 0;
rect.y1 = 0;
rect.x2 = 240;
rect.y2 = 24;
/* 注_册区域, 名字,以及位置 */
rtgui_panel_register("info", &rect);

/* 注_册面板2 */
rect.x1 = 0;
rect.y1 = 24;
rect.x2 = 240;
rect.y2 = 320;
/* 注_册区域, 名字,以及位置 */
rtgui_panel_register("main", &rect);
rtgui_panel_set_default_focused("main");

/* 初始化LCD驱动 */
rt_hw_lcd_init();

/* 初始化workbench应用 */
workbench_init();
}


/*@}*/

这是key:
#include "stm32f10x.h"
#include <rtthread.h>
#include <event.h>
#include <rtgui_server.h>

#define key_down_GETVALUE()   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define key_up_GETVALUE()   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
#define key_enter_GETVALUE() GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)

static void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
}

static void key_thread_entry(void *parameter)
{
    rt_time_t next_delay;
    struct rtgui_event_kbd kbd_event;
    GPIO_Configuration();

    /* init keyboard event */
    RTGUI_EVENT_KBD_INIT(&kbd_event);
    kbd_event.mod= RTGUI_KMOD_NONE;
    kbd_event.unicode = 0;

    while (1)
    {
      next_delay = RT_TICK_PER_SECOND/10;
      kbd_event.key = RTGUIK_UNKNOWN;
      kbd_event.type = RTGUI_KEYDOWN;

      if(key_down_GETVALUE() == 0)
      {
            kbd_event.key= RTGUIK_DOWN;
      }

      if ( key_up_GETVALUE() == 0 )
      {
             kbd_event.key = RTGUIK_UP;
      }

    if(key_enter_GETVALUE() == 0)
    {
      kbd_event.key = RTGUIK_KP_ENTER;
    }

      if (kbd_event.key != RTGUIK_UNKNOWN)
      {
            /* post down event */
            rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));

            //next_delay = RT_TICK_PER_SECOND/10;
            /* delay to post up event */
            rt_thread_delay(next_delay);

            /* post up event */
            kbd_event.type = RTGUI_KEYUP;
            rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));
      }

      /* wait next key press */
      rt_thread_delay(next_delay);
    }
}

static rt_thread_t key_tid;
void rt_hw_key_init(void)
{
key_tid = rt_thread_create("key", key_thread_entry, RT_NULL, 384, 30, 5);
if(key_tid != RT_NULL) rt_thread_startup(key_tid);
}

/*@}*/

第一个页面出来了,且按上下按键能够上下移动。但按回车键,页面不变。

改成(列表内容与之对应)
void function_sketchpad1(struct rtgui_widget* widget, void* paramter)
{
rt_kprintf("列表1\n");
}

void function_sketchpad2(struct rtgui_widget* widget, void* paramter)
{
rt_kprintf("列表2\n");
}
、、、、、、
按下回车键串口无输出!有高人指点下呗,多谢

ffxz 发表于 2011-8-24 07:48:23

void function_action(void* parameter)
{
return;
}

这个函数的入口参数是错的;

我这边能够更改,可以显示出(为了显示清晰,我加了个label):
http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_670586UI0BFS.jpg
(原文件名:change_view.jpg)

xuzhenglim 发表于 2012-2-12 21:27:02

mark
页: [1]
查看完整版本: 列表视图调用另一个视图不成功